贪吃蛇实验jerry

合集下载

实验报告贪吃蛇

实验报告贪吃蛇

一、实验目的1. 掌握Python编程语言的基本语法和面向对象编程思想;2. 理解并实现贪吃蛇游戏的基本算法和流程;3. 学会使用Pygame库进行图形界面设计;4. 提高编程实践能力和团队协作能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm4. 图形库:Pygame三、实验内容1. 游戏界面设计2. 游戏逻辑实现3. 游戏控制实现4. 游戏测试与优化四、实验步骤1. 游戏界面设计(1)初始化Pygame库```pythonimport pygame```(2)设置游戏窗口```pythonscreen = pygame.display.set_mode((640, 480))pygame.display.set_caption("贪吃蛇游戏")```(3)设置游戏背景颜色```pythonscreen.fill((0, 0, 0))```2. 游戏逻辑实现(1)定义蛇类```pythonclass Snake:def __init__(self, x, y, width, height, color):self.x = xself.y = yself.width = widthself.height = heightself.color = colorself.x_change = 0self.y_change = 0def draw(self, surface):pygame.draw.rect(surface, self.color, (self.x, self.y, self.width, self.height))```(2)定义食物类```pythonclass Food:def __init__(self, x, y, width, height, color):self.x = xself.y = yself.width = widthself.height = heightself.color = colordef draw(self, surface):pygame.draw.rect(surface, self.color, (self.x, self.y, self.width, self.height))```(3)定义游戏主函数```pythondef game():clock = pygame.time.Clock()snake = Snake(50, 50, 10, 10, (0, 255, 0))food = Food(300, 300, 10, 10, (255, 0, 0))game_over = Falsewhile not game_over:for event in pygame.event.get():if event.type == pygame.QUIT:game_over = Trueelif event.type == pygame.KEYDOWN:if event.key == pygame.K_LEFT:snake.x_change = -10snake.y_change = 0elif event.key == pygame.K_RIGHT:snake.x_change = 10snake.y_change = 0elif event.key == pygame.K_UP:snake.x_change = 0snake.y_change = -10elif event.key == pygame.K_DOWN:snake.x_change = 0snake.y_change = 10snake.x += snake.x_changesnake.y += snake.y_changescreen.fill((0, 0, 0))snake.draw(screen)food.draw(screen)pygame.display.flip()clock.tick(15)pygame.quit()```3. 游戏控制实现在游戏主函数中,通过监听键盘事件来控制蛇的移动方向。

贪吃蛇实训报告模板

贪吃蛇实训报告模板

贪吃蛇实训报告模板1. 概述本报告旨在总结本次贪吃蛇实训的学习内容、实践经验,以及对于贪吃蛇游戏开发的理解和思考,为未来的实践学习提供参考和借鉴。

2. 前置知识在进行贪吃蛇实训前,推荐学生应具备以下基本前置知识:•编程语言基础:如C++、Java等。

•数据结构:如数组、链表、队列、栈等。

•基本算法:如排序算法、查找算法等。

3. 学习内容在本次贪吃蛇实训中,我们主要学习了以下内容:1.实现基本的贪吃蛇游戏逻辑:包括贪吃蛇的移动、食物的生成、得分统计等。

2.优化游戏体验:包括界面美化、音效、计时器等。

3.处理游戏特殊情况:如蛇碰到墙壁、自身等。

我们在实践中还遇到了以下问题:1.蛇的移动:如何保证蛇能够顺利移动并避免出现卡顿现象。

2.食物的生成:如何让食物能够随机生成且不与蛇重合。

3.得分统计:如何实现得分统计功能并将得分存入文件中。

通过解决这些问题,我们不仅实现了基本的贪吃蛇游戏功能,还使游戏更加智能化、丰富化。

4. 实践经验在进行贪吃蛇实践时,我们总结了以下实践经验:1.良好的代码规范:良好的代码规范对于功能实现和代码可读性的提高有着至关重要的意义。

比如,可以采用模块化编程,减少重复代码等。

2.良好的注释习惯:良好的注释习惯能够帮助程序员快速理解代码逻辑、减少代码修改和维护的困难度。

3.利用GitHub等代码分享平台:通过GitHub等代码分享平台,开源自己的代码,不仅可以让更多的人看到自己的成果,也可以接受更多人的意见和建议。

5. 游戏开发的思考在学习贪吃蛇游戏的过程中,我们不仅仅实现了一个简单的游戏,也思考了游戏开发的一些问题。

比如,游戏中的难度控制、人机交互等问题。

在游戏开发中,除了对于程序语言掌握以外,掌握这些问题也是非常必要的。

6. 总结本次贪吃蛇实训,我们不仅仅实现了贪吃蛇的基本功能,也通过实践和学习,提高了自己的编程水平和思考能力。

希望通过这次实践,能够启迪我们更好的编程思维和创造力,为未来的学习和工作打下坚实的基础。

(完整word版)贪吃蛇实验报告

(完整word版)贪吃蛇实验报告

《计算机程序设计》课程设计报告课题名称贪吃蛇游戏班级学号姓名指导教师设计时间至设计地点常熟理工学院计算机科学与工程学院常熟理工学院计算机科学与工程学院目录1需求解析 (1)2系统解析和设计 (1)数据构造的设计和选择的原因 (1)系统模块区分和模块构造 (2)流程图 (2)数据种类、全局变量和函数说明 (3)3程序测试和运转结果 (4)4课程报告小结 (5)分数重叠显示 (5)速度太快 (5)食品可能出此刻蛇身上 (5)附录 A :程序源代码 (6)《 C 程序设计》课程设计1 需求解析【论述课程设计应当达成的功能】使用键盘的上下左右,来控制蛇的运动方向,ESC 键退出,并显示得分。

2系统解析和设计2.1 数据构造的设计和选择的原因本游戏中波及的主要数据构造是怎样表示运动的蛇、食品状态等问题。

2.1.1 从游戏参照画面中我们能够看到,贪吃蛇的身体是一节节的,由一个个大小同样的方块构成,那么我们能够用一个 (x,y) 坐标为左上角的、固定宽度的正方形来表示一节蛇身。

为表示连续的多节身体,那么我们能够采纳数组(或链表,或线性表)等数据构造来表示。

下边以数组方式为例:struct Point {int x, y;}struct Point nodes[MAX_LENGTH];// 蛇身数组, MAX_LENGTH为最大蛇长贪吃蛇是在不停的运动的,我们研究蛇的运动能够发现这样的特色:1. 蛇头由键盘控制,键盘不操作时,保持原有方向运动;(用 int direction; 表示 )2.运动时,蛇身后边一节挪动到前面一节的地点。

当我们用 nodes[0]表示蛇头的时候, nodes[1] 运动到 nodes[0]处; nodes[2] 运动到 nodes[1]处 ...。

3. 吃到一个食品此后,蛇身会增添一节。

即该数组中的有效数据个数加一。

