Snake游戏分析
实验报告贪吃蛇
一、实验目的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. 游戏控制实现在游戏主函数中,通过监听键盘事件来控制蛇的移动方向。
贪吃蛇开题报告
贪吃蛇开题报告一、引言贪吃蛇(Snake)是一款经典的游戏,具有较强的娱乐性和挑战性。
为了更好地理解和掌握贪吃蛇游戏的开发流程和实现技术,本文将详细介绍贪吃蛇游戏的开题报告。
本报告将讨论游戏的目的、游戏的规则和功能、技术选型以及开发计划等内容。
二、目的通过参与贪吃蛇游戏的开发,我们的目标是:•提高团队成员的编程能力和合作能力;•加深对游戏开发流程的理解和掌握;•实践设计模式和算法逻辑;•开发一款有趣且实用的游戏。
三、游戏规则和功能1. 游戏规则贪吃蛇游戏的基本规则如下:•蛇能够在地图上自由移动;•当蛇吃到食物时,蛇的长度会增加一节;•当蛇撞到自己的身体或地图边界时,游戏结束;•游戏会记录蛇吃到的食物数量;•蛇每移动一步,会不断消耗体力(长度)。
2. 游戏功能贪吃蛇游戏将包含以下功能:•开始、暂停和重新开始游戏的功能;•根据蛇吃到的食物数量更新游戏界面;•提供不同难度级别的游戏选择;•记录每次游戏的得分和最高得分。
四、技术选型1. 编程语言本次贪吃蛇游戏的开发将使用Python语言。
Python是一种易于学习和使用的高级编程语言,适合游戏开发和图形界面设计。
2. 开发工具和库•开发工具:我们将使用Visual Studio Code作为主要的开发工具。
Visual Studio Code是一个轻量级的集成开发环境,支持Python语言开发,并提供了丰富的插件和调试功能。
•游戏开发库:我们将使用Pygame库进行游戏的开发。
Pygame是一款跨平台的Python游戏开发库,提供了丰富的游戏开发功能和图形绘制功能。
3. 技术挑战在贪吃蛇游戏的开发过程中,我们将面临以下技术挑战:•蛇的移动逻辑和碰撞检测:需要设计蛇的移动逻辑和检测蛇与食物、身体和地图边界的碰撞逻辑。
•游戏界面的绘制:需要设计游戏界面的布局和绘制蛇、食物和地图等图形元素。
•游戏的交互和控制:需要实现游戏的开始、暂停和重新开始功能,并处理用户的键盘输入。
蛇形加法蒙氏工作步骤
蛇形加法蒙氏工作步骤蛇形加法(Montessori snake game)是一种数学游戏,旨在帮助儿童通过手动操作数块来进行加法运算,并以蛇形的方式呈现运算的过程。
下面是蛇形加法的工作步骤。
步骤一:准备工作在进行蛇形加法之前,需要准备以下材料:1.数学游戏区域:在桌子或地板上设置一个专门用于数学游戏的区域。
可以使用蓝色地毯或垫子来标示游戏区域。
2.工作台:在游戏区域的一侧放置一个小桌子或垫子,用于放置数块和进行加法运算的步骤。
3.数块:准备一套由红色、蓝色、绿色和黄色小块组成的数块。
每种颜色的数块都有10个。
数块的大小和形状可以根据实际需要进行调整。
步骤二:介绍数块首先,将数块放在工作台上,让孩子们观察和摸索数块。
可以使用问答的方式帮助孩子们熟悉数块的名称、颜色和数量。
问:这是什么?答:数块。
问:你能数数看有多少个数块吗?答:有10个数块。
问:颜色是一样的还是不一样的?答:颜色不一样,有红色、蓝色、绿色和黄色。
通过这些问题,引导孩子们认识数块,并在他们的帮助下将数块按颜色和数量分类。
步骤三:蛇形加法的过程在准备好数块后,可以开始进行蛇形加法的过程。
1.选择一个加法的问题。
例如,2+3=?2.在工作台上放置相应数量的“个位数块”(红色数块)和“十位数块”(蓝色数块)。
在这个例子中,需要放置2个红色数块和3个蓝色数块。
3.将红色数块按照单位数从左到右排列,然后将蓝色数块按照十位数从左到右排列。
即先放置2个红色数块,再放置3个蓝色数块。
4.从右侧开始,逐个将数块相加,并将结果用绿色数块表示出来。
例如,从个位数开始相加,2个红色数块加上3个蓝色数块等于5个。
因此,在个位数上放置5个绿色数块。
5.接着,将个位数的绿色数块放到蓝色数块的旁边,表示个位数加蓝色数块的和。
在这个例子中,将5个绿色数块放到3个蓝色数块的旁边。
6.重复以上步骤,将个位数和蓝色数块的和与红色数块相加,得到最终结果。
在这个例子中,5个绿色数块加上2个红色数块等于7个。
小蛇爬行游戏教案
小蛇爬行游戏教案小蛇爬行游戏是一款经典的电子游戏,非常受欢迎。
小蛇在屏幕上游走,它的身体会不断变长,玩家需要控制小蛇吃到食物,并避免碰到墙壁或自己的身体,直到小蛇最终撞死为止。
小蛇爬行游戏对于儿童学习编程非常有帮助,因为它是编程的一个非常好的实践案例。
下面我们将介绍如何教孩子玩小蛇爬行游戏。
一、游戏规则介绍首先,我们需要向孩子们介绍小蛇爬行游戏的基本规则。
我们需要告诉他们,小蛇一般只能向上、下、左、右四个方向移动,如果小蛇碰到墙壁或自己的身体,则游戏结束。
同时,我们需要向孩子们介绍如何得分和生命值。
每当小蛇吃到一块食物,就会得到一分。
当小蛇撞到墙壁或自己的身体时,它会失去一条生命线,当生命值减为零时,游戏就结束了。
二、自主编写游戏代码在孩子们熟悉游戏规则之后,我们可以让他们自己尝试编写小蛇爬行游戏的代码。
一开始,我们可以提供一些基础代码框架,并通过教学帮助孩子们理解代码语法和编写方式。
比如:```import pygamepygame.init()# 设置游戏窗口大小window =pygame.display.set_mode((500, 500))# 设置游戏标题pygame.display.set_caption("小蛇爬行游戏")# 定义蛇的初始坐标和大小snake_x = 250snake_y =250snake_width = 10snake_height = 10# 定义蛇的移动速度snake_speed = 2# 定义蛇的初始方向snake_direction = "right"# 开始游戏循环while True: # 监听键盘事件for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit()# 根据蛇的移动方向更新坐标if snake_direction == "right": snake_x += snake_speed elifsnake_direction == "left": snake_x -= snake_speedelif snake_direction == "up": snake_y -= snake_speed elif snake_direction == "down": snake_y += snake_speed# 绘制蛇的身体pygame.draw.rect(window, (0, 255, 0), (snake_x, snake_y, snake_width, snake_height))# 刷新游戏窗口pygame.display.update()```通过让孩子们逐步理解代码,他们可以自主编写出一些简单的小蛇爬行游戏代码实现。
贪吃蛇游戏设计之设计思路
贪吃蛇游戏设计思路1. 首先制作游戏的窗体布局。
其中包括窗体的大小,位置,添加按钮组件,在窗体上面划定游戏区域等。
2. 为按钮添加监听器,为开始按钮,结束按钮,键盘,还有游戏结束的时候的确定按钮.3. 单击开始按钮,看到的效果是在游戏区域里面看到一个随机产生的食物,和蛇体。
产生随见事物使用Random类,随机定位一个游戏区域里面的方块,然后使用Graphrics可以定位到这个方块的坐标图上颜色,这样就产生了肉眼可见的食物。
关于蛇体,我们将蛇体的每个方块添加到集合里面,使用的是List,为什么不用数组,原因是数组的长度总是有限的,你不知道蛇体里面最终存放多少方格,而且数组比较繁琐。
我们将蛇体的每个方块另外创建一个类(蛇体的每个方格)snakeAct,包含成员变量方格的坐标,每个snakeAct对象实例就是一个方块,将这个对象添加到列表List中就好了,然后再用Graphics,循环画出列表中的每个对象,就成功的画出了蛇体。
设置蛇体的初始长度只有蛇头,并设置蛇头的初始位置为居中。
4. 通过方向键设置蛇头的移动,定义move()方法,蛇头每移动一次位置就会变化到另外一个方块,对应的坐标x,y都是有相应的变化,例如按下UP键,坐标的变化就是,x不变,y减1。
5. 蛇头可以运动只有面临的问题就是要吃食物,而吃食物的过程是在移动过程中,所以在move()方法中添加eat()方法,吃到食物的条件是蛇头的坐标和食物的坐标对应相等,蛇头吃到食物的过程就是将列表中没有吃到食物前的最后一个方格重新画一遍,这样列表的长度就加一,而列表中的对象就多了一个。
6. 将食物添加到列表中之后,仍然只是蛇头可以移动,让蛇体跟着蛇头移动定义othermove()方法,就是将蛇体的每个蛇块替换移动前的前一个蛇块的坐标,这样在移动只有,整个蛇体就可以移动了,othermove方法也写在move()方法里面,move()方法写在键盘的监听方法里面。
贪吃蛇游戏说明书
贪吃蛇游戏说明书学院:计算机工程系专业班级:学号:学生:指导教师:青岛理工大学琴岛学院教务处2011年 7 月 8 日一、游戏说明:贪吃蛇小游戏是一款有趣的益智游戏,可以锻炼大脑的反应能力,在游戏与挑战中娱乐放松自己。
最初的蛇只有3节,随机某个地方出现一个食物,蛇从食物上走过即可吃掉食物并使自己的长度增加一节,游戏自动计时计分,撞到外侧的墙壁或自身会判定为游戏失败。
玩家可以自主设置游戏难度,改变蛇的运动速度,更加人性化。
另外,本游戏新添作弊功能,使游戏更具娱乐性。
二、操作说明:(一)游戏1. 开始:打开游戏之后,点击“开始游戏”按键,以开始游戏。
如图1所示图12.暂停/退出:在游戏进行中,如果因为有事离开可以选择暂停游戏或者退出游戏,当前的游戏会暂停或者退出,暂停的游戏再一次点击暂停游戏可以继续进行。
如图2所示图2(二)设置1.难度设置:游戏设中等为默认难度,用户可自主选择高/中等/容易任意难度,改变蛇的运动速度进行挑战。
选择的难度在游戏窗口显示。
2.声音:“背景声音开/关”,游戏默认开背景声音,点击则可以关闭,再一次点击则可以重新打开。
3.作弊开/关:游戏新加作弊功能,点击作弊开/关,蛇便可以穿过墙循环往复,游戏便不会结束,并可以继续其他功能,再次点击此处,作弊便可以关掉,正常进行游戏。
图3所示图3(三)帮助1.帮助:点击“帮助”,出现“关于Snake”及“游戏规则”。
如图4所示图42.游戏规则:点击“游戏规则”,出现对话框包含“游戏介绍”及“操作规则”的相关内容。
根据操作规则进行游戏。
如图5所示图5(四)其它1.操作规则:(1)游戏操作:键盘操作控制蛇的运动方向,方向键以及w、s、a、d分别对应向上、下、左、右移动。
(2)游戏快捷键:F1:帮助,Space:暂停/开始,F2:开始,F3:退出程序。
2.得分/用时:游戏自动计时。
当蛇吃掉一个食物时,游戏自动计分加1分。
如图6所示图63.游戏结束时点击提示对话框里的“确定”,恢复游戏主窗口。
贪吃蛇(HTML小游戏使用JavaScript开发)
贪吃蛇(HTML小游戏使用JavaScript开发)贪吃蛇:HTML小游戏使用JavaScript开发在游戏界,贪吃蛇是非常经典和受欢迎的一款小游戏。
它的简单和上瘾性使得无数玩家沉迷其中。
今天,我们将学习如何使用HTML和JavaScript来开发一个贪吃蛇的小游戏。
一、游戏的基本思路贪吃蛇的游戏规则非常简单明了。
玩家控制蛇的移动,通过吃食物来不断增长蛇的长度。
当蛇碰到墙壁或者自己的身体时,游戏结束。
游戏的目标是使蛇长得尽可能长,挑战自己的最高得分。
二、HTML布局首先,我们需要在HTML文件中创建游戏画布。
这个画布将用于显示游戏的界面。
我们可以通过HTML的"canvas"元素来实现。
```html<!DOCTYPE html><html><head><title>贪吃蛇</title><style>#gameCanvas {border: 1px solid black;}</style></head><body><canvas id="gameCanvas" width="400" height="400"></canvas><script>// 在这里编写JavaScript代码</script></body></html>```上面的代码中,我们创建了一个宽高为400像素的画布,并给它设置了一个边框。
三、JavaScript逻辑接下来,我们需要使用JavaScript来实现游戏的逻辑。
我们将使用一个JavaScript类来表示贪吃蛇,并在其中实现移动、吃食物等功能。
```javascript<script>class SnakeGame {constructor(canvasId) {this.canvas = document.getElementById(canvasId);this.context = this.canvas.getContext("2d");this.snake = new Snake();this.food = new Food();// 在这里添加事件监听器,监听用户的方向键输入this.gameLoop();}// 游戏主循环gameLoop() {// 清空画布this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); // 更新蛇的位置this.snake.update();// 绘制蛇和食物this.snake.draw(this.context);this.food.draw(this.context);// 在下一帧时再次调用游戏主循环requestAnimationFrame(() => this.gameLoop()); }}class Snake {constructor() {// 在这里初始化蛇的位置和长度等信息}update() {// 在这里更新蛇的位置和长度等信息}draw(context) {// 在这里使用context绘制蛇的形状}}class Food {constructor() {// 在这里初始化食物的位置等信息}draw(context) {// 在这里使用context绘制食物的形状}}// 创建一个名为"game"的SnakeGame实例const game = new SnakeGame("gameCanvas");</script>```在上面的代码中,我们创建了一个`SnakeGame`类来表示游戏,`Snake`类来表示蛇,和`Food`类来表示食物。
Snake Game
2.画蛇: 分析: 先确定蛇头的位置,假定出现在中间, snake.x[0]=X/2; snake.y[0]=Y/2; 一开始定义蛇向上运动, snake.x[1]=snake.x[0]; snake.y[1]=snake.y[0]+1; snake.dir=UP; 然后再是画蛇,因为蛇头的位置坐标 X0+(snake.x[0]-1)*WIDTH, Y0+(snake.y[0]-1)*WIDTH, X0+snake.x[0]*WIDTH, Y0+snake.y[0]*WIDTH, 再画蛇身,利用for循环语句,可编写出
#include<stdio.h> #include<time.h> #define X 20/*水平方向上定义有20个空格*/ #define Y 15 /*竖直方向上定义有15个空格*/ #define WIDTH 20 /*空格长度定义为20*/ #define X0 180 /*起点横坐标*/ #define Y0 100 /*起点纵坐标*/ #define BKCOLOR RGB(211,211,211)/*背景颜色定义 为黑色*/ #define N 200 /*蛇最长的长度有200*/ #define HEADCOLOR RGB(237,43,75) /*蛇头为红色*/ #define SNACKCOLOR RGB(7,11,185) /*蛇身为蓝*/ #define FOODCOLOR RGB(172,20,107) /*食物颜色为 浅红*/
}
if(snake.dir==RIGHT) { x++;snake.x[0]=x;
贪吃蛇实验报告
《计算机程序设计》课程设计报告课题名称贪吃蛇游戏班级学号姓名指导教师设计时间至设计地点常熟理工学院计算机科学与工程学院目录1 需求分析 (1)2 系统分析和设计 (1)2.1 数据结构的设计和选择的理由 (1)2.2 系统模块划分和模块结构 (2)2.3 流程图 (2)2.4 数据类型、全局变量和函数说明 (3)3 程序测试和运行结果 (4)4 课程报告小结 (5)4.1分数重叠显示 (5)4.2速度太快 (5)4.3食物可能出现在蛇身上 (5)附录A:程序源代码 (6)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#的贪吃蛇游戏学院、系:装备制造学院专业班级:计算机科学与技术学生姓名:叶佳佳指导教师:丁宁成绩:2015年12月12日目录一、概述 (1)1、用C#实现该设计的方法 (1)2、贪吃蛇游戏说明 (1)二、实验目的及设计要求 (1)1、实验目的 (1)2、实验要求 (2)三、课程设计具体实现 (2)1、概要设计 (2)1.1、设计思想 (2)1.2、主模块实现 (2)1.3、主函数流程图 (4)2、详细设计 (5)2.1、设计思想 (5)2.2、具体模块实现: (5)四、调试过程及运行结果 (10)1、调试过程 (10)2、实验结果 (11)五、实验心得 (12)六、参考资料 (13)七、附录:源代码 (13)一、概述1、用C#实现该设计的方法首先应该了解设计要求,然后按照功能设计出实际模块,每个模块都要完成特定的功能,要实现模块间的高内聚,低耦合。
设计模块是一个相当重要的环节,模块的数量不宜太多,也不宜太少,要是每个模块都能比较简单的转换成流程图。
模块设计完成后,就该给每个模块绘制流程图。
流程图要尽可能的简单且容易理解,多使用中文,补一些过长的代码,增加理解难度。
此外,流程图应容易转换成代码。
根据流程图编写好代码后在WindowsXP操作系统,2008开发环境下进行运行测试,检查错误,最终设计出可行的程序。
2、贪吃蛇游戏说明游戏操作要尽可能的简单,界面要尽可能的美观。
编写程序实现贪吃蛇游戏,贪吃蛇游戏是一个深受人们喜欢的游戏:一条蛇在密闭的围墙内,在围墙内随机出现一个食物,通过键盘上的四个光标键控制蛇向上下左右四个方向移动,蛇头撞到食物,则表示食物被吃掉,这时蛇的身体长一节,同时计10分;接着又出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁、障碍物或身体交叉(蛇头撞到自己的身体),则游戏结束。
游戏结束时输出相应得分。
具体要求有以下几点:(1)对系统进行功能模块分析、控制模块分析正确,符合课题要求,实现相应功能;可以加以其他功能或修饰,使程序更加完善、合理;(2)系统设计要实用,采用模块化程序设计方法,编程简练、可用,功能全面;(3)说明书、流程图要清楚;二、实验目的及设计要求1、实验目的.NET课程设计是教学实践环节中一项重要内容,进行此课程设计旨在掌握基础知识的基础上,进一步加深对VC#.NET技术的理解和掌握;提高和加强学生的计算机应用及软件开发能力,使学生具备初级程序员的基本素质;培养学生独立分析问题、解决问题、查阅资料以及自学能力,以适应信息管理行业日新月异的发展形势;本次课程设计是以学生独立思考解决问题为主,教师指导为辅,结合上机操作,完成指定的任务,做出设计报告。
Snake幼儿园英语教案
Snake幼儿园英语教案教案标题:Snake幼儿园英语教案教案目标:1. 学习和掌握与“Snake”主题相关的基本英语词汇和表达。
2. 培养幼儿对“Snake”主题的兴趣和好奇心。
3. 培养幼儿的听、说、读、写能力,提高他们的英语语言运用能力。
教学资源:1. 教学素材:图片、卡片、玩具蛇等。
2. 多媒体设备:投影仪、音响设备等。
3. 教学工具:白板、彩色笔、海报纸等。
教学步骤:引入:1. 使用图片或玩具蛇引起幼儿的兴趣,激发他们对“Snake”主题的好奇心。
2. 通过问问题的方式,激发幼儿对“Snake”主题的思考,例如:“What is this? What color is it? Where does it live? What does it eat?”等。
学习词汇和表达:1. 准备一些与“Snake”主题相关的词汇卡片,例如:“snake, long, green, slither, hiss”等。
2. 使用图片或卡片展示这些词汇,并帮助幼儿理解和记忆这些词汇的意义。
3. 通过游戏、歌曲或故事等方式,帮助幼儿巩固和运用这些词汇。
听说活动:1. 播放一段关于蛇的简短音频或视频,并帮助幼儿理解其中的基本内容。
2. 通过问题和回答的方式,让幼儿表达他们对所听内容的理解和感受。
3. 进行角色扮演活动,让幼儿模仿蛇的动作和声音,并用英语表达。
阅读活动:1. 准备一本关于蛇的简短英语绘本,例如《The Very Hungry Snake》。
2. 以适当的语速和语调朗读这本绘本,并引导幼儿跟读。
3. 提问幼儿有关故事情节、角色和主题的问题,帮助他们理解故事内容。
写作活动:1. 提供一些简单的句子模板,例如:“The snake is _____.”或“The snake can______.”等。
2. 让幼儿根据自己的理解和想象,填写这些句子模板,并帮助他们将其写在海报纸上。
3. 鼓励幼儿展示他们的作品,并相互欣赏和分享。
贪吃蛇游戏-需求分析文档
需求分析
一要解决的问题
我们设计的这个贪食蛇小游戏应该有以下几个功能:
1 要求有比较友好的界面,界面应该包括得分显示,游戏状态(运动,暂停,结束),游戏难易程度显示(容易,较难,困难),关于游戏(包括教初玩者如何操作,及游戏规则)。
另外,在界面显示的效果应该简洁大方,尽量能够很快吸引玩者。
2 当游戏刚开始的时候,先应该产生一条蛇和随机产生一个食物。
当按某个键的时候,蛇就开始移动,按照按键的方向运动。
3 蛇可以运动,随着难易程度的不同,蛇的速度也不同;在界面里可以随机产生一个食物,但应该注意不能和蛇身体一致,然后当蛇就移动然后吃掉这个食物(覆盖),然后蛇的身体应该相应地增加,同时界面中显示分数一栏应该相应地增加分值;当蛇在移动的过程中头部碰到墙壁,游戏结束。
二提出的要求
1 按键的时候可以控制蛇移按照设置的方向移动;
2 当选择游戏的难易程度不同时,蛇体的速度应该也是不同的;
3 当游戏开始时候,应该有一个初始化,设置蛇身,食物等;
4 当游戏结束时,会有相应的处理,比如提示;
三可以实现的要求
1 简单友好的界面
2 蛇的移动和控制
3 对蛇的状态的监听,及对得分的显示;
4 蛇的状态的变化
四应该有的对象及其他们之间的关系
1 Game对象
2 Wall对象
3 Snake对象
4 Food对象
它们之间的关系:Game对象中应该包括其他三个对象;Snake对象和Food对象应该有相同的形状。
这几个对象差不多可以反映上面的要求。
五关键点
该游戏最关键的地方应该是:
1 在监听蛇的状态的方法实现并处理;
2 蛇的运动算法实现过程;。
基于Java的游戏设计——贪吃蛇
毕业设计论文基于Java的游戏设计——贪吃蛇毕业设计(论文)中文摘要毕业设计(论文)外文摘要目录1 绪论 (1)1.1J AVA语言的特点 (1)1.2开发工具E CLIPSE介绍 (2)1.3开发工具JDK介绍 (3)1.4应用环境 (3)2 系统需求分析 (3)2.1需求分析 (4)2.2可行性分析 (4)3 系统概要设计 (5)3.1游戏流程图 (5)3.2设计目标 (6)3.3系统功能模块 (6)3.4系统数据结构设计 (8)4 系统详细设计 (12)4.1程序设计 (12)4.2贪吃蛇游戏各功能界面截图 (16)5 系统测试 (19)5.1测试的意义 (19)5.2测试过程 (19)5.3测试结果 (20)结论 (21)致谢 (22)参考文献 (23)1 绪论贪吃蛇是世界知名的益智类小游戏,选择这个题目一方面是为了将我们自己的所学知识加以运用;另一方面,我希望通过自己的所学知识把它剖析开来,通过自己的动手实践,真正的了解它的本质和精髓。
希望通过这次实践,能从中提高自己的编程能力。
并从中学会从零开始分析设计程序,达到学以致用,活学活用的目的。
另外,通过本游戏的开发,达到学习Java技术和熟悉软件开发流程的目的。
本游戏的开发语言为Java,开发工具选用Eclipse。
Java是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中立的,可移植的,性能优异、多线程的动态语言。
这里采用Java作为开发语言主要是基于Java的面向对象和可移植性。
Eclipse 是一个开放源代码的、基于Java 的可扩展开发平台。
就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。
1.1 Java语言的特点1.1.1 简单性Java与C++语言非常相近,但Java比C++简单,它抛弃了C++中的一些不是绝对必要的功能,如头文件、预处理文件、指针、结构、运算符重载、多重继承以及自动强迫同型。
贪吃蛇游戏的设计与实现毕业论文
毕业论文论文题目贪吃蛇游戏的设计与实现院(系)名称计算机与信息工程学院专业名称计算机应用技术班级学生姓名学号指导教师姓名目录内容摘要: (1)关键词: (1)Abstract: (1)Key words: (1)1.游戏设计背景 (1)1.1游戏设计原理 (1)1.2游戏设计的运行环境 (1)2.游戏设计相关知识介绍 (3)2.1 Flash理论基础知识要点 (3)2.2面向对象编程 (4)2.3游戏制作中常用函数的属性与方法 (4)3. 制作贪吃蛇游戏的整体规划 (7)3.1贪吃蛇游戏的大致结构图 (7)3.2游戏设计整体构思 (8)3.3透视游戏设计的核心重点算法 (8)3.4游戏设计核心重点函数控制 (8)4. 游戏详细设计与核心技术 (8)4.1游戏的详细设计 (8)4.2游戏的核心技术 (10)5.贪吃蛇游戏设计总结 (14)参考文献 (15)致谢 (16)内容摘要:贪吃蛇游戏,因为制作简单,逻辑性较强,通常是学做游戏的必练的项目。
贪食蛇游戏是目前各种流行手机中附带的一款休闲小游戏。
Flash是Macromedia公司发布的制作高压缩性网络内容的专业标准动画软件。
随便打开一个网页,都能发现Flash动画的身影Flash动画作品已经充斥整个网络。
毫无疑问Flash 已经是制作网络动画的霸主。
透过现象看本质:游戏的制作与Flash的基础原理密不可分,同时也与制作者的良好修养密不可分,进而提高本身综合素质的的整体提高!关键词:原理运行环境理论基础详细设计核心技术Abstract:Snake game, because the production of simple logic is strong, often the game will learn to practice projects. Snake mobile game is all included with a popular casual games. Macromedia Flash is the production company released the contents of high-compression network of professional standards for animation software. Casually open a web page, Flash animation can be found in the figures of Flash animation has flooded the entire network. There is no doubt that Flash is already the dominant animation production network. Look beyond the surface: the game's basic principles of production and Flash are inseparable, but also with the producers of good training are inseparable, and thus improve their overall quality of the overall improvement!Key words:Principle operating environment Theoretical basis Detailed design Core Technology1.游戏设计背景随着科技与经济的快速发达,知识经济的快速增长,娱乐逐渐变成人与智能的交流。
snake的用法
snake的用法一、什么是"snake"?Snake 是一个简单而有趣的游戏,被广泛用于娱乐和休闲场合。
它最初在 20 世纪 70 年代末到 80 年代初出现,并且从那时起就在各种平台上流行开来,包括电脑、手机和掌上游戏机等。
这款游戏的成功之处在于它既容易上手又很吸引人,因此成了很多人小时候的回忆。
二、Snake 的基本规则Snake 游戏中玩家操纵一个贪吃蛇,在一个空白区域内移动。
贪吃蛇由一块初始长度较短的身体组成,不断地吞食食物以增长自己的长度。
游戏目标是尽量延长蛇身并避免碰到边界或自己的身体。
当玩家控制贪吃蛇向某个方向行进时,蛇会不停地前进直到撞墙或是撞到自己的身体为止。
为了让游戏更具挑战性,随着时间推移,贪吃蛇移动速度会逐渐加快。
此外,游戏还设置了一些障碍物或特殊区域,例如石块、墙壁或是会改变蛇行进方向的门等,使得游戏更加有趣和具有挑战性。
三、Snake 的策略与技巧1. 观察和预判:在 Snake 游戏中,观察周围环境并预测蛇前进的方向是非常关键的。
通过观察食物所在位置以及蛇当前的身体位置,玩家可以做出更明智的决策,在合适的时机吞食食物并避免撞墙或自咬。
2. 控制速度:虽然蛇的速度会随着游戏时间增加而加快,但玩家可以尝试掌控蛇的速度。
适当调整行进速度可以帮助玩家更好地掌握游戏节奏,并在必要时做出快速反应。
3. 制定路径:为了避免撞到自己或者撞到边界,在开始游戏之前就需要规划一条合理的路径。
尽量利用空白区域来移动贪吃蛇,并尽量留下一些空间以便后续行动。
4. 利用反弹:在某些版本的 Snake 中,贪吃蛇撞到墙壁或门时会被反弹回来。
玩家可以利用这一特点,在狭小的空间内巧妙地穿梭,避免被墙壁阻挡。
四、不同平台上的 Snake 游戏Snake 游戏在不同平台上有着各种版本和变体。
下面是几个常见的平台及其对应的 Snake 游戏:1. 早期电脑版本:早在 20 世纪末,Snake 游戏就出现在了个人电脑上。
毕业设计——贪吃蛇游戏的设计论文
摘要近年来,Java作为一种新的编程语言,以其简单性、可移植性和平台无关性等优点,得到了广泛地应用,特别是Java与万维网的完美结合,使其成为网络编程和嵌入式编程领域的首选编程语言。
JBuilder是Borland公司用于快速开发Java应用的一款优秀的集成开发环境,它以其友好的开发界面、强大的组件支持等优点,得到广大程序员的接受和认可。
“贪吃蛇”游戏是一个经典的游戏,它因操作简单、娱乐性强而广受欢迎。
本文基于Java技术和JBuilder开发环境,开发了一个操作简单、界面美观、功能较齐全的“贪吃蛇”游戏。
整个游戏程序分为二个功能模块,六个类模块,实现了游戏的开始、暂停、结束。
通过本游戏的开发,达到学习Java技术和熟悉软件开发流程的目的。
本文在介绍Java相关技术和国内外发展现状的基础上,对“贪吃蛇”游戏的整个生命周期的各个开发阶段进行了详细地介绍。
首先,分析了开发本游戏软件的可行性,重点分析本设计所采用的技术的可行性。
其次,从游戏主界面等几方面,分析了本游戏的功能需求;从可使用性和安全性方面分析了属性需求。
然后,进行了游戏的概要设计和详细设计,这也是本文的重点。
概要设计给出二个功能模块的主框架以及六个类模块的函数调用关系;详细设计介绍了Java2标准运行环境的配置,重点给出各个类模块的程序流程图以及UML图,列表介绍了各个类包含的变量、使用的方法,展示了游戏的界面。
为了保证程序代码的正确性和功能实现的可靠性,本文还介绍了游戏软件的程序调试过程和功能测试结果。
目录第一章系统开发环境 (1)1.1开发工具 (1)1.2应用环境 (1)第二章系统需求分析 (2)2.1需求分析 (2)2.2可行性分析 (2)第三章系统概要设计 (3)3.1设计目标 (3)3.2系统功能模块 (3)第四章系统详细设计 (5)4.1程序设计 (5)4.2各功能界面截图 (8)第五章系统测试 (15)5.1测试的意义 (15)5.2测试过程 (15)5.3测试结果 (15)参考文献 (16)第一章系统开发环境1.1 开发工具Sun Microsystems公司在推出Java语言的同时,推出了一套开发工具JDK。
小组实验报告
附件1:华南农业大学信息学院课程设计实验实验题目:贪吃蛇一、分析题目要求经过我们3人小组的讨论,最终确定了用C语言写贪吃蛇的游戏。
首先,要想实现贪吃蛇就要有游戏界面;其次,还要有写贪吃蛇的设计思路以及对于数据结构的操作;另外,还应该有游戏的规则实现以及界面的美化等。
因此,我们把这个实验任务分成了3个部分,xxx具体负责的是蛇的构造以及食物的生成,xxx负责界面,xxx负责游戏规则。
要实现贪吃蛇能够前进,我们需要用到链表来存取蛇的身体,以及蛇所在的方位。
一般情况下,需要用到链表节点的删除,增加,输出等操作。
另外,产生随见事物使用系统自带的Rand,随机定位一个游戏区域里面的方块,然后使用gotoxy函数可以定位到这个方块的坐标,并且涂上颜色,这样就产生了肉眼可见的食物。
关于蛇体,我们将蛇体的每个方块添加到链表里面,使用的是 snake,为什么不用数组,原因是数组的长度总是有限的,你不知道蛇体里面最终存放多少方格,而且数组比较繁琐。
通过不断的生成蛇头以及删除蛇尾循环画出列表中的每个对象,就成功的画出了蛇体。
设置蛇体的初始长度只有蛇头,并设置蛇头的初始位置为居中。
(1) 各个函数命名,包含的参数,返回值类型定义#include <Windows.h>这个头文件,它包含了其他Windows头文件,这些头文件的某些也包含了其他头文件:static COORD position;//显示当前指针的坐标static COORD food_position;//显示当前食物的坐标static HANDLE hOut;//获取标准输出的句柄。
命令行的程序会把字符输出到屏幕定义#include <conio.h>头文件,是Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是通过按键盘产生的对应操作,比如getch()函数,而在Fsnake.h中定义的#define LEFT 75 #define UP 72 #define DOWN 80 #define RIGHT 77 #define ESC 27 #define SPACE 32 #define ENTER 13 即为getch()函数从键盘接收到的各种键值。
贪吃蛇游戏实验报告
*****************实验报告实验名称: 网络编程基础实训教程(贪吃蛇)指导教师:姓名:学号:班级:提交日期: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类用于描述蛇的一节。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Snake游戏分析Snake也是一个经典游戏了, Nokia蓝屏机的王牌游戏之一。
Android SDK 1.5就有了它的身影。
我们这里就来详细解析一下 Android SDK Sample中的 Snake 工程。
本工程基于 SDK 2.3.3版本中的工程,路径为: %Android_SDK_HOME% /samples/android-10/Snake一、 Eclipse 工程通过 File-New Project-Android-Android Project,选择“ Create pro ject from existing sample”创建自己的应用 SnakeAndroid,如下图:运行效果如下图:二、工程结构和类图其实 Snake的工程蛮简单的,源文件就三个: Snake.java SnakeView.java TileView.java。
Snake类是这个游戏的入口点, TitleView类进行游戏的绘画,SnakeView类则是对游戏控制操作的处理。
Coordinate, RefreshHandler是 2个辅助类,也是 SnakeView类中的内部类。
其中, Coordinate是一个点的坐标( x, y), RefreshHandler将 RefreshHandler对象绑定某个线程并给它发送消息。
如下图:任何游戏都需要有个引擎来推动游戏的运行,最简化的游戏引擎就是:在一个线程中 While循环,检测用户操作,对用户的操作作出反应,更新游戏的界面,直到用户退出游戏。
在 Snake这个游戏中,辅助类 RefreshHandler继承自 Handler,用来把RefreshHandler与当前线程进行绑定,从而可以直接给线程发送消息并处理消息。
注意一点: Handle对消息的处理都是异步。
RefreshHandler在 Handler 的基础上增加 sleep()接口,用来每隔一个时间段后给当前线程发送一个消息。
handleMessage()方法在接受消息后,根据当前的游戏状态重绘界面,运行机制如下:运行机制这比较类似定时器的概念,在特定的时刻发送消息,根据消息处理相应的事件。
update()与 sleep()间接的相互调用就构成了一个循环。
这里要注意:mRedrawHandle绑定的是 Avtivity所在的线程,也就是程序的主线程;另外由于 sleep()是个异步函数,所以 update()与 sleep()之间的相互调用才没有构成死循环。
最后分析下游戏数据的保存机制,如下:这里考虑了 Activity的生命周期:如果用户在游戏期间离开游戏界面,游戏暂停;或者由于内存比较紧张, Android关闭游戏释放内存,那么当用户返回游戏界面的时候恢复到上次离开时的界面。
三、源码解析详细解析下源代码,由于代码量不大,以注释的方式列出如下:1、 Snake.javaJava代码1./**2. * <p>Title: Snake</p>3. * <p>Copyright: (C) 2007 The Android Open Source Project. Licensed under the Apache License, Version 2.0 (the "License")</p>4. * @author Gavin 标注5. */6.package com.deaboway.snake;7.import android.app.Activity;8.import android.os.Bundle;9.import android.widget.TextView;10./**11. * Snake: a simple game that everyone can enjoy.12. *13. * This is an implementation of the classic Game "Snake", in which you control a14. * serpent roaming around the garden looking for apples. Be careful, though,15. * because when you catch one, not only will you become longer,but you'll move16. * faster. Running into yourself or the walls will end the game.17. *18. */19.// 贪吃蛇:经典游戏,在一个花园中找苹果吃,吃了苹果会变长,速度变快。
碰到自己和墙就挂掉。
20.public class Snake extends Activity {21. private SnakeView mSnakeView;22. private static String ICICLE_KEY = "snake-view";23. /**24. * Called when Activity is first created. Turns off the title bar, sets up25. * the content views, and fires up the SnakeView.26. *27. */28. // 在 activity 第一次创建时被调用29. @Override30. public void onCreate(Bundle savedInstanceState) {31. super.onCreate(savedInstanceState);32. setContentView(yout.snake_layout);33. mSnakeView = (SnakeView) findViewById(R.id.snake);34. mSnakeView.setTextView((TextView) findViewById(R.id.text));35. // 检查存贮状态以确定是重新开始还是恢复状态36. if (savedInstanceState == null) {37. // 存储状态为空,说明刚启动可以切换到准备状态38. mSnakeView.setMode(SnakeView.READY);39. } else {40. // 已经保存过,那么就去恢复原有状态41. Bundle map = savedInstanceState.getBundle(ICICLE_KEY);42. if (map != null) {43. // 恢复状态44. mSnakeView.restoreState(map);45. } else {46. // 设置状态为暂停47. mSnakeView.setMode(SnakeView.PAUSE);48. }49. }50. }51. // 暂停事件被触发时52. @Override53. protected void onPause() {54. super.onPause();55. // Pause the game along with the activity56. mSnakeView.setMode(SnakeView.PAUSE);57. }58. // 状态保存59. @Override60. public void onSaveInstanceState(Bundle outState) {61. // 存储游戏状态到View里62. outState.putBundle(ICICLE_KEY, mSnakeView.saveState());63. }64.}2、 SnakeView.javaJava代码1./**2. * <p>Title: Snake</p>3. * <p>Copyright: (C) 2007 The Android Open Source Project. Licensed under the Apache License, Version 2.0 (the "License")</p>4. * @author Gavin 标注5. */6.7.package com.deaboway.snake;8.9.import java.util.ArrayList;10.import java.util.Random;11.12.import android.content.Context;13.import android.content.res.Resources;14.import android.os.Handler;15.import android.os.Message;16.import android.util.AttributeSet;17.import android.os.Bundle;18.import android.util.Log;19.import android.view.KeyEvent;20.import android.view.View;21.import android.widget.TextView;22.23./**24. * SnakeView: implementation of a simple game of Snake25. *26. *27. */28.public class SnakeView extends TileView {29.30. private static final String TAG = "Deaboway";31.32. /**33. * Current mode of application: READY to run, RUNNING, or you have already34. * lost. static final ints are used instead of an enum forperformance35. * reasons.36. */37. // 游戏状态,默认值是准备状态38. private int mMode = READY;39.40. // 游戏的四个状态暂停准备运行和失败41. public static final int PAUSE = 0;42. public static final int READY = 1;43. public static final int RUNNING = 2;44. public static final int LOSE = 3;45.46. // 游戏中蛇的前进方向,默认值北方47. private int mDirection = NORTH;48. // 下一步的移动方向,默认值北方49. private int mNextDirection = NORTH;50.51. // 游戏方向设定北南东西52. private static final int NORTH = 1;53. private static final int SOUTH = 2;54. private static final int EAST = 3;55. private static final int WEST = 4;56.57. /**58. * Labels for the drawables that will be loaded into the TileView class59. */60. // 三种游戏元61. private static final int RED_STAR = 1;62. private static final int YELLOW_STAR = 2;63. private static final int GREEN_STAR = 3;64.65. /**66. * mScore: used to track the number of apples captured mMoveDelay: number of67. * milliseconds between snake movements. This will decreaseas apples are68. * captured.69. */70. // 游戏得分71. private long mScore = 0;72.73. // 移动延迟74. private long mMoveDelay = 600;75.76. /**77. * mLastMove: tracks the absolute time when the snake lastmoved, and is78. * used to determine if a move should be made based on mMoveDelay.79. */80. // 最后一次移动时的毫秒时刻81. private long mLastMove;82.83. /**84. * mStatusText: text shows to the user in some run states85. */86. // 显示游戏状态的文本组件87. private TextView mStatusText;88.89. /**90. * mSnakeTrail: a list of Coordinates that make up the snake's body91. * mAppleList: the secret location of the juicy apples thesnake craves.92. */93. // 蛇身数组(数组以坐标对象为元素)94. private ArrayList<Coordinate> mSnakeTrail = new ArrayList<Coordinate>();95.96. // 苹果数组(数组以坐标对象为元素)97. private ArrayList<Coordinate> mAppleList = new ArrayList<Coordinate>();98.99. /**100. * Everyone needs a little randomness in their life 101. */102. // 随机数103. private static final Random RNG = new Random(); 104.105. /**106. * Create a simple handler that we can use to cause an imation to happen. We107. * set ourselves as a target and we can use the sleep( ) function to cause an108. * update/invalidate to occur at a later date. 109. */110. // 创建一个Refresh Handler来产生动画:通过sleep()来实现111. private RefreshHandler mRedrawHandler = new RefreshHan dler();112.113. // 一个Handler114. class RefreshHandler extends Handler {115.116. // 处理消息队列117.@Override118. public void handleMessage(Message msg) {119. // 更新View对象120. SnakeView.this.update();121. // 强制重绘122. SnakeView.this.invalidate();123. }124.125. // 延迟发送消息126. public void sleep(long delayMillis) {127. this.removeMessages(0);128. sendMessageDelayed(obtainMessage(0), delayMill is);129. }130. };131.132. /**133. * Constructs a SnakeView based on inflation from XML134. *135. * @param context136. * @param attrs137. */138. // 构造函数139. public SnakeView(Context context, AttributeSet attrs) {140. super(context, attrs);141. // 构造时初始化142. initSnakeView();143. }144.145. public SnakeView(Context context, AttributeSet attrs, int defStyle) {146. super(context, attrs, defStyle);147. initSnakeView();148. }149.150. // 初始化151. private void initSnakeView() {152. // 可选焦点153. setFocusable(true);154.155. Resources r = this.getContext().getResources(); 156.157. // 设置贴片图片数组158. resetTiles(4);159.160. // 把三种图片存到Bitmap对象数组161. loadTile(RED_STAR, r.getDrawable(R.drawable.redsta r));162. loadTile(YELLOW_STAR, r.getDrawable(R.drawable.yel lowstar));163. loadTile(GREEN_STAR, r.getDrawable(R.drawable.gree nstar));164.165. }166.167. // 开始新的游戏——初始化168. private void initNewGame() {169. // 清空ArrayList列表170. mSnakeTrail.clear();171. mAppleList.clear();172.173. // For now we're just going to load up a short def ault eastbound snake174. // that's just turned north175. // 创建蛇身176.177. mSnakeTrail.add(new Coordinate(7, 7));178. mSnakeTrail.add(new Coordinate(6, 7));179. mSnakeTrail.add(new Coordinate(5, 7));180. mSnakeTrail.add(new Coordinate(4, 7));181. mSnakeTrail.add(new Coordinate(3, 7));182. mSnakeTrail.add(new Coordinate(2, 7));183.184. // 新的方向:北方185. mNextDirection = NORTH;186.187. // 2个随机位置的苹果188. addRandomApple();189. addRandomApple();190.191. // 移动延迟192. mMoveDelay = 600;193. // 初始得分0194. mScore = 0;195. }196.197. /**198. * Given a ArrayList of coordinates, we need to flatte n them into an array199. * of ints before we can stuff them into a map for fla ttening and storage.200. *201. * @param cvec202. * : a ArrayList of Coordinate objects 203. * @return : a simple array containing the x/y values of the coordinates as204. * [x1,y1,x2,y2,x3,y3...]205. */206. // 坐标数组转整数数组,把Coordinate对象的x y放到一个int数组中——用来保存状态207. private int[] coordArrayListToArray(ArrayList<Coordina te> cvec) {208. int count = cvec.size();209. int[] rawArray = new int[count * 2];210. for (int index = 0; index < count; index++) { 211. Coordinate c = cvec.get(index);212. rawArray[2 * index] = c.x;213. rawArray[2 * index + 1] = c.y;214. }215. return rawArray;216. }217.218. /**219. * Save game state so that the user does not lose anyt hing if the game220. * process is killed while we are in the background. 221. *222. * @return a Bundle with this view's state223. */224. // 保存状态225. public Bundle saveState() {226.227. Bundle map = new Bundle();228.229. map.putIntArray("mAppleList", coordArrayListToArra y(mAppleList));230. map.putInt("mDirection", Integer.valueOf(mDirectio n));231. map.putInt("mNextDirection", Integer.valueOf(mNext Direction));232. map.putLong("mMoveDelay", Long.valueOf(mMoveDelay) );233. map.putLong("mScore", Long.valueOf(mScore)); 234. map.putIntArray("mSnakeTrail", coordArrayListToArr ay(mSnakeTrail));235.236. return map;237. }238.239. /**240. * Given a flattened array of ordinate pairs, we recon stitute them into a241. * ArrayList of Coordinate objects242. *243. * @param rawArray244. * : [x1,y1,x2,y2,...]245. * @return a ArrayList of Coordinates246. */247. // 整数数组转坐标数组,把一个int数组中的x y放到Coordinate对象数组中——用来恢复状态248. private ArrayList<Coordinate> coordArrayToArrayList(in t[] rawArray) {249. ArrayList<Coordinate> coordArrayList = new ArrayLi st<Coordinate>();250.251. int coordCount = rawArray.length;252. for (int index = 0; index < coordCount; index += 2 ) {253. Coordinate c = new Coordinate(rawArray[index], rawArray[index + 1]);254. coordArrayList.add(c);255. }256. return coordArrayList;257. }258.259. /**260. * Restore game state if our process is being relaunch ed261. *262. * @param icicle263. * a Bundle containing the game state 264. */265. // 恢复状态266. public void restoreState(Bundle icicle) {267.268. setMode(PAUSE);269.270. mAppleList = coordArrayToArrayList(icicle.getIntAr ray("mAppleList"));271. mDirection = icicle.getInt("mDirection");272. mNextDirection = icicle.getInt("mNextDirection");273. mMoveDelay = icicle.getLong("mMoveDelay"); 274. mScore = icicle.getLong("mScore");275. mSnakeTrail = coordArrayToArrayList(icicle.getIntA rray("mSnakeTrail"));276. }277.278. /*279. * handles key events in the game. Update the directio n our snake is280. * traveling based on the DPAD. Ignore events that wou ld cause the snake to281. * immediately turn back on itself.282. *283. * (non-Javadoc)284. *285. * @see android.view.View#onKeyDown(int, android.os.Ke yEvent)286. */287. // 监听用户键盘操作,并处理这些操作288. // 按键事件处理,确保贪吃蛇只能90度转向,而不能180度转向289.@Override290. public boolean onKeyDown(int keyCode, KeyEvent msg) {291.292. // 向上键293. if (keyCode == KeyEvent.KEYCODE_DPAD_UP) { 294. // 准备状态或者失败状态时295. if (mMode == READY | mMode == LOSE) { 296. /*297. * At the beginning of the game, or the end of a previous one,298. * we should start a new game.299. */300. // 初始化游戏301. initNewGame();302. // 设置游戏状态为运行303. setMode(RUNNING);304. // 更新305. update();306. // 返回307. return (true);308. }309.310. // 暂停状态时311. if (mMode == PAUSE) {312. /*313. * If the game is merely paused, we should just continue where314. * we left off.315. */316. // 设置成运行状态317. setMode(RUNNING);318. update();319. // 返回320. return (true);321. }322.323. // 如果是运行状态时,如果方向原有方向不是向南,那么方向转向北324. if (mDirection != SOUTH) {325. mNextDirection = NORTH;326. }327. return (true);328. }329.330. // 向下键331. if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) { 332. // 原方向不是向上时,方向转向南333. if (mDirection != NORTH) {334. mNextDirection = SOUTH;335. }336. // 返回337. return (true);338. }339.340. // 向左键341. if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) { 342. // 原方向不是向右时,方向转向西343. if (mDirection != EAST) {344. mNextDirection = WEST;345. }346. // 返回347. return (true);348. }349.350. // 向右键351. if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) { 352. // 原方向不是向左时,方向转向东353. if (mDirection != WEST) {354. mNextDirection = EAST;355. }356. // 返回357. return (true);358. }359.360. // 按其他键时按原有功能返回361. return super.onKeyDown(keyCode, msg);362. }363.364. /**365. * Sets the TextView that will be used to give informa tion (such as "Game366. * Over" to the user.367. *368. * @param newView369. */370. // 设置状态显示View371. public void setTextView(TextView newView) {372. mStatusText = newView;373. }374.375. /**376. * Updates the current mode of the application (RUNNING or PAUSED or the377. * like) as well as sets the visibility of textview fo r notification378. *379. * @param newMode380. */381. // 设置游戏状态382. public void setMode(int newMode) {383.384. // 把当前游戏状态存入oldMode385. int oldMode = mMode;386. // 把游戏状态设置为新状态387. mMode = newMode;388.389. // 如果新状态是运行状态,且原有状态为不运行,那么就开始游戏390. if (newMode == RUNNING & oldMode != RUNNING) { 391. // 设置mStatusTextView隐藏392. mStatusText.setVisibility(View.INVISIBLE); 393. // 更新394. update();395. return;396. }397.398. Resources res = getContext().getResources(); 399. CharSequence str = "";400.401. // 如果新状态是暂停状态,那么设置文本内容为暂停内容402. if (newMode == PAUSE) {403. str = res.getText(R.string.mode_pause); 404. }405.406. // 如果新状态是准备状态,那么设置文本内容为准备内容407. if (newMode == READY) {408. str = res.getText(R.string.mode_ready); 409. }410.411. // 如果新状态时失败状态,那么设置文本内容为失败内容412. if (newMode == LOSE) {413. // 把上轮的得分显示出来414. str = res.getString(R.string.mode_lose_prefix) + mScore415. + res.getString(R.string.mode_lose_suf fix);416. }417.418. // 设置文本419. mStatusText.setText(str);420. // 显示该View421. mStatusText.setVisibility(View.VISIBLE);422. }423.424. /**425. * Selects a random location within the garden that is not currently covered426. * by the snake. Currently _could_ go into an infinite loop if the snake427. * currently fills the garden, but we'll leave discove ry of this prize to a428. * truly excellent snake-player.429. *430. */431. // 添加苹果432. private void addRandomApple() {433. // 新的坐标434. Coordinate newCoord = null;435. // 防止新苹果出席在蛇身下436. boolean found = false;437. // 没有找到合适的苹果,就在循环体内一直循环,直到找到合适的苹果438. while (!found) {439. // 为苹果再找一个坐标,先随机一个X值440. int newX = 1 + RNG.nextInt(mXTileCount - 2);441. // 再随机一个Y值442. int newY = 1 + RNG.nextInt(mYTileCount - 2);443. // 新坐标444. newCoord = new Coordinate(newX, newY); 445.446. // Make sure it's not already under the snake447. // 确保新苹果不在蛇身下,先假设没有发生冲突448. boolean collision = false;449.450. int snakelength = mSnakeTrail.size(); 451. // 和蛇占据的所有坐标比较452. for (int index = 0; index < snakelength; index ++) {453. // 只要和蛇占据的任何一个坐标相同,即认为发生冲突了454. if (mSnakeTrail.get(index).equals(newCoord )) {455. collision = true;456. }457. }458. // if we're here and there's been no collision , then we have459. // a good location for an apple. Otherwise, we 'll circle back460. // and try again461. // 如果有冲突就继续循环,如果没冲突flag的值就是false,那么自然会退出循环,新坐标也就诞生了462. found = !collision;463. }464.465. if (newCoord == null) {466. Log.e(TAG, "Somehow ended up with a null newCo ord!");467. }468. // 生成一个新苹果放在苹果列表中(两个苹果有可能会重合——这时候虽然看到的是一个苹果,但是呢,分数就是两个分数。