基于Java的贪吃蛇游戏设计与实现

目 录

摘要

关键词

Key Words

1.游戏的功能与设计

1.1 需求分析

1.2  游戏实现的功能

1.3 游戏实现原理

1.4 可行性分析

2  基于J2ME的贪吃蛇游戏

2.1 游戏流程图

2.2 游戏在J2ME Wireless Toolkit上的仿真

2.2.1 游戏进入画面

2.2.2 贪吃蛇游戏画面

2.2.3 蛇吃食物时所改变的状态

2.2.4 贪吃蛇的撞击结束功能

2.2.5 查看数据排名

3 游戏的调试,bug与展望

3.1 游戏的调试与错误

3.1.1 游戏按键响应事件无效

3.1.2 打包成jar问题时出错

3.1.3程序的判断问题

3.1.4 加入播放声音后,游戏结束时声音变慢

3.2当前游戏还存在的bug

3.2.1 障碍物的bug

3.2.2 声音的bug

3.2.3 蛇体结束时的bug

3.3游戏未完成的展望

4.分析与总结

致谢

参考文献

基于Java的贪吃蛇游戏设计与实现

计算机科学与技术专业学生    刘辉

指导教师    黄芬

摘要:随着计算机的普及,电脑游戏也慢慢融入人们的生活中,成为人们放松心情的一种方式。贪食蛇作为一款经典且易于操作的游戏,一直受到人们的青睐。本文首先介绍了贪吃蛇游戏的设计方案、贪吃蛇的实现原理;然后以Java的微缩版J2ME为开发平台,开发实现了移动平台下的贪吃蛇游戏,并在J2ME Wireless Toolkit 2.5.2的手机模拟器中进行了游戏仿真;最后,叙述了游戏开发过程中出现的错误以及错误调试,并探讨了游戏存在的bug,对游戏未完成功能进行了展望。

关键词:Java、J2ME、贪吃蛇

Research and implement huge memory game based on Java

Student majoring in computer science and technology    Liu Hui

 Tutor     Huang Fen

Abstract:With the popularity of computer, computer games also slowly into people's life, become people to relax a kind of means. Gluttony snake as a classic and easy to operate, the game has been favored.This paper first introduced the snake game design scheme,snake in principle;And then to Java version for miniature of the J2ME development platform,the development achieved mobile the workbench snake game,and in J2ME Wireless Toolkit 2.5.2 phone simulator in simulation game;Finally,describes the development process of the mistakes and errors commissioning,and discusses the existing bug game,the game is not complete function is discussed.

Key Words:Java; J2ME; Greedy snake

手机的普及导致手机游戏市场呈现爆炸式的发展,随着手机性能的增强,手机游戏的市场在未来几年里将猛增至数十亿美元[1]。在这种状况下对手机游戏开发的需求将大幅上涨。而现在,手机的性能以及赶上甚至超过目前运行游戏的家用游戏机,甚至部分个人计算机了,手机的游戏也日渐丰富,日渐完善。与之相对应的则是国产手机游戏的质量并没有明显提升,而相比之下,外国的著名开发商如Gameloft, Fishlab却一直推出不同类型不同题材的优秀游戏(其中不少是免费),其质量远非国产游戏能比。但同时可以看到国产手机游戏在具有中国特色的游戏题材的探索方面作了不少努力,并获得好评。可见在坚持原创的基础上是可以开发出受欢迎的游戏的,而在中国对于原创的优秀游戏还存在巨大的市场。

贪吃蛇游戏作为一种形成时间较长的经典游戏类型,如战锤系列、火焰之文章系列、超级玛丽系列等等,起初是计算机性能所限的产物,如今在个人计算机和家用游戏机市场已经没落,但是在性能较差的掌机和休闲平台(如手机,电视)仍然有很大的发展空间。然而本次设计不只是开发一款单纯的贪吃蛇游戏,为了将游戏与所学的专业知识相结合起来,故将游戏的环境设定在windows的Java环境中[2],以J2ME wireless toolkit为手机模拟环境。作为J2ME的标准开发工具包,J2ME Wireless Toolkit 在J2ME前进的道路上可谓功不可没。自从 2000 年初次亮相以来,该工具包一直在发展以赶上移动 Java 技术外观上快速改变的步伐。不要被从 2.1 版本以来的小改变所误导。新的工具包在四个重要的领域支持 Java Community Process (JCP) 所指定的新的可选 API:3D 图形、多媒体通信、蓝牙连网(Bluetooth networking)和数据管理。这里的四个领域几乎包含了当今社会移动涉笔所能涉及的领域[3]。