(用 int length;表示 )依据上边的状况,我们能够设计蛇的数据构造以下:struct Snake {struct Point nodes[MAX_LENGTH];// 蛇身数组,保留每节蛇身的坐标。

C#实验报告(贪吃蛇游戏)

C#实验报告(贪吃蛇游戏)

《C#程序设计及应用教程》课程设计报告设计题目贪吃蛇游戏专业2011级软件工程班级2011级软件工程姓名学号*********完成日期2013-06-24目录1. 问题描述………………………………………………2. 系统设计………………………………………………3. 数据结构与算法描述…………………………………4. 测试结果与分析………………………………………5. 总结…………………………………………………6. 参考文献………………………………………………附录程序源代码…………………………………………(报告正文部分):课程设计题目1. 问题描述我设计的的游戏首先在主界面选择游戏难度,接着进行游戏,在游戏过程中贪吃蛇不停地吃掉随机产生的食物,蛇身增长,直到蛇触碰到自己的身躯或边框,游戏结束特色:1.游戏可以自选难度,且蛇身长每增加2游戏可以储存游戏分数,你可以查看最高分3游戏过程中蛇的颜色,食物的颜色,分数的颜色,可以不停变换,增加视觉效果2. 系统设计2.1 设计目标C#课程设计是教学实践环节中一项重要内容,进行此课程设计旨在掌握基础知识的基础上,进一步加深对C#的理解和掌握;提高和加强学生的计算机应用及软件开发能力,使学生具备初级程序员的基本素质;培养学生独立分析问题、解决问题、查阅资料以及自学能力,以适应信息管理行业日新 2 月异的发展形势;本次课程设计是以学生独立思考解决问题为主,教师指导为辅,结合上机操作,完成指定的任务,做出设计报告。

2.2 设计思想程序关键在于表示蛇的图形及蛇的移动。

用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块。

移动时必须从蛇头开始,所以蛇不可以向相反的方向移动,如果不按任意键,蛇自行在当前方向右前移,但按下有效方向键后,蛇头朝该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后节用背景色覆盖。

贪吃蛇总结报告

贪吃蛇总结报告

贪吃蛇设计综合实验总结报告课程名称:程序设计实践选题名称:贪吃蛇小组长姓名:方娟 200911211056小组成员姓名:邹甜 200911211004杜家萱 200911211066任课老师:伊乾报告递交时间:2009.6.9一系统功能说明贪食蛇游戏是一个深受人们喜爱的游戏:一条蛇在密闭的围墙内,在围墙内出现食物,通过按键控制蛇向上下左右四个方向移动,蛇撞到食物,则食物被吃掉,蛇的身体增加一节。

如果蛇在移动的过程中,撞到墙壁或身体的交叉(蛇头撞到自己的身体)游戏结束。

现要求利用Turbo C2.0来实现该游戏。

功能要求如下:一、基本功能1.提供一个图形模式下的界面。

2.开始游戏:空格键或回车键;退出游戏:Esc键。

3.支持用键盘的方向键来控制蛇的移动,蛇可以向上、下、左、右四个方向移动。

4.当蛇头碰到食物时,食物被吃掉,蛇的身体增长一节。

5.初始场景内随即出现1个食物,当食物被吃掉时,再随机出现一个食物。

6.要有记分机制,没吃掉一个食物,增加相应的分数。

7.蛇碰到墙壁或是自己身体的一部分则游戏结束。

二、高级功能1.暂停功能:能随时通过按键来暂停游戏,再按一次则继续游戏。

2.速度调节功能:当分数达到某个值后,对蛇的移动速度进行一定的提升,但会有一个速度上限。

3.奖励机制:增加另一种的奖励食物,蛇吃到该种食物后蛇的身体减少一节(最短不能少于2节),但不增加分数。

该种食物的颜色要区别与普通食物的颜色。

奖励食物有时间限制,在一定时间内没有吃掉则会消失。

4.音效功能:在游戏开始、吃掉食物、撞墙、撞到自己时提供不同的音效。

二程序结构(2)重要数据说明基本思路:首先设计主界面,主界面是一个密封的围墙,并在屏幕最右面留一部分用来显示分数、计时等其他信息。

围墙直接画一个矩形来表示,四面围成密闭的矩形来作为围墙。

接着是初始化蛇与食物的位置并将他们用图形表示出来。

然后进行一个循环,将蛇按当前的方向移动,并处理键盘的方向按键信息,调整蛇的移动方向。

关于贪吃蛇的实训报告

关于贪吃蛇的实训报告

一、实训目的本次实训旨在通过C语言编程实现贪吃蛇游戏,巩固和加深对C语言程序设计的基本知识的理解和掌握,提高编程和程序调试的基本技能,并锻炼独立自主设计程序和编辑代码的能力。

通过设计贪吃蛇游戏,进一步理解和运用结构化程序设计的思想和方法,初步掌握开发一个小型实用系统的基本方法,学会调试一个较长程序的基本方法,以及掌握书写程序设计开发文档的能力。

二、实训内容1. 游戏规则贪吃蛇游戏的基本规则如下:- 蛇在游戏区域中上下左右移动,通过键盘方向键控制。

- 每次蛇头撞到食物,蛇身增长一节,同时计10分。

- 若蛇头撞到墙壁或自身,游戏结束。

- 游戏区域大小、蛇的初始长度、食物的生成方式等参数可调整。

2. 程序设计(1)数据结构- Food结构体:用于存储食物的位置信息,包括横坐标x、纵坐标y和是否生成食物的标志yes。

```cstruct Food {int x;int y;int yes;};```- Snake结构体:用于存储蛇的位置信息、长度、移动方向和生命状态。

```cstruct Snake {int x[N];int y[N];int node;int direction;int life;};```(2)功能模块- 初始化函数:初始化游戏区域、蛇的位置、长度、方向和生命状态,以及食物的位置信息。

- 键盘输入处理函数:获取键盘输入,控制蛇的移动方向。

- 食物生成函数:根据设定规则生成食物。

- 蛇移动函数:根据蛇的移动方向和速度,更新蛇的位置信息。

- 游戏判断函数:判断蛇是否吃到食物、撞到墙壁或自身,以及游戏是否结束。

- 界面绘制函数:绘制游戏区域、蛇和食物。

三、程序实现以下为部分关键代码示例:```c// 初始化函数void init() {// 初始化游戏区域、蛇的位置、长度、方向和生命状态,以及食物的位置信息}// 键盘输入处理函数void keyInput() {// 获取键盘输入,控制蛇的移动方向}// 食物生成函数void generateFood() {// 根据设定规则生成食物}// 蛇移动函数void moveSnake() {// 根据蛇的移动方向和速度,更新蛇的位置信息}// 游戏判断函数void judgeGame() {// 判断蛇是否吃到食物、撞到墙壁或自身,以及游戏是否结束}// 界面绘制函数void draw() {// 绘制游戏区域、蛇和食物}```四、实训心得与体会1. 编程能力提升:通过本次实训,我对C语言编程和程序设计有了更深入的理解,编程能力得到了显著提升。

贪吃蛇的实训报告

贪吃蛇的实训报告

一、实训目的本次实训旨在通过设计并实现贪吃蛇游戏,巩固和加深学生对C语言程序设计的基本知识,提高学生的编程能力和实际动手操作能力。

通过实训,使学生能够熟练掌握C语言编程技巧,理解程序设计的基本思想和流程,同时培养学生的团队协作和问题解决能力。

二、实训内容1. 游戏规则贪吃蛇是一款经典的电脑游戏,玩家通过键盘控制蛇在游戏区域中移动,吃掉随机出现的食物。

蛇在吃掉食物后,长度会增加,得分增加。

如果蛇头撞到墙壁或自己的身体,游戏结束。

2. 游戏界面游戏界面由一个矩形区域组成,代表游戏区域。

蛇用一系列方块表示,食物用不同的颜色表示。

游戏开始时,蛇的长度为3,随机生成食物。

游戏过程中,蛇会根据玩家的输入移动。

3. 游戏逻辑(1)初始化:设置游戏区域大小、蛇的初始位置和方向、食物的初始位置等。

(2)游戏循环:不断检测玩家输入,更新蛇的位置,判断蛇是否吃到食物、撞到墙壁或自己的身体。

(3)游戏结束:当蛇撞到墙壁或自己的身体时,游戏结束。

4. 程序设计(1)数据结构:定义蛇、食物和游戏区域的数据结构。

(2)函数设计:设计初始化函数、移动函数、判断是否吃到食物函数、判断是否撞到墙壁或自己的身体函数等。

(3)主函数:调用相关函数,实现游戏循环。

三、实训过程1. 设计阶段首先,根据游戏规则和界面设计,确定游戏的数据结构和函数。

然后,编写程序代码,实现游戏的基本功能。

2. 编码阶段根据设计阶段的设计,使用C语言编写程序代码。

在编写过程中,注意代码的可读性和可维护性。

3. 调试阶段在编写代码过程中,不断调试程序,修复出现的错误。

调试过程中,注意观察程序运行情况,分析问题原因,并找出解决方案。

4. 测试阶段完成程序编写后,进行测试,确保程序能够正常运行。

测试过程中,注意观察游戏效果,确保游戏规则和界面设计符合预期。

四、实训成果通过本次实训,成功设计并实现了贪吃蛇游戏。

游戏运行稳定,功能完整,达到了实训目的。

五、实训心得1. 理解程序设计的基本思想和流程,掌握C语言编程技巧。

贪吃蛇实验报告论文

贪吃蛇实验报告论文
第三行代码设置重复播放
注意一下:为了防止编译时文件拷贝到其他文件盘的根目录下导致使用绝对位置而打不开文件,所以贴图和背景音乐都使用的是相对位置。
学生资源提供了一个
backmusic.wma的文件:
2.
将蛇身体转化为行列坐标,每个节点为20X20:
遍历输出蛇身体,默认为红色,蛇头居中加一个黄色的圆圈作为眼睛:
tail=(snake*)malloc(sizeof(snake));
tail->left=startCol*20;
tail->top=(startRow+i+1)*20;
tail->right=(startCol+1)*20;
tail->bottom=(startRow+i+2)*20;
p->next=tail;
for(i=0;i<ROWS;i++)
{
left=X;
right=left+20;
for(j=0;j<COLS;j++)
{
if(map[i][j]==1&&i==0)
{
putimage(left,top,&imgtop);
}
if(map[i][j]==1&&i==(ROWS-1))
{
putimage(left,top,&imgbottom);
inty=(p->top+p->bottom)/2;
setfillcolor(YELLOW);
fillcircle(x,y,2);
}
p=p->next;
}

C语言贪吃蛇实验报告

C语言贪吃蛇实验报告

C语言贪吃蛇实验报告实验报告:C语言贪吃蛇游戏的实现一、引言贪吃蛇是一款非常经典的游戏,它的规则简单而有趣,对于初学者来说,实现一个贪吃蛇游戏是一个很好的练习项目。

本实验报告将介绍如何使用C语言实现一个简单的贪吃蛇游戏。

二、实验内容1.界面设计贪吃蛇游戏的界面包括游戏区域和游戏信息区。

游戏区域是以二维数组表示的地图,贪吃蛇和食物在地图上移动。

游戏信息区可以显示得分、游戏状态等信息。

2.贪吃蛇的移动贪吃蛇的移动是贪吃蛇游戏的核心部分。

贪吃蛇每次移动时,头部朝着移动的方向前进一格,身体部分跟随头部的移动。

如果吃到食物,贪吃蛇的长度会增加。

3.游戏结束判定游戏结束有两种情况:贪吃蛇撞到地图边界或者撞到自己的身体。

游戏结束后,可以显示得分信息。

三、实验过程1.设计游戏界面使用C语言的“#include <conio.h>”头文件中的一些函数,可以控制台下的光标位置,从而实现贪吃蛇游戏的界面设计。

2.实现贪吃蛇的移动首先定义了一个结构体Snake来表示贪吃蛇,结构体中包含了贪吃蛇的长度、坐标等信息。

使用动态数组保存贪吃蛇的身体坐标,每次移动时改变贪吃蛇头部的坐标,并更新贪吃蛇的位置。

3.生成食物使用rand函数生成一个随机数作为食物的坐标,在游戏区域内随机生成。

每次贪吃蛇吃到食物时,贪吃蛇的长度加1,并生成新的食物。

4.游戏结束判定在每次贪吃蛇移动时,判断贪吃蛇的头部是否撞到地图边界或者撞到自己的身体,如果是则游戏结束。

四、实验结果经过代码的实现和调试,成功完成了C语言贪吃蛇游戏的编写。

在控制台下可以看到一个游戏界面,贪吃蛇可以按照指定的方向移动,并且能够吃到食物,蛇的长度会随之增加。

当贪吃蛇撞到边界或者自己的身体时,游戏会结束,并显示得分信息。

五、实验总结通过本次实验,我深入了解了贪吃蛇游戏的实现原理,掌握了C语言的数组、结构体等基本知识,并通过实践加深了对这些知识的理解。

在实验过程中,我遇到了一些问题,比如如何设计游戏界面、如何控制贪吃蛇的移动、如何生成食物等等。

贪吃蛇实验报告

贪吃蛇实验报告

贪吃蛇实验报告1. 引言贪吃蛇是一种经典的游戏,通过控制蛇的移动方向,吃掉食物来增长身体长度。

在本实验中,我们将实现一个贪吃蛇游戏,并对不同算法进行比较,以探讨最优的游戏策略。

2. 实验目的本实验的目的有以下几点:1.实现一个基于命令行的贪吃蛇游戏。

2.探讨不同的贪吃蛇算法,并比较其效果优劣。

3.分析贪吃蛇游戏的设计思路和实现细节。

3. 实验方法3.1 游戏实现使用Python编程语言,利用面向对象的思想实现贪吃蛇游戏。

游戏主要包括蛇的移动、食物随机生成、蛇身体增长等基本功能。

3.2 算法比较我们将比较以下两种贪吃蛇算法:1.贪心算法:每一步都选择离食物最近的方向。

2.最短路径算法:使用最短路径算法计算出到达食物的最短路径,并选择下一步的移动方向。

4. 实验结果在实际运行贪吃蛇游戏时,我们进行了以下几个实验:4.1 实验一:贪心算法在贪心算法中,蛇会选择离食物最近的方向进行移动。

我们对贪心算法进行了100次实验,并记录了每次游戏的得分。

结果显示,在100次实验中,贪心算法的平均得分为200。

4.2 实验二:最短路径算法最短路径算法使用最短路径计算来选择下一步的移动方向。

我们同样进行了100次实验,并记录了每次游戏的得分。

结果显示,在100次实验中,最短路径算法的平均得分为350。

5. 结论通过对贪心算法和最短路径算法的比较,我们可以得出以下结论:1.最短路径算法相对于贪心算法更加优越,其平均得分更高。

2.由于最短路径算法的计算复杂度较高,可能导致游戏运行速度变慢。

在进一步研究中,可以尝试更复杂的贪吃蛇算法,并优化算法的实现,以提高游戏的表现和用户体验。

6. 参考文献1.Python官方文档2.《算法导论》以上是本次贪吃蛇实验的报告,通过实验我们得出了最短路径算法在贪吃蛇游戏中的优越性,并提出了进一步研究的方向。

贪吃蛇实验报告

贪吃蛇实验报告

贪吃蛇实验报告
一、实验目的
1、了解贪吃蛇游戏的原理和流程;
2、掌握贪吃蛇游戏的代码实现方法;
3、加深对 Python 语言编程和逻辑思维的理解。

二、实验材料
1、Python 编程环境 PyCharm;
2、Python 相关库 pygame、random;
3、贪吃蛇游戏素材(贴图等)。

三、实验步骤
1、安装 Python 开发环境 PyCharm,并安装 pygame 和 random 库;
2、设计贪吃蛇游戏的界面元素,包括蛇、食物、背景等,确定游戏的流程与规则;
3、根据设计,编写 Python 代码实现游戏界面和游戏规则;
4、调试程序,运行并测试贪吃蛇游戏的功能和流程。

四、实验结果
1、游戏开始时,蛇的长度为 1,位置在屏幕中央,食物随机
生成;
2、当蛇吃到食物时,蛇的长度加 1,食物重新生成;
3、如果蛇碰到屏幕边缘或自己的身体,则游戏结束,窗口显
示结束界面;
4、游戏界面左上角显示当前得分(蛇的长度),中间显示时
间和当前运行帧率;
5、游戏过程中可以通过键盘操作改变蛇的方向,即使按下相
反的方向键,也不会立刻死亡,而是会继续前进一格。

五、实验总结
贪吃蛇游戏是一种经典的小游戏,通过本次实验,我们学习了Python 编程语言、pygame 游戏引擎、random 库等相关知识,
并实现了一个简单的贪吃蛇游戏。

在实验过程中,我们深入了解游戏的规则和逻辑,并通过编写代码实现了游戏的基本流程。

通过该实验,加强了自己的编程和思维能力,为将来进行更复杂的游戏开发提供了基础。

贪吃蛇游戏设计与实现

贪吃蛇游戏设计与实现

七、实验结果展示
• 展示游戏窗体截图 • 演示蛇的移动、食物生成、分数统计等功能
八、实验扩展
• 扩展1:修改游戏界面的颜色和样式 • 扩展2:利用多线程机制,实现异步更新游戏状态
• ...
六、项目实现步骤
(1)创建窗体 (2)创建游戏棋盘 (3)创建蛇的节点 (4)创建蛇身 (5)把蛇绘制到棋盘上
(6)让蛇移动(移动的方法: 每次移动在蛇头运动方向添加一个节点,再删除最后一个节点)
(7)添加键盘监听 (8)添加边界处理(当蛇移动到边界处就游戏结束,蛇头撞到自身游戏结束) (9)把食物绘制到棋盘上 (10)吃食物
的身体游戏即结束。 ⑥ 可以选择不同的难度,以蛇移动速度的快慢进行区分。 ⑦ 游戏过程可以暂停、继续和重新开始 ⑧ 具有排行榜功能,在游戏结束时请用户输入玩家姓名并参与排行。
五、游戏设计思路
根据需求分析可知,每个棋盘格应处于以下几种状态之一: • 空棋盘格 • 是蛇身 • 是蛇头 • 是墙 • 是食物 所有棋盘格实时的状态可存储于一个表格结构中,它由指定行、列数 (cellNumX、cellNumY)的单元格构成,使用动态申请的二维数组board表 示。
三、界面设计
四、功能需求
① 蛇可行走的范围为固定大小的棋盘格,四周为墙。 ② 蛇按照固定的时间间隔向前进方向移动,每次蛇头和蛇身按照位置顺序依次前移。 ③ 在棋盘格中随机位置生成食物,当蛇咬到食物时得1分,同时蛇身变长一格,并生成一个新
食物。 ④ 在界面上能实时显示已获得的分数。 ⑤ 玩家可以通过键盘上的上、下、左、右方向键控制蛇前进的方向,一旦撞墙或咬到自己
五、游戏设计思路
蛇在棋盘格中游走时,有4个前进的方向其中,下一次前进的方向不能与当前前进方向相对,为了 进行判断,分别使用dicect和newDirect代表当前蛇前进的方向和用户希望 蛇将要前进的方向。

c 贪吃蛇实验报告

c 贪吃蛇实验报告

C 贪吃蛇实验报告1. 引言贪吃蛇是一款经典的游戏,玩家通过操纵蛇的移动,使其吃到食物并避免碰到自己的身体或墙壁。

本实验旨在通过编写一个贪吃蛇游戏的实现代码,展示基本的编程思路和方法。

2. 实验环境本实验使用Python编程语言进行实现,采用了以下工具和库: - Python 3.9.2 - Pygame 2.0.13. 实验步骤3.1 初始化游戏界面首先,我们需要创建一个窗口来显示游戏界面。

在Pygame中,可以使用pygame.display.set_mode()函数来创建一个窗口。

我们还需要定义一些常量,如窗口的大小、蛇的初始位置和速度等。

3.2 绘制蛇和食物在游戏界面中,蛇和食物是需要绘制出来的。

我们可以使用Pygame提供的绘图函数来实现。

具体步骤如下: 1. 创建一个蛇的列表,表示蛇的身体。

初始时,蛇只有一个方块。

2. 创建一个食物的坐标点,表示食物的位置。

3. 使用pygame.draw.rect()函数绘制蛇和食物的方块。

3.3 控制蛇的移动蛇的移动是通过改变蛇的身体坐标来实现的。

我们需要定义一个变量来表示蛇移动的方向,如上、下、左、右。

通过监听键盘事件,获取玩家的操作,然后改变蛇移动的方向。

3.4 更新蛇的位置蛇的位置需要不断更新,使其向当前移动方向移动一个方块的距离。

当蛇吃到食物时,蛇的身体长度增加一个方块。

具体步骤如下: 1. 根据当前移动方向,更新蛇头的坐标。

2. 将蛇头的坐标添加到蛇的身体列表中。

3. 如果蛇吃到了食物,生成一个新的食物坐标,并将蛇的身体长度增加一个方块。

3.5 判断游戏结束游戏结束的条件有两种情况:蛇碰到自己的身体或者蛇碰到墙壁。

我们需要在每次更新蛇的位置后,判断是否满足游戏结束的条件。

如果满足条件,游戏结束。

3.6 游戏循环完成以上步骤后,我们可以将整个游戏的逻辑放在一个循环中,不断更新蛇的位置、绘制游戏界面,并响应用户的操作。

直到游戏结束为止。

贪吃蛇游戏实验报告

贪吃蛇游戏实验报告
1.2 用户界面 [关键游戏界面,并且要说明该界面完成的功能,不用把所有界面都显示出来] 游戏开始界面:选择游戏的难度
游戏过程界面:进行游戏
2008 年 8 月 22 日 2
2008 年计算机实习报告
游戏结束界面:选择是否重新游戏
1.3 使用方法 [比如:可以是什么键控制游戏?是否可以划分那难度?游戏是否可配置,界面风格是 否可选等等] 用方向键控制蛇的移动,输入 1,2,3,选择难度,游戏中按除方向键其他键暂停,结束 界面 y 重新游戏,n 退出游戏
一个元素取代前一个位置,蛇头向前移动一,如有按键,则跳出内循环,根据按键寻则蛇的 运动
伪代码: while 循环 检测是否有按键,若有,进入相应循环 休眠 原来蛇位置变为空白 蛇身数组后一个元素取代前一个元素位置 根据按键改变蛇头位置 显示蛇身 若有按键,跳出内循环
算法 2:水果的产生 使用结构表示水果,当水果被蛇吃掉后,随机产生一个水果 伪代码:if 蛇头位置与水果位置重合
While 循环 随机产生水果的坐标 If 坐标在框图内 { If 水果坐标不与蛇每一个坐标重合 跳出循环 } 算法 3:判断蛇的死亡 While a=0 For 取遍蛇身每一个元素 { If 蛇头出了框图或蛇头与蛇身重合 a=1 }(a=1 则循环停止) 2.3 程序设计的难点和关键点 :1 随机产生水果的位置,要保证水果在框图内且水果与蛇身不重和, 2,判断蛇的死亡 3,控制蛇的颜色变换 4,对于分数的储存和导入 2.4 调试的方法
2008 年 8 月 22 日 3
2008 年计算机实习报告
二.程序设计说明
2.1 总体设计框架 [包括程序执行流程,模块划分等,需要有文字说明和框图表示] 开始
界面 界面
选择难度

贪吃蛇游戏实验报告

贪吃蛇游戏实验报告

*****************实验报告实验名称: 网络编程基础实训教程(贪吃蛇)指导教师:姓名:学号:班级:提交日期:1.实验目的通过开发一款贪吃蛇游戏程序, 熟练掌握C#编程语言、和面向对象程序设计方法, 独立完成一个游戏程序的开发。

2.实验题目使用C#编程语言, 开发一款贪吃蛇游戏, 如下图所示。

3.功能描述a)游戏场地是一片矩形区域的草坪。

b)一条蛇由蛇头和蛇身组成。