J2ME Wireless Toolkit 2.5.2 不仅仅是一个出色工具的增量更新。它包括了对令人激动的四项新规范的支持,同时定义了六种新的 API。随着无线 Java 技术世界的快速发展,J2ME Wireless Toolkit 紧紧跟随发展的步伐并且包含您所需的全部工具[4]。使用J2MEWireless Toolkit作为本次试验的模拟器也是为了突出本设计在构想上的独立。

本文首先介绍了贪吃蛇游戏设计方案、贪吃蛇的实现原理;然后将游戏在J2ME Wireless Toolkit 2.5.2的手机模拟器中进行仿真;然后是对游戏中所出现的错误的调试、bug以及对游戏未完成的展望。

1.游戏的功能与设计

1.1 需求分析

本系统主要是完成贪吃蛇游戏的基本操作。让用户可以自己练习和娱乐。本系统需要满足以下几点要求:

1) 利用方向键来改变蛇的运行方向。

2) 在运行情况下右软键暂停或继续游戏,左软键结束或重开始游戏。

3) 吃到食物就变成蛇体变长,碰到壁、自身或障碍物则游戏结束,否则正常运行。当吃到一定量的食物时,本级游戏过关,自动进入贪吃蛇下一关,相应的数据改变。

4)当游戏结束时,记录数据并与原记录集中数据进行重新排序,超出数据记录集的部分数据删除。此时若想查看自己分数排名则可操作右软键即可查看分数排名。

5)游戏结束时,除了画面显示之外,还有音乐播放。

1.2  游戏实现的功能

游戏的主要功能如下:

  1. 开始时,游戏角色处于界面左上方,通过按键控制上下左右;
  2. 当游戏开始时,角色通过移动到食物位置吃食物来增长蛇体;
  3. 游戏界面中有些障碍物,蛇体不能碰到障碍物、自身、或者墙壁,否则游戏结束;
  4. 游戏还有计分功能,每当蛇吃一次食物时,计分会根据当前游戏等级加分;
  5. 当游戏结束的时候,会对记录中的分数进行排序,并列出前10名以供查看。

1.3 游戏实现原理

游戏实现原理如下:

  1. 通过读取按键响应来控制蛇体前进的方向;
  2. 通过读取蛇头的坐标是否与食物、自身、障碍物和墙壁的坐标重合来判定蛇是否是吃食物还是游戏结束;
  3. 通过读取蛇吃食物的个数和游戏等级相乘以即时得到游戏的分数;
  4. 通过分数比较将前10位分数输入到记录系统中并显示。
  5. 读取游戏结束函数并播放结束音乐。

1.4 可行性分析

本次设计所采用的工具为windows下的Eclipse。所配置的环境为JDK 1.6.0_21。Eclipse是由IBM公司耗巨资开发的集成开发工具,也是目前最流行的Java集成开发工具之一,基于Java语言编写,并且是开放源代码的、可扩展的开发工具。Eclipse平台最具特色的特征,也是其区别于其他开发工具的特征为:他的平台体系结构是在插件概念的基础上构建的[5]。

而贪吃蛇游戏是一种简单的大众的游戏,自从计算机实现以来,深受广大电脑玩家的喜爱。

贪吃蛇的核心算法是如何实现移动和吃掉食物,以及及时修改相对应的数据,如蛇体长度,分数等。

当游戏开始时,将蛇体设为一个数组,蛇体每个方向为一个数组元素,包括蛇体方向,蛇体坐标,此方向蛇体长度。当蛇头没有碰到食物的时候,把当前运动方向上的下一个节点坐标记录,重画蛇体,以达到蛇移动的效果。而在吃到食物的时候,则只需改变数组最后一个元素的蛇体长度,然后重画蛇体即可。本次设计实现贪吃蛇的基本的蛇身移动、吃到食物身体增长、和碰到墙壁或自身死亡,能够暂停和开始。