c)当游戏开始之后, 草坪中出现一颗豆和一条蛇, 并且蛇不停地移动, 蛇移动方向与蛇头一致。

d)当游戏暂停之后, 蛇停止移动。

e)当蛇移动时, 玩家使用“↑”、“↓”、“←”和“→”四个键控制蛇的移动方向。

f)当蛇头与豆的位置重合时, 豆被蛇吃掉, 同时在草坪中再生成一颗新的豆, 蛇身增加一节。

当蛇头碰到蛇身时, 则咬断蛇身, 后半部分的蛇身消失。

当蛇头碰到草坪四周时, 蛇立即毙命, 游戏结束。

4.需求分析根据功能描述可知, 贪吃蛇游戏的系统结构图如下所示。

1)定义数据字典如下:2)草坪(Lawn): 草坪是贪吃蛇游戏的场地。

豆和蛇只能存在于草坪范围之内。

草坪具有大小和颜色等属性。

蛇(Snake):在贪吃蛇游戏中, 蛇由若干节组成, 其中第一节是蛇头, 其余是蛇身。

在游戏过程中, 有且仅有一条蛇, 并且蛇在不停地移动。

如果蛇吃了豆, 则蛇生长一节。

如果蛇头碰到蛇身, 则咬断蛇身, 后半部分的蛇身消失。