当蛇体吃到食物时,相对应的响应事件除了蛇体成长之外,还有分数的改变。分数会收到蛇吃到的食物个数,蛇每吃一次食物,个数加一,于是分数便为食物个数乘以游戏等级乘以单体食物分数,重写分数,以达到分数即时改变的效果。

当游戏结束的时候,游戏响应显示“Game Over”事件时,会即时将分数,游戏名等数据发送到rms中,并与数据中记录的Topscore数据记录系统表进行比较。同时游戏会响起结束音乐。排序后超过一定名次外的删除。以便玩家能够即时的查看自己的分数与名次。

2  基于J2ME的贪吃蛇游戏

J2ME就是手机上的Java开发平台,主要针对消费类电子设备的,例如蜂窝电话和可视电话、数字机顶盒、汽车导航系统等等[6]。

J2ME目前成为创建移动设备、消费电子产品,以及嵌入式设备的新应用的最合适的平台[7]。因此,为了贴近实战,本次设计变采用J2ME作为手机开发平台[8]。

2.1 游戏流程图

1)进入游戏,输入游戏名,选择游戏等级。选择“OK”键,倘若此时需要关闭程序,则点击“Exit”键;

2)点击“OK”键之后,游戏进入运行状态,同时画面变为蛇在初始右方向移动,此时可以通过手机的上下左右键或者2,4,6,8数字键来控制蛇的移动方向。若长按游戏方向键,则蛇移动速度会加快,若松开则蛇恢复之前的速度。此时若想关闭程序,点击“Exit”键;

3)若蛇撞到障碍物,或者撞到自身又或者撞到墙壁,则显示“Game Over”并播放结束音乐。同时左右键改变。若想重新开始,点击左键“Restart”键。若不想,想查看自己分数的排名,则点击右键“menu”键中的“TopScore”键,则可以查看到自己分数的排名,当然倘若自己的分数比最后一名还低,则自己的数据是进不了排行榜的。若想结束,则点击“Exit”键;

4)若蛇成功的吃到了一块食物,则首先蛇体增长,变长了;其次,分数会跟据当前的游戏的等级增加相应的分数;

5)当蛇吃到了一定量的食物之后,游戏等级会提高,表示游戏已过此关,并进入下一关。

2.2 游戏在J2ME Wireless Toolkit上的仿真

结束环境配置之后,游戏在J2ME Wireless Toolkit[9]的手机模拟器中进行仿真开始。

2.2.1 游戏进入画面

进入游戏画面,游戏界面会显示要求玩家输入游戏名以及选择游戏等级,以便于游戏结束时记录游戏数据:

本界面设计所采用的是继承Form类的表格类,通过对类的构造函数的编写,对按键事件的响应,使得界面看起来非常简洁。部分代码如下:

public MySnake_InputForm() {

super("请输入数据");

tx_Name = new TextField("Name","USER",8,TextField.ANY);

String[] nLevel = {"level 1","level 2","level 3","levell 4"};

level = new ChoiceGroup("游戏等级",ChoiceGroup.EXCLUSIVE,nLevel,null);

cmd_Exit = new Command("EXIT",Command.EXIT,1);

cmd_OK = new Command("OK",Command.OK,1);

this.addCommand(cmd_Exit);

this.addCommand(cmd_OK);

this.append(tx_Name);

this.append(level);

this.setCommandListener(this);

}

2.2.2 贪吃蛇游戏画面

按照实用性及功能实现为主的设计原则,贪吃蛇的游戏画面设计比较简洁,如蛇体是直接以长条代替,食物直接以方块代替。而障碍物也是以长条代替。以下截图以游戏等级为4级为例:

由截图可以看出,左右软键功能已经变化了,按右键可以暂停游戏,而按左键则结束游戏。以游戏等级4级为例的时候,游戏中出现4个障碍物。而右边的记录系统则记录了玩家的游戏名,游戏等级以及此时的游戏分数。我们通过上下左右键或者数字键(2,4,6,8)来控制蛇的移动方向,而当我们长按蛇当前方向键时,可以发现蛇在此方向上的移动速度加快了,而我们松开按键时,蛇的速度又恢复原样了。这与J2ME的内部架构有关系,J2ME中有三个函数keyPressed(int keyCode)、keyRepeated(int keyCode)和keyReleased(int keyCode)。这三个函数分别实现按键响应事件,长按键响应事件以及按键释放响应事件。所以我们可以通过前两个函数来控制蛇的方向以及蛇的速度,而通过第三个函数来恢复蛇的速度,部分代码实现如下:

protected void keyPressed(int keyCode){

//实现对按键事件的响应

int action=this.getGameAction(keyCode);

switch(action){

case Canvas.DOWN:

snake.setDirection(MySnake.DOWN);

break;

case Canvas.UP:

snake.setDirection(MySnake.UP);

break;

case Canvas.LEFT:

snake.setDirection(MySnake.LEFT);

break;

case Canvas.RIGHT:

snake.setDirection(MySnake.RIGHT);

break;

}

……

……

}

protected void keyRepeated(int keyCode){

//实现对长按键事件的响应

int action=this.getGameAction(keyCode);

……

……

……

switch(keyCode){

case Canvas.KEY_NUM8:

snake.setDirection(MySnake.DOWN);

break;

case Canvas.KEY_NUM2:

snake.setDirection(MySnake.UP);

break;

case Canvas.KEY_NUM4:

snake.setDirection(MySnake.LEFT);

break;

case Canvas.KEY_NUM6:

snake.setDirection(MySnake.RIGHT);

break;

}

}

protected void keyReleased(int keyCode){

//实现对按键释放的响应

this.level = this.game_Level;

}

由图中可以看出,4级的游戏出现了4个障碍物,而障碍物的设计也是为了增加游戏玩乐的复杂度,增加游戏的乐趣。出现障碍物的位置虽然是随机的,但是我们需要对障碍物的位置进行判断。因为,首先,障碍物不能出现在游戏界面以外的地方;其次,障碍物不能出现在蛇初始的地方;最后,障碍物不能与食物重合,不然蛇永远也吃不到食物了。因此,针对障碍物的此种判断复杂情况, 我分设了三种情况:

  1. 对障碍物的位置。

障碍物的坐标是随机的,那么为了防止障碍物出现在界面之外,我将障碍物长度固定,将障碍物左上角坐标随机在游戏界面之内并且离界线至少相隔1个障碍物大小的任意处,同时为了障碍物的多样化,我通过判断画出障碍物可以再x轴方向或者y轴方向,部分代码:

x_Obstacle = (int)r.nextInt(sCanvas.getx_CellNum()-10);

y_Obstacle = (int)r.nextInt(sCanvas.gety_CellNum()-10);

其中,x_Obstacle为障碍物左上角x坐标,y_Obstacle为障碍物左上角y坐标。

  1. 对障碍物不能与蛇体相遇的判断。

因为蛇的初始坐标是固定,所以我在蛇类中设置判断,而在生成障碍物时,则对障碍物进行判断,若不符合要求则重新生成障碍物。判断代码如下:

public boolean isPtInObstacle(Snake_Obstacle obstacle){

SnakePart sp;

synchronized(snakeparts){

sp = (SnakePart)snakeparts.elementAt(0);

if(obstacle.get_Start_X() <= sp.getStartX() && obstacle.get_End_X() >= sp.getEndX() && obstacle.get_Start_Y() <= sp.getStartY() && obstacle.get_End_Y() >=sp.getEndY()){

return true;

}

}

return false;

}

其中,sp为蛇头的坐标,因为初始蛇是直线,所以次判断中sp就是整个蛇。对于此判断函数的应用如下所示:

obstacle.createObstacle();

 while(snake.isPtInObstacle(obstacle)){

obstacle.createObstacle();

}

obstacle.paint(g);

其中,obstacle.createObstacle()函数是重新生成障碍物坐标的函数。而paint(Graphics g)函数则是画障碍物函数。