如果蛇头离开草坪, 则蛇死亡游戏结束。

蛇具有长度、颜色、运动方向、每一节的位置等属性。

豆(Bean):在贪吃蛇游戏中, 豆是蛇的食物。

在游戏过程中, 有且仅有一颗豆。

如果蛇吃了豆, 则重新生成一颗豆。

豆具有位置、大小和颜色等属性。

5.设计说明根据需求分析可知, Snake的每一节都有位置和大小等属性。

而Bean也具有这两个属性。

抽象出二者的共同特征, 抽象出一般类Block, 用于描述一个块。

Block派生出Bean和SnakeBlock两个类, 其中SnakeBlock类用于描述蛇的一节。

实验设计三(贪吃蛇)

实验设计三(贪吃蛇)
mainFrame.addKeyListener(this);
mainFrame.pack();
mainFrame.setResizable(false);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setVisible(true);
snakeModel.changeDirection(SnakeModel.LEFT);
break;
case KeyEvent.VK_RIGHT:
snakeModel.changeDirection(SnakeModel.RIGHT);
break;
case KeyEvent.VK_PAGE_UP:
snakeModel.speedUp();//加速
if(direction%2!=newDirection%2){//避免冲突
direction=newDirection;
}
}
public boolean moveOn(){//贪吃蛇运动函数
Node n=(Node)nodeArray.getFirst();
}
else if(e.getSource() == close){
System.exit(0);
}ห้องสมุดไป่ตู้
}
public void keyPressed(KeyEvent e){
int keyCode=e.getKeyCode();
if(snakeModel.running)
switch(keyCode){
public SnakeModel(GreedSnake gs,int maxX,int maxY){//初始化界面

贪吃蛇c++实验报告

贪吃蛇c++实验报告

三、实验步骤1、编程环境的选择本程序采用Microsoft Visual C++6.0的英文版本进行编译。

VisualC++6.0是Microsoft公司推出的基于Windows操作系统的可视化C++编程工具,尽管Microsoft公司推出了.NET平台的集成开发环境,但由于其良好的界面和可操作性,加上支持标准C/C++规范,但仍有相当多的编程人员使用Vi sualC++6.0进行应用系统的开发。

2、概要设计2.1软件主要功能设计2.1.1程序结构的设计根据分析,贪吃蛇这个程序一共要实现如下几个功能,包括游戏方面开始游戏、暂停游戏以及停止游戏,音乐音效的添加与控制,游戏帮助提示与英雄榜的显示等等。

具体的程序结构如下面的图2-1所示。

图2-1 贪吃蛇结构图2.1.2程序流程根据分析后的贪吃蛇结构设计出相应的贪吃蛇流程。

贪吃蛇的内容主要包括:游戏开始,随机出现食物;按下ToolBar中的暂停按钮或Space键可以实现暂停功能;按下帮助键或ToolBar中的“?”键可获得游戏帮助说明;可播放背景音乐和音效并可通过菜单以及ToolBar控制其播放或停止等等。

图2-2 贪吃蛇流程图3 、软件实现3.1变量函数及资源的声明根据程序的结构,将贪吃蛇需要实现的功能细化成为相应的函数。

3.1.1函数声明void CY uShuoView::OnDraw(CDC* pDC)//在OnDraw函数中绘制游戏背景、游戏文字以及控制蛇的样式颜色。

void CY uShuoView::YsInitFood() //初始化贪吃蛇的食物,使其随机生成void CY uShuoView::YsInitGame() //初始化贪吃蛇游戏参数void CY uShuoView::YsReDisplay(CPoint ysPoint) //重绘游戏窗口void CY uShuoView::OnYsBegin() //开始游戏(菜单响应消息)void CY uShuoView::OnYsPause() //暂停游戏(菜单响应消息)void CY uShuoView::OnYsStop() //停止游戏(菜单响应消息)void CY uShuoView::OnYsExit() //退出游戏(菜单响应消息)void CY uShuoView::OnYsEffect() //控制游戏音效void CY uShuoView::OnYsMusicbkg() //控制游戏背景音乐void CY uShuoView::OnYsLevel1() //控制游戏等级为初级void CY uShuoView::OnYsLevel2() //控制游戏等级为中级void CY uShuoView::OnYsLevel3() //控制游戏等级为高级void CY uShuoView::OnYsHelpgame() //游戏帮助void CY uShuoView::OnYsBest() //英雄榜的显示3.1.2变量声明CArray<CPoint,CPoint> m_ysBody; //定义点数组作为蛇的身体CPoint m_ysFood; //食物出现的点int m_ysTime; //显示时间int m_ysTime1; //满10则进一位使时间增加1秒int m_ysDirect; //方向控制变量int m_ysScore; //玩家成绩变量int m_yspausectrl; //暂停控制变量int m_yslevelctrl; //等级控制变量CString m_ysPlayer; //玩家姓名int m_yseffectctrl; //音效控制变量int m_ysmusicctrl; //背景音乐控制变量3.1.3资源1、对话框IDD_YS_HELPGAME //游戏帮助说明IDD_YS_BEST //英雄榜IDD_YS_RETRY//停止游戏确认IDD_ABOUTBOX //关于游戏版本2、音乐IDR_YS_BKGMUSIC //游戏背景音乐IDR_YS_EA T //贪吃蛇吃到食物的音乐IDR_YS_LOWSCORE //游戏结束后得低分音乐IDR_YS_HIGHSCORE //游戏结束后得高分音乐3、位图IDB_YS_BITMAP //游戏背景图4、菜单/工具栏IDR_MAINFRAME //系统自带菜单IDR_YS_TOOLBAR //自己创建的工具条5、头文件mmsystem.h //播放音乐的相应文件fstream.h //文件流文件3.2主要功能的实现3.2.1游戏界面贪吃蛇游戏的游戏界面包括背景图片、蛇身体的绘制、蛇移动范围的绘制等等。

VHDL 贪吃蛇游戏实验报告

VHDL 贪吃蛇游戏实验报告

1 / 22贪吃蛇游戏摘要:本实验以设计贪吃蛇游戏为课题。

最终结果是以8*8点阵作为本游戏的显示界面,通过按键BTN1,BTN2,BTN3,BTN4分别控制蛇的运动方向,分别为“上下左右”。

蛇的长度为六个点阵,另外以一点表示老鼠,当蛇头吃到老鼠时,老鼠则在点阵上改变位置,也就是说通过一个伪随机函数在点阵上产生老鼠的位置,每当蛇头吃到老鼠时,就自动加一分,并在数码管显示。

每隔五分钟,在蛇没有吃到老鼠的前提下,老鼠就自动在点阵上改变位置,这样就增加了游戏的趣味性和难度性。

关键字:8*8点阵,贪吃蛇,数码管,EPM7128SLC8—15数电实验开发板课题设计任务及要求:简要说明:用一个8×8 点阵作为基本显示屏,六个连续移动的的发光点表示一条蛇,用任意出现的一个亮点表示老鼠,用4 个排成一条线的发光点表示“墙”,用四个按键控制蛇的运动方向,完成贪食蛇游戏,蛇撞“墙”、边或者游戏时间到,则游戏结束。

1. 老鼠出现的地方是随机的,在某个地点出现的时间是5 秒钟,如果5 秒钟之内没有被吃掉,它就会在其它地方出现;2. 用数码管显示得分情况和游戏的剩余时间,每吃掉一只老鼠就加一分;3. 游戏时间和速度可以手动设置。

4. 选做:增加游戏难度或自拟其它功能。

设计思路:当开启电源时,初始化EPM7128SLC8—15数电实验开发板。

8*8点阵也初始化,每来一个时钟脉冲就对8*8点阵进行一次扫描,并依次点亮六个蛇身和一个老鼠所对应的点,由于扫描频率是1MHz (远远超出人眼所能分辨的范围),故人眼看来蛇身是连续的。

用BTN1,BTN2,BTN3,BTN4键分别控制蛇的运动方向“上下左右”,每次按键时通过和蛇原来的运动方向进行比较来控制蛇接下来的运动方向。

在七段数码管上显示得分情况,每当蛇吃到一个老鼠时则自动加一分,并在数码管上显示出当前得分。

设置一个控件SW1来对得分进行复位,即每当SW1有效时,则得分清零。

贪吃蛇代码实验报告

贪吃蛇代码实验报告

一、实验目的1. 掌握Python编程语言的基本语法和常用库。

2. 理解贪吃蛇游戏的基本原理和算法。

3. 提高编程实践能力,培养团队协作精神。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm三、实验内容1. 游戏界面设计2. 蛇的移动3. 食物的生成4. 分数的计算5. 游戏结束条件四、实验步骤1. 导入相关库```pythonimport randomimport curses```2. 初始化屏幕```pythons = curses.initscr()curses.curs_set(0) # 隐藏光标sh, sw = s.getmaxyx() # 获取屏幕宽度和高度w = curses.newwin(sh, sw, 0, 0) # 创建新的窗口w.keypad(1) # 接受键盘输入w.timeout(100) # 设置超时时间,单位为毫秒```3. 绘制游戏界面```pythons = 'Score : ' + str(score)w.addstr(sh//2, sw//2 - len(s)//2, s) # 显示分数w.border(0) # 绘制边框```4. 初始化蛇和食物```pythonsnk_x = sw//4snk_y = sh//2snake = [[snk_y, snk_x],[snk_y, snk_x-1],[snk_y, snk_x-2]]food = [sh//2, sw//2]w.addch(int(food[0]), int(food[1]), curses.ACS_PI) # 在食物位置显示符号```5. 初始化蛇的移动方向```pythonkey = curses.KEY_RIGHT```6. 游戏循环```pythonwhile True:next_key = w.getch()key = key if next_key == -1 else next_key # 检查蛇是否撞墙或撞到自己if snake[0][0] in [0, sh] or \snake[0][1] in [0, sw] or \snake[0] in snake[1:]:curses.endwin()quit()# 计算蛇的新头部位置new_head = [snake[0][0], snake[0][1]]if key == curses.KEY_DOWN:new_head[0] += 1if key == curses.KEY_UP:new_head[0] -= 1if key == curses.KEY_LEFT:new_head[1] -= 1if key == curses.KEY_RIGHT:new_head[1] += 1# 将新头部添加到蛇的头部snake.insert(0, new_head)# 检查蛇是否吃到食物if snake[0] == food:score += 1food = Nonewhile food is None:nf = [random.randint(1, sh-1),random.randint(1, sw-1)]food = nf if nf not in snake else Nonew.addch(food[0], food[1], curses.ACS_PI)else:# 移动蛇tail = snake.pop()w.addch(int(tail[0]), int(tail[1]), ' ')# 在蛇的新头部位置显示蛇w.addch(int(snake[0][0]), int(snake[0][1]), curses.ACS_CKBOARD) ```7. 输出最终分数```pythons = 'Score : ' + str(score)w.addstr(sh//2, sw//2 - len(s)//2, s) # 显示分数```五、实验总结通过本次实验,我们成功地实现了贪吃蛇游戏。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数学与计算机学院可视化程序设计实验报告年级2006 学号2006429043 姓名jerry 成绩专业信息与计算科学实验地点主楼402 指导教师刘宇实验项目贪吃蛇实验日期09-6-1一、实验目的通过编写贪吃蛇小游戏,加深对VC++6.0MFC编程的理解二、实验原理1、改变标题栏文字1)在CMainFrame::PreCreateWindow函数中添加如下代码:cs.style&=~FWS_ADDTOTITLE;2)在CMainFrame::OnCreate函数中添加如下代码:SetWindowText("贪吃蛇");2、改变标题栏图标在CSnakeApp::InitInstance()函数中添加如下代码:AfxGetMainWnd()->SetIcon(this->LoadIcon(IDI_ICON1),TRUE);3、窗口不能拖动改变大小在CMainFrame::PreCreateWindow函数中添加如下代码:cs.style&=~WS_THICKFRAME;4、窗口不能最大化在CMainFrame::PreCreateWindow函数中添加如下代码:cs.style&=~WS_MAXIMIZEBOX;5、添加菜单1)增加CMenu成员变量menu2)在资源中插入菜单IDR_MENU1,添加相应的菜单项3)在CMainFrame::OnCreate函数中添加如下代码:menu.LoadMenu(IDR_MENU1);this->SetMenu(&menu);6、换肤1)将skins,SkinPPWTL.dll,include,lib等文件或文件夹放入snake工程文件夹内2)工程->设置->link对象/库模版中添加库文件lib/SkinPPWTL.lib3)在StdAfx.h中添加#include "include\SkinPPWTL.h"4)将头文件SkinPPWTL.h加载到工程5)在需要换肤的地方添加skinppLoadSkin(_T("skins\\Phenom.ssk"));皮肤的式样依赖于.ssk结尾的文件。

7、背景颜色,背景图片1)在CSnakeView::OnEraseBkgnd(CDC* pDC)中添加如下代码://变量m_BGPFlag控制画背景颜色还是背景图片if(m_BGPFlag==1){CBitmap MemBitmap;CRect rect;this->GetClientRect(&rect);MemBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());CBitmap *pOldBit=pDC->SelectObject(&MemBitmap);if(!m_bmp.m_hObject)this->m_bmp.LoadBitmap(IDB_BITMAP2);CBrush m_Brush;m_Brush.CreatePatternBrush(&m_bmp);pDC->FillRect(&rect, &m_Brush);}else{CBrush Brush(m_ViewColor);//保存旧的brushCBrush* pOldBrush = pDC->SelectObject(&Brush);CRect ViewClip;pDC->GetClipBox(&ViewClip);//画需要的区域pDC->PatBlt(ViewClip.left,ViewClip.top,ViewClip.Width(),ViewClip.Height( ),PATCOPY);//pDC->SelectObject (pOldBrush );}2)以蓝色为例,设置背景为蓝色建立类向导添加如下代码:void CSnakeView::OnBlue(){// TODO: Add your command handler code herem_BGPFlag=0;m_ViewColor=RGB(0,0,255);InvalidateRect(NULL);this->m_FlagRed=true;this->m_FlagGreen=true;this->m_FlagBlue=false;}3)点蓝色后变灰不可用建立类向导添加如下代码:void CSnakeView::OnUpdateBlue(CCmdUI* pCmdUI){// TODO: Add your command update UI handler code hereif(this->m_FlagBlue)pCmdUI->Enable();elsepCmdUI->Enable(false);}4)调色板的实现建立类向导添加如下代码:void CSnakeView::OnColor(){// TODO: Add your command handler code herem_BGPFlag=0;CColorDialog cd;cd.DoModal();m_ViewColor=cd.GetColor();InvalidateRect(NULL);}5)以大青蛇为例,设置背景图片建立类向导添加如下代码:void CSnakeView::OnBgpqing(){// TODO: Add your command handler code herem_BGPFlag=1;m_bmp.DeleteObject();m_bmp.LoadBitmap(IDB_BITMAP1);this->m_flagCheckBG=0;this->Invalidate();this->UpdateWindow();}8、将窗口设为固定大小在CMainFrame::PreCreateWindow(CREATESTRUCT& cs)函数中添加:cs.cx=790;cs.cy=600;9、食物的实现食物为CPoint类型的坐标。

1) 食物坐标的产生:食物不能产生在窗口外,蛇身上,墙上,代码如下:void CSnakeView::iniAim(){int uX,uY;while(1){uX=rand()%39; //产生在窗口内uY=rand()%25;int uTag=0;for(int i=0;i<=m_aBody.GetUpperBound();i++){CPoint uPoint=m_aBody.GetAt(i);if(uPoint.x==uX||uPoint.y==uY||uY==8||uY==16)//蛇身上,墙上{uTag=1;break;}}if(uTag==0)break;}m_Aim=CPoint(uX,uY);}2)将食物画出来:画以食物的坐标为左上角边长为20的正方形的内接圆在CSnakeView::OnDraw(CDC* pDC)中添加代码:pDC->SelectObject(&brush);pDC->Rectangle(CRect(m_Aim.x*20,m_Aim.y*20,(m_Aim.x+1)*20,(m_Aim.y+1)*20)); 10、蛇的实现1)蛇坐标的产生:蛇通过动态数组CArray <CPoint, CPoint> m_aBody实现,蛇的身体的每一段为CPoint类型的变量,即一个坐标。

初始化时,给蛇四个坐标,在视图区的构造函数(CSnakeView::CSnakeView())和“开始“(void CSnakeView::OnBegin())中添加如下代码:m_aBody.RemoveAll(); //游戏重新开始时,要把原来蛇身中的坐标全去掉m_aBody.Add(CPoint(7,4));m_aBody.Add(CPoint(6,4));m_aBody.Add(CPoint(5,4));m_aBody.Add(CPoint(4,4));2)将蛇画出来(蛇头为自己画的四个方向位图):在CSnakeView::OnDraw(CDC* pDC)中添加代码:CBitmap bitmap;switch(m_Direction) //方向不同,选择不同的蛇头位图{case 1:bitmap.LoadBitmap(IDB_BITMAPL);break;case 2:bitmap.LoadBitmap(IDB_BITMAPU);break;case 3:bitmap.LoadBitmap(IDB_BITMAPR);break;case 4:bitmap.LoadBitmap(IDB_BITMAPD);break;}CBrush headBrush;headBrush.CreatePatternBrush(&bitmap);for(int i=0;i<=m_aBody.GetUpperBound();i++){CPoint uPoint=m_aBody.GetAt(i);if(i==0) //画蛇头{pDC->FillRect(CRect(uPoint.x*20,uPoint.y*20,(uPoint.x+1)*20,(uPoint.y+1)*20),&h eadBrush);pDC->SelectObject(&brush);}else //画蛇身{pDC->SelectObject(&brush);pDC->Ellipse(CRect(uPoint.x*20,uPoint.y*20,(uPoint.x+1)*20,(uPoint.y+1)*20));}}11、接受键盘按键,控制蛇的方向建立类向导,添加键盘按下句柄,在函数CSnakeView::OnKeyDown中添加代码:switch(nChar) //1,2,3,4分别代表左,上,右,下键{case VK_RIGHT:{if(m_Direction==1) //若原来方向为左,不能改为相反方向右break;m_Direction=3;break;}case VK_LEFT:{if(m_Direction==3)break;m_Direction=1;break;}case VK_UP:{if(m_Direction==4)break;m_Direction=2;break;}case VK_DOWN:{if(m_Direction==2)break;m_Direction=4;break;}}this->InvalidateRect(NULL); //方向改变,刷新视图区this->UpdateWindow();12、墙的实现1)墙的坐标产生:a 在CSnakeView 中定义CPoint wall[20];b在CSnakeView构造函数中添加代码:drawwall();c在CSnakeView类中添加函数drawwallvoid CSnakeView::drawwall(){for(int i=0;i<10;i++){wall[i].x=i;wall[i].y=8;}for(i=10;i<20;i++){wall[i].x=i;wall[i].y=16;}}2)将特定的位图加载到画刷画墙,代码如下:CBitmap bitmapblock;bitmapblock.LoadBitmap(IDB_BITMAP5); //加载特定位图CBrush blockBrush;blockBrush.CreatePatternBrush(&bitmapblock);for(i=0;i<20;i++) //用特定位图的画刷画墙pDC->FillRect(CRect(wall[i].x*20,wall[i].y*20,(wall[i].x+1)*20,(wall[i].y+1)*20 ),&blockBrush);3)墙的移动在CSnakeView::OnTimer(UINT nIDEvent)中添加如下代码实现墙的循环移动:for(i=0;i<20;i++){wall[i].x=(wall[i].x+1)%39;}13、吃到食物后变色通过三个变量n_red,n_green,n_blue控制:1)初始化:在在视图区的构造函数(CSnakeView::CSnakeView())和“开始“(void CSnakeView::OnBegin())中添加n_red=0;n_green=155;n_blue=155;2)吃到食物后:n_red=rand()%255; //随机产生新颜色n_green=rand()%255;n_blue=rand()%255;CBrush brush=RGB(n_red,n_green,n_blue); //新产生颜色给画刷14、游戏菜单1)开始:void CSnakeView::OnBegin(){// TODO: Add your command handler code herePlayMusic(); //播放音乐m_Direction=3; //蛇头向右m_Count=0; //初始化得分为0m_aBody.RemoveAll();m_aBody.Add(CPoint(7,4));m_aBody.Add(CPoint(6,4));m_aBody.Add(CPoint(5,4));m_aBody.Add(CPoint(4,4));n_red=0;n_green=155;n_blue=155;this->SetTimer(1,200,NULL); //设置计时器this->InvalidateRect(NULL); //刷新视图区this->UpdateWindow();}2)停止:void CSnakeView::OnStop(){// TODO: Add your command handler code herethis->KillTimer(1); //暂停计时器StopMusic(); //停止音乐}3)继续:void CSnakeView::OnContinue(){// TODO: Add your command handler code herethis->SetTimer(1,200,NULL); //开启计时器PlayMusic(); //播放音乐}4)退出:void CSnakeView::OnExit(){// TODO: Add your command handler code herethis->KillTimer(1); //暂停计时器if(this->MessageBox("你是否确认退出?","提示",MB_OKCANCEL|MB_ICONEXCLAMATION)==1) //弹出对话框PostQuitMessage(0);}15、等级等级是由于timer不同低级为this->SetTimer(1,200,NULL);中级为this->SetTimer(1,100,NULL);高级为this->SetTimer(1,50,NULL);16、蛇的运动主要在CSnakeView::OnTimer(UINT nIDEvent)中实现,代码如下:CPoint uPoint=m_aBody.GetAt(0); //得到蛇头坐标int uTag=0; //撞墙或边界的标志变量,0表示没撞int i;for(i=0;i<20;i++){wall[i].x=(wall[i].x+1)%39; //墙的循环移动}for(i=0;i<=m_aBody.GetUpperBound();i++){CPoint uPoint1=m_aBody.GetAt(i);if((uPoint1.x==wall[9].x&&uPoint1.y==wall[9].y)||(uPoint1.x==wall[19].x&&uPoint 1.y==wall[19].y)) //判断蛇是否被两条墙撞到{uTag=1;break;}}if(uTag==1) //若蛇被撞倒,程序转向Agoto A;this->InvalidateRect(CRect(0,8*20,39*20,9*20)); //刷新两条墙this->InvalidateRect(CRect(0,16*20,39*20,17*20));switch(m_Direction) //根据方向加蛇头坐标{case 3:uPoint.x++;for( i=0;i<20;i++) //判断蛇头是否出边界或撞到墙{if(uPoint.x>=39||(uPoint.x==this->wall[i].x&&uPoint.y==this->wall[i].y)) { uTag=1;break;}}break;case 1:uPoint.x--;for( i=0;i<20;i++){if(uPoint.x<0||(uPoint.x==this->wall[i].x&&uPoint.y==this->wall[i].y)){ uTag=1;break;}}break;case 4:uPoint.y++;for( i=0;i<20;i++){if(uPoint.y>=25||(uPoint.x==this->wall[i].x&&uPoint.y==this->wall[i].y)) { uTag=1;break;}}break;case 2:uPoint.y--;for( i=0;i<20;i++){if(uPoint.y<0||(uPoint.x==this->wall[i].x&&uPoint.y==this->wall[i].y)){ uTag=1;break;}}break;}if(uTag==0) //若蛇没撞到墙也没出界,判断蛇是否撞到自己{for(int i=0;i<=m_aBody.GetUpperBound();i++){CPoint uPoint1=m_aBody.GetAt(i);if(uPoint1.x==uPoint.x&&uPoint1.y==uPoint.y){uTag=1;break;}}}if(uTag==0) //蛇没撞墙,没出界,没撞到自己{m_aBody.InsertAt(0,uPoint); //将新蛇头插入ReDisplay(uPoint); //画出新蛇头if(uPoint.x==m_Aim.x&&uPoint.y==m_Aim.y) //判断是否吃到食物{m_Count++; //分数加一sndPlaySound("eat.wav", SND_ASYNC ); //播放吃到食物的音乐iniAim(); //产生新食物n_red=rand()%255; //蛇身变色n_green=rand()%255;n_blue=rand()%255;this->InvalidateRect(NULL); //刷新视图区this->UpdateWindow();}Else //没吃到食物,去蛇尾后刷新{CPoint uPoint1=m_aBody.GetAt(m_aBody.GetUpperBound());m_aBody.RemoveAt(m_aBody.GetUpperBound());ReDisplay(uPoint1);}}else //蛇与墙,边界,自己相撞{A: KillTimer(1); //停止计时器StopMusic(); //停止音乐char c_Count[10];itoa(m_Count*10,c_Count,10); //将分数*10转化为字符串CString S_Count=c_Count;CString msg="Game over!Count:"+S_Count;AfxMessageBox(msg); //弹出对话框InvalidateRect(NULL);}17、状态栏右下角显示日期,时间,得分1)在MainFrm.cpp中的static UINT indicators[]中添加IDS_TIME,IDS_Score,2)在资源视图中的String Table中添加ID号为“IDS_TIME“,“IDS_Score”,Caption分别为“时间”“分数”3)建立CMainFrame类向导添加Timer句柄,代码如下:void CMainFrame::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultCTime t=CTime::GetCurrentTime();CString str=t.Format("%y-%m-%d %H:%M:%S");CClientDC dc(this);CSize sz=dc.GetTextExtent("时间:"+str);int index=0;index=m_mandToIndex(IDS_TIME);//得到ID号的索引m_wndStatusBar.SetPaneInfo(index,IDS_TIME,SBPS_NORMAL,sz.cx);m_wndStatusBar.SetPaneText(index,"时间:"+str);CSnakeView *pSnakeview=(CSnakeView *)GetActiveView();char score[10];itoa((pSnakeview->m_Count)*10,score,10);CString temp=score;CSize sizescore=dc.GetTextExtent("得分:"+temp);int nscore=m_mandToIndex(IDS_Score);//得到ID号的索引。

相关文档
最新文档