对于分数与游戏名等数据的搜集数据库则是通过J2ME中自带的RMS(Record Manage System)。因为手机中也有自带的rms,所以我便使用其作为我的数据库。分数的即时性是通过所吃食物的变化来体现的,当食物被吃时,已吃食物变量便会加一,而分数则是乘以当前已吃食物再乘以当前等级所得到的。部分代码如下:

private void saveScore() {

//本函数用于保存分数

if(nScore<=0)

return;

ScoreRecordStore srs=new ScoreRecordStore();

Vector v=new Vector();

v=srs.loadScoreRecord("SnakeScore10");

if(v.size()<10){

MyGame_Record r=new MyGame_Record((short)nScore,user_Name);

v.addElement(r);

srs.saveScoreRecord(v,"SnakeScore10");

}else{

MyGame_Record rt=(MyGame_Record)v.lastElement();

if(nScore>rt.game_Score){

v.removeElementAt(9);

MyGame_Record r=new MyGame_Record((short)nScore,user_Name);

v.addElement(r);

srs.saveScoreRecord(v,"SnakeScore10");

}

}

}

2.2.3 蛇吃食物时所改变的状态

由下图可以看出,当贪吃蛇吃了食物后,分数会即时增加。

2.2.4 贪吃蛇的撞击结束功能

下面演示的三种致使游戏结束的贪吃蛇撞击画面:

1)最简单的撞墙事件:

当蛇头的坐标与边界重合的时候就会使游戏结束,具体代码如下:

public boolean isPtInBound(int x, int y) {

// TODO Auto-generated method stub

if(x<0||x>(x_CellNum-1)){

return false;

}

if(y<0||y>(y_CellNum-1)){

return false;

}

return true;

}

2)蛇体撞到自身致使游戏结束画面:

当蛇头的坐标与蛇体坐标重合的时候,也会使游戏结束。这时候判断则是要判断蛇头的坐标是否是在蛇体坐标之内了。具体代码如下:

public boolean isPtInPart(int x,int y){

switch(dir){

case MySnake.LEFT:

return ((y==this.y)&&((x>=this.x)&&(x<=this.getEndX())));//y方向相同且x方向在蛇头跟蛇尾之间为真

case  MySnake.RIGHT:

return ((y==this.y)&&((x<=this.x)&&(x>=this.getEndX())));//同上

case MySnake.UP:

return ((x==this.x)&&((y>=this.y)&&(y<=this.getEndY())));//x方向相同且y方向在蛇头跟蛇尾之间为真

case MySnake.DOWN:

return ((x==this.x)&&((y<=this.y)&&(y>=this.getEndY())));

}

return false;

}

3)蛇撞到障碍物致使游戏结束画面:

同样的,与障碍物的碰撞也是以坐标重合来判断的,只要蛇头的坐标与障碍物重合,则判定相撞,游戏结束。判断代码如下:

public boolean isPtInObstacle(int x,int y,int x_Start,int y_Start,int x_End,int y_End){

if(x == x_Start)

return (y>=y_Start && y < y_End);

if(y == y_Start)

return (x >= x_Start && x < x_End);

return false;

}

与其他判断不太一样的是,由于游戏等级不同,出现的障碍物不可能只有一个,因此,障碍物的判断是具体到障碍物的左上角坐标与右下角坐标,而代码中另建一二维数组用于存储障碍物的坐标。

2.2.5 查看数据排名

由上图可以看出,当游戏结束时,左右下方按键响应也发生改变。左键用于重新玩游戏,点击后可回到游戏进入画面。而右键则是进入分数记录排行榜页面:

  1. 游戏的调试,bug与展望

3.1 游戏的调试与错误

3.1.1 游戏按键响应事件无效

程序所出现的错误:在模拟器上运行时,上下左右按键是有效的,但是使用2、4、6、8按键时却出现无效的效果,即使我对数字键进行了相应的数字按键响应处理。查阅相关文档后却发现无此方面的问题,当时认定是模拟器的问题,故而放在一边,时隔不久,我程序做完之后再返回测试的时候却终于发现了问题所在:

protected void keyPressed(int keyCode){

int action=this.getGameAction(keyCode);

switch(action){

case Canvas.DOWN:

case Canvas.KEY_NUM8:

snake.setDirection(MySnake.DOWN);

break;

case Canvas.UP:

case Canvas.KEY_NUM2:

snake.setDirection(MySnake.UP);

break;

case Canvas.LEFT:

case Canvas.KEY_NUM4:

snake.setDirection(MySnake.LEFT);

break;

case Canvas.RIGHT:

case Canvas.KEY_NUM6:

snake.setDirection(MySnake.RIGHT);

break;

}}

当时为了图省事,将两个相对应的按键响应事件写在一起,以达到减少代码量的问题,但是这时问题出现了:手机的上下左右键,我们通常称为特殊键,是因为它不在编号之类的,所以当我们需要对它做出事件响应的时候,我们需要首先将它转换为游戏键,也即上面代码中的this.getGameAction(keyCode)函数,这样我们才能对它进行事件响应。因此当初的处理方案导致如下的问题:数字键不是特殊键,它是可以直接进行事件响应的,但是数字键没有游戏键,当把数字键转换的时候,数字键是转不了的,这样就造成了数字键响应事件无效,因为在转换的时候数字键就已经丢失了。所以解决的办法是在下面再进行按键事件响应,单独响应数字键。问题顺利解决了。

3.1.2 打包成jar问题时出错

在程序完成调试后,进行jar[10]打包到手机中测试时,发现打包出现问题:

missing jar url in the jad descriptor.com.sun.kvem.midletsuite.invalidiadexception:reason = 18。

意为打包jad时丢失了jar文件的位置。经各方查资料及网上请教之后终于弄明白需要在根目录下的jad(双击jad)文件中将包中MIDlet类添加后就可以了,这样打包时系统才会默认将jad文件与jar联系起来。造成打包丢失的真正原因是:jar包在运行时找不到MIDlet文件。而J2ME自动添加的MIDlet类不是我们自己所编写的继承的MIDlet类。故而会出现打包丢失问题。

3.1.3程序的判断问题

在程序初步完成时,曾出现过没有食物的现象,经求教网上与身边同学后才发现,我虽然判断食物出现的地方是否与障碍物坐标重复起来。但是当食物就紧贴着障碍物一端的时候玩家是不太容易区分开来的,而且我对障碍物与食物的颜色都是采用的随机设置的方案,故而有时食物颜色会与障碍物相同,此时当食物与障碍物紧贴在一起的时候很难去区分开来。因此,我在对食物与障碍物之间的判断时候,有意拉开一定的距离,即,在障碍物两端顶头一格是不能出现食物的。代码实现如下:

public boolean foodIsPtInObstacle(int x,int y,int x_Start,int y_Start,int x_End,int y_End){

if(x == x_Start)

return (y>=y_Start-1 && y <= y_End);

if(y == y_Start)

return (x >= x_Start-1 && x <= x_End);

return false;

}

看起来好像与蛇和障碍物判断一样,其实不是的。可以看见,我对障碍物的初始坐标减一,对右下角终点目标加一,这里虽然没有加一,但其实x_End与y_End坐标点块是无物体的,即障碍物的坐标是左闭右开区间的。

3.1.4 加入播放声音后,游戏结束时声音变慢

在游戏的结束时,因为加入了音乐播放,使得“Game Over”出现了肉眼可见的慢了一步。也因为这个原因,我在后来的调试与改进中并未加入背景音乐。因为担心加入之后,游戏操作会变得更慢,与游戏当初设计的实用性不符合。我个人认为,之所以加入音乐之后,使得结束会变慢,是因为,加入音乐多了好几个抓住异常模块,正是这些模块而导致的运行变慢。

3.2当前游戏还存在的bug

任何设计都会存在bug,本次设计业不例外,在软件功能实现的过程中,我整理出了部分游戏bug。

3.2.1 障碍物的bug

1)在设置障碍物的时候,虽然我考虑到了与蛇体、食物不能重合的问题,但是并没有考虑到障碍物本身重合的问题,所以有极其低的概率出现两个障碍物完全重合只显示一个障碍物的问题;

2)虽然我判断了障碍物跟蛇体不能接触,并且要远离蛇体不止一个蛇体单位的距离,但是在2级以上的游戏等级中,游戏有极其低的概率出现障碍物直接将蛇体困死的画面;

3)为了增加游戏复杂度,我并没有判断障碍物不能接触,这样子游戏等级为4级的时候可能会出现一种极端情况,4个障碍物首尾相连,直接将食物困在里面,而致使蛇永远吃不到食物。

障碍物的设计本是为了让游戏复杂化,更能玩出乐趣,然而由于框架设计的问题,致使障碍物本身存在了一些bug,尽管这些bug的出现几率极低,但如能解决了,又是一大幸事。

3.2.2 声音的bug

在上文中说过,加入了游戏结束音乐虽然使得游戏看起来功能多样化了,但是在游戏运行速度方面慢了。而当游戏结束时,若立即点击“Restart”键重新开始,结果是音乐并未关闭,尽管我已经设置了音乐关闭。

3.2.3 蛇体结束时的bug

其实这个不能算是bug吧,因为当时设定的就是重合时判定。所以每次蛇头总要嵌入自身、障碍物或者墙壁才能判定游戏结束。但是也不能设定不重合,如果判定刚接触到就结束的话,那蛇体就不能贴着自身、障碍物或者墙壁移动了。

3.3游戏未完成的展望

对于游戏一些展望都是在游戏代码实现的过程中进行螺旋式发展中所设想出来的,但由于时间关系,我并不能将所有的功能都实现。故而在这里将我的设想说出来。以后有时间的话我会实现这些功能的:

1)声音的多样化。虽然目前因为加了结束音乐,致使游戏结束时运行较慢。但这个问题肯定可以解决的,我们可以将游戏的背景音乐添加,同时为上下左右以及相应的数字键添加注释音。同时还可以设置自由选择游戏声音关与闭。

2)图形界面的美化。由于本次试验我着重于游戏功能的实现而忽略了游戏界面的美观。因此在以后的改进中可以将蛇美化,画出一条真正的蛇样;可以在游戏过关从1级进入2级的时候进行过关奖励,如一段搞笑视频等等,并美化界面。

3)增加障碍物的复杂度。增加障碍物的复杂度以增加游戏的趣味性,如我可以固定障碍物的几个模式,然后将这些障碍物的模式随机选择后放入游戏中,这样既能增加游戏的趣味性,又能提高游戏的实用性。同时,还需要对以上所说的bug进行修改。

4)对游戏食物的多样化。当前游戏的食物从1级到4级每次出现都是一个食物,且等这个食物被吃才会出现下一个食物。以后的改进当中我可以对食物进行多样化。比如可以改变食物的长度与相对应的分数;比如可以在游戏等级2级以上的时候同时出现与等级相同的食物,而这些食物出现有时间限制,而时间会随着等级的提高而缩短,若未能达到一定分数则判定游戏失败。

5)数据记录的多样化。当前游戏数据记录只是记录了玩家游戏名,游戏分数,而并没有记录游戏的等级。后期改进时可以进行分级记录,各等级的排名相隔开而不再都放进一个记录集里面。

4.分析与总结

本次设计实验完成后,让我对程序的设计、实现、调试与维护进行了切实的体验。深刻的了解到了前期设计对于整个软件编程过程是多么重要。因为设计的不完善,在随后的调试当中走了好多的弯子。而实际上,本次设计代码实现当中所出现的绝大部分问题,都是由于我在前期设计时候的不完善,设计太粗犷所引起的。而实际上整个过程中唯独编程(即实现)所花时间是最少的,在调试阶段所花的时间最多。但幸运的是,因为采用螺旋式设计方式帮助我解决了很大一部分问题,并让我对设计的理解的深化,虽然由于时间问题,我在工作过程中的很多有趣的设想并没有完成。但就现在而言,我的收获已经是很巨大的了,不仅仅是对于编程能力的提高,还有对于软件设计的理解,这对我以后的工作成长道路将会有巨大的作用。

致谢

在此论文即将完成之际,首先我要向我的指导老师黄芬副教授表示衷心地感激……

参考文献

[1]张学习,连爽.一种新的J2ME平台下的战旗类游戏设计与实现[J].计算机工程与应用,2011,47(11):57-59.

[2] 李钟尉,周小彤,陈丹丹等.Java从入门到精通[M].18

[3]王森.利用Java撰写手机应用程序(5)——J2ME Wireless Toolklt篇[J].程序员2002 (4):1.

[4]Michael Kroll,Stefan Haustein.J2ME Application Development[M].U.S.A:Sams Publishing,2002:10-22.

[5](美)Bruce Eckel 著.Java编程思想[M],陈昊鹏,饶若楠等译.北京:机械工业出版社,2007:12-13.

[6]James Keogh.J2ME The Complete Reference[M].California U.S.A.:Brandon A.Nordin,2003:169-170.

[7]陆昌辉.J2ME应用开发详解[M].北京:电子工业出版社,2009.4:6-7.

[8]和凌志,郭世平.手机软件平台架构解析[M].北京:电子工业出版社,2009:182.

[9] Wellls M J.J2ME游戏编程[M].李鹏,陈炜,任俊伟,译.北京:清华大学出版社,2005.

[10]邹艳珍,刘昌盛等.一种基于Internet的JAR包使用信息收集方法[J].计算机科学 2011,38 (06):161.

附录 

南京农业大学

本科生毕业论文(设计)指导教师审查意见表

(由指导教师填写)

学院

信息科技学院

专业

计算机科学与技术

姓名

刘辉

论文题目

基于Java的贪吃蛇游戏设计与实现

一、对待毕业实习的态度及实习期间遵守纪律情况

优良(15—11分)

一般(10—6分)

较差(5—0)

二、观察、收集、整理、查阅资料及运用数据的水平

优良(30—21分)

一般(20—11分)

较差(10—0分)

三、学生的独立工作能力和动手能力

优良(20—16分)

一般(15—11分)

较差(10—0分)

四、毕业论文写作的规范化程度

优良(15—11分)

一般(10—6分)

较差(5—0分)

五、毕业论文(设计)总体评价

优良(20—16分)

一般(15—6分)

较差(5—0分)

审查意见、成绩及能否提交答辩:

                                                              

指导教师签名:                    年   月   日

教务处制表

南京农业大学

本科生毕业论文(设计)评阅教师评阅意见表

(由评阅教师填写)

学院

信息科技学院

专业

计算机科学与技术

姓名

刘辉

论文题目

基于Java的贪吃蛇游戏设计与实现

一、论文选题的价值与合理性

优秀(15—11分)

一般(10—6分)

较差(5—0)

二、论文的难度、工作量大小和创新性

优秀(30—21分)

一般(20—11分)

较差(10—0分)

三、数据资料分析、归纳、概括及运算的能力

优秀(20—16分)

一般(15—11分)

较差(10—0分)

四、文字表达水平、文章的逻辑性

优秀(15—11分)

一般(10—6分)

较差(5—0分)

、论文写作的规范化程度

优秀(20—16分)

一般(15—6分)

较差(5—0分)

评阅意见、成绩及能否提交答辩:

                              

评阅教师签名:                    年   月   日

教务处制表


南京农业大学

本科生毕业论文(设计)答辩及综合评分表

(由答辩小组填写)

学院

信息科技学院

专业

计算机科学与技术

姓名

刘辉

论文题目

基于Java的贪吃蛇游戏设计与实现

一、内容的科学性、应用性和创新性

优秀(30—21分)

一般(20—11分)

较差(10—0)

二、论文写作水平及知识面掌握程度

优秀(30—21分)

一般(20—11分)

较差(10—0分)

三、语言表达能力、逻辑思维能力、回答问题的正确性

优秀(40—31分)

一般(30—11分)

较差(10—0分)

论文答辩意见及成绩:

答辩小组负责人(签名):                 年   月   日

本科生毕业论文(设计)综合评定成绩

(由答辩小组填写)

指导教师评定成绩30%

毕业论文(设计)评阅成绩30%

毕业论文(设计)答辩成绩40%

综合评定成绩100%

注:综合评定成绩等级:优秀(90-100),良好(80-89),中等(70-79),及格(60-69),不及格(60分以下)。

答辩小组负责人(签名):                 年   月   日

  • 0
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等天晴i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值