java贪吃蛇.docx
《java贪吃蛇.docx》由会员分享,可在线阅读,更多相关《java贪吃蛇.docx(20页珍藏版)》请在冰豆网上搜索。
![java贪吃蛇.docx](https://file1.bdocx.com/fileroot1/2023-2/4/a1596821-de33-48b2-abd8-7b26dbd0fd3d/a1596821-de33-48b2-abd8-7b26dbd0fd3d1.gif)
java贪吃蛇
武汉理工大学华夏学院
课程设计报告书
课程名称:
Java课程设计
题目:
Java贪吃蛇
系名:
信息工程系
专业班级:
软件2111
姓名:
郭和朋
学号:
10225611102
指导教师:
2013年01月18日
课程设计任务书
学生姓名:
郭和朋专业班级:
软件2111
指导教师:
詹春华工作单位:
信息系
设计题目:
《贪吃蛇游戏的设计与实现》
初始条件:
掌握基本的Java程序设计基础。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
主要任务:
1.完成一个贪吃蛇游戏;
2.该游戏具备:
计分、暂停、加速、减速等功能;
设计报告撰写格式要求:
1、写出游戏中用到的主要数据结构的设计;
2、写出游戏界面用到的主要技术;
3、写出贪吃蛇模型类的设计思想;
4、其他程序中用到的主要技术;
5、本次课程设计的感受。
时间安排:
2013-1-14---2013-1-19
2013-1-19系统验收;
2013-1-19~~2013-1-22提交课程设计报告;
指导教师签字:
2013年1月14日
系主任签字:
年月日
1.设计任务与要求
1.1设计任务
设计一个贪吃蛇的游戏
功能要求:
能够显示贪吃蛇的运动,能通过键盘控制贪吃蛇的运行,能够处理蛇在运行中个各种情况,以及其它的辅助功能;要提供主要的设计思路、数据结构的设计。
设计任务要完成设计、编码、测试等过程,给出设计思路、设计说明书、主要代码的
说明、使用说明书。
源代码以及可运行的贪吃蛇游戏。
1.2具体要求
具体内容如下:
①设计任务与要求
②总体方案与说明
③面向对象的设计(主要类的设计)
④源程序清单与注释
⑤软件主要模块流程图
⑥问题分析与解决方案(包括调式记录、调式报告,即在调式过程中遇到的主要问题、解决方法及改进设想);
⑦小结与体会
附录:
①源程序(必须有简单注释)
②使用说明
③参考资料
2.总体方案与说明
2.1总体方案
我设计的贪吃蛇主要利用键盘控制蛇的前进移动方向,是否吃到食物,是否撞墙以及是
否暂停、开始游戏等。
当吃到食物的时候,蛇就自动长大一格,在游戏中可进行暂停和开始
操作。
中途若是撞到墙或是撞到自己,同样也结束。
背景和蛇的颜色可随时更换。
2.2系统模块
根据总体方案,我把贪吃蛇游戏分为:
游戏界面设置(即绘图)、贪吃蛇蛇身及运动设
置和游戏龙之设置三大模块来设计。
2.2.1游戏界面设置
游戏界面设置包括:
游戏区设置、游戏帮助信息设置、游戏分数查看区。
游戏界面使用简单和直观的布局设计,游戏区放置在界面的主题位置上,在游戏区上部放置分数,在游戏区下部放置使用说明帮助,具体设计效果如图2-1所示。
图2.1游戏主题界面设计效果
2.2.2贪吃蛇蛇身及运动设置
贪吃蛇的蛇身设置是整个游戏设计的关键。
它的基本思路是:
去掉蛇尾,显示并移动
出蛇头外蛇身,根据蛇身的运动方向,决定蛇头的位置,完成蛇头吃食物的处理操作,显示蛇头。
图2.2贪吃蛇撞墙后效果
而蛇运动的四个方向,则通过按键来控制。
蛇吃到一个食物,就加分。
每次食物出现的位置不能在蛇身上,如果蛇在运动的过程中撞到自己或者撞墙,则游戏结束,具体效果如图2.2所示,图2.2就是蛇撞到墙之后,提示游戏结束。
2.2.3游戏控制设置
游戏控制设置就是控制游戏的暂停与开始。
设置PageUp(加速),PageDown(减速)
按键来控制速度,设置空格或着p按键来暂停进行中的游戏,设置ENTER或着R或者S按键来开始暂停的游戏。
3.面向对象的设计
贪吃蛇游戏各模块及程序流程有若干类实现,下面阐述各个类的设计与实现。
3.1GreedSnake类
该类包含六个主要的功能方法,分别是:
(1)构造函数publicGreedSnake(),主要用来设置用户控制界面。
(2)publicvoidkeyPressed()方法,主要用来对游戏的按键操作进行处理。
(3)voidrepaint()主要用来绘制游戏界面包括蛇和食物。
(4)privatevoiddrawNode()主要用来绘制某一结点。
(5)publicvoidupdateScore()方法主要用来改变积分器。
(6)voidbegin()方法用来控制游戏的开始界面。
3.2.SnakeModel类
该类包含多个功能方法,分别是:
(1)构造函数publicSnakeModel(),该方法主要用来初始化游戏界。
其中matrix[][]
用来存储地图上面的信息,如果什么也没有设置为false,如果有食物或蛇,设置为true;
nodeArray,一个LinkedList,用来保存蛇的每一节;food用来保存食物的位置;而Node
类是保存每个位置的信息。
(2)publicvoidchangeDirection()方法主要用来改变蛇的运动方向,
changeDirection(intnewDirection),用来改变蛇前进的方向,而且只是保存头部的前
进方向,因为其他的前进方向已经用位置来指明了。
其中newDirection必须和原来的
direction不是相反方向,所以相反方向的值用了同样的奇偶性。
在测试的时候使用了
direction%2!
=newDirection%2进行判断。
(3)publicbooleanmoveOn()方法使实现蛇运动的函数,其中moveOn()用来更新蛇的
位置,对于当前方向,把头部位置进行相应改变。
如果越界,结束;否则,检测是否遇到食
物(加头部)或身体(结束);如果什么都没有,加上头部,去掉尾部。
由于用了LinkedList
数据结构,省去了相当多的麻烦。
(4)publicvoidrun()方法主要用来完成游戏主体运行流程控制功能。
(5)privateNodecreateFood()方法用来生成食物及放置地点。
(6)publicvoidspeedUp()和()两个方法对蛇运行的速度进行控制。
(7)publicvoidchangePauseState()方法用来改变游戏的状态,是“暂停”还是“继续”。
3.3.Node类
该类只有一个方法Node(),该方法用来定义蛇的结点部分。
4.软件主要模块流程图
软件的主要模块流程如下图4.1所示。
图4.1软件主要模块流程图
5.源程序清单与注释
5.1GreedSnake.java
packagesnake;
importjava.awt.BorderLayout;
importjava.awt.Canvas;
importjava.awt.Color;
importjava.awt.Container;
importjava.awt.Graphics;
importjava.awt.event.KeyEvent;
importjava.awt.event.KeyListener;
importjava.util.Iterator;
importjava.util.LinkedList;
importjavax.swing.*;
publicclassGreedSnakeimplementsKeyListener{
JFramemainFrame;
CanvaspaintCanvas;
JLabellabelScore;
SnakeModelsnakeModel=newSnakeModel(this,canvasWidth/nodeWidth,canvasHeigth/nodeHeigth);
publicstaticfinalintcanvasWidth=300;
publicstaticfinalintcanvasHeigth=300;
publicstaticfinalintnodeWidth=10;
publicstaticfinalintnodeHeigth=10;
publicGreedSnake(){
mainFrame=newJFrame("GreedSnake");
Containercp=mainFrame.getContentPane();
labelScore=newJLabel("Score:
");
cp.add(labelScore,BorderLayout.NORTH);
//
paintCanvas=newCanvas();
paintCanvas.setSize(canvasWidth+1,canvasHeigth+1);
paintCanvas.addKeyListener(this);
cp.add(paintCanvas,BorderLayout.CENTER);
//
JPanelpanelButtom=newJPanel();
panelButtom.setLayout(newBorderLayout());
JLabellabelHelp;
labelHelp=newJLabel("PageUp,PageDownforspeed:
",JLabel.CENTER);
panelButtom.add(labelHelp,BorderLayout.NORTH);
labelHelp=newJLabel("EnterorRorSforstart:
",JLabel.CENTER);
panelButtom.add(labelHelp,BorderLayout.CENTER);
labelHelp=newJLabel("SPACEorPforpause",JLabel.CENTER);
panelButtom.add(labelHelp,BorderLayout.SOUTH);
cp.add(panelButtom,BorderLayout.SOUTH);
mainFrame.addKeyListener(this);
mainFrame.pack();
mainFrame.setResizable(false);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setVisible(true);
begin();
}
publicvoidkeyTyped(KeyEvente){
}
publicvoidkeyPressed(KeyEvente){
intkeyCode=e.getKeyCode();
if(snakeModel.running){
switch(keyCode){
caseKeyEvent.VK_UP:
snakeModel.changeDirection(snakeModel.UP);
break;
caseKeyEvent.VK_DOWN:
snakeModel.changeDirection(snakeModel.DOWN);
break;
caseKeyEvent.VK_LEFT:
snakeModel.changeDirection(snakeModel.LEFT);
break;
caseKeyEvent.VK_RIGHT:
snakeModel.changeDirection(snakeModel.RIGHT);
break;
caseKeyEvent.VK_PAGE_UP:
snakeModel.speedUP();
break;
caseKeyEvent.VK_PAGE_DOWN:
snakeModel.speedDOWN();
break;
caseKeyEvent.VK_P:
snakeModel.changePauseState();
break;
}
}else{
if(keyCode==KeyEvent.VK_ENTER||keyCode==KeyEvent.VK_R||keyCode==KeyEvent.VK_S){
//snakeModel.running=false;
begin();
}
}
}
publicvoidkeyReleased(KeyEvente){
}
voidrepaint(){
Graphicsg=paintCanvas.getGraphics();
//绘制背景
g.setColor(Color.WHITE);
g.fillRect(0,0,canvasWidth,canvasHeigth);
//画蛇
g.setColor(Color.BLACK);
LinkedListna=snakeModel.nodeArray;
Iteratorit=na.iterator();
while(it.hasNext()){
Noden=(Node)it.next();
drawNode(g,n);
getScore();
}
//
g.setColor(Color.RED);
Noden=snakeModel.food;
drawNode(g,n);
}
voidbegin(){
if(!
snakeModel.running){
snakeModel=newSnakeModel(this,canvasWidth/nodeWidth,canvasHeigth/nodeHeigth);
}
(newThread(snakeModel)).start();
//JOptionPane.showMessageDialog(ip,"游戏结束","lost",JOptionPane.INFORMATION_MESSAGE);
//}
//(newThread(snakeModel)).start();
}
voiddrawNode(Graphicsg,Noden){
g.fillRect(n.x*nodeWidth,n.y*nodeHeigth,nodeWidth-1,nodeHeigth-1);
}
StringgetScore(){
Strings="Score:
"+snakeModel.score;
labelScore.setText(s);
returns;
}
publicstaticvoidmain(String[]args){
GreedSnakegs=newGreedSnake();
}
}
5.2SnakeModel.java
packagesnake;
importjava.util.*;
importjava.util.logging.Level;
importjava.util.logging.Logger;
importjavax.swing.JOptionPane;
publicclassSnakeModelimplementsRunnable{
privatestaticclassJOptionpane{
privatestaticintINFORMAIION_MESSAGE;
publicJOptionpane(){
}
}
GreedSnakegs;
boolean[][]matrix;//界面数据保存在此数组
LinkedListnodeArray=newLinkedList();
Nodefood;
intmaxX;
intmaxY;
intscore=0;
booleanrunning=false;
inttimeInterval=200;
intdirection=2;
doublespeedChangeRate=0.2;
booleanpaused=false;//游戏状态
publicstaticfinalintUP=2;
publicstaticfinalintDOWN=4;
publicstaticfinalintLEFT=1;
publicstaticfinalintRIGHT=3;
publicSnakeModel(GreedSnakegs,intmaxX,intmaxY){
this.gs=gs;
this.maxX=maxX;
this.maxY=maxY;
matrix=newboolean[maxX][];
for(inti=0;imatrix[i]=newboolean[maxY];
Arrays.fill(matrix[i],false);
}
//初始化蛇
intinitArrayLength=maxX>20?
10:
maxX/2;
for(inti=0;iintx=maxX/2+i;
inty=maxY/2;
nodeArray.addLast(newNode(x,y));
matrix[x][y]=true;//蛇身处设为true;
}
//最初的食物
food=createFood();
matrix[food.x][food.y]=true;//食物处设置为true
}
privateNodecreateFood(){
intx=0;
inty=0;
do{
Randomr=newRandom();
x=r.nextInt(maxX);
y=r.nextInt(maxY);
}while(matrix[x][y]);
returnnewNode(x,y);
}
booleanmoveOn(){
Noden=(Node)nodeArray.getFirst();
intx=n.x;
inty=n.y;
switch(direction){
caseUP:
y--;
break;
caseDOWN:
y++;
break;
caseLEFT:
x--;
break;
caseRIGHT:
x++;
break;
}
if((x>=0&&x=0&&yif(matrix[x][y]){
if(x==food.x&&y==food.y){
score=score+1;
nodeArray.addFirst(food);
food=createFood();
matrix[food.x][food.y]=true;
returntrue;
}else{
//score=score+0;
returnfalse;
}
}else{
nodeArray.addFirst(newNode(x,y));
matrix[x][y]=true;
n=(Node)nodeArray.removeLast();
matrix[n.x][n.y]=false;
returntrue;
}
}
running=false;
returnfalse;
}
intgetScore(){
Noden=(Node)nodeArray.getFirst();
intx=n.x;
inty=n.y;
if((x==food.x)&&(y==food.y)){
score=score+1;
}
returnscore;
}
publicvoidspeedUP(){
timeInterval=(int)(timeInterval*(1-speedChangeRate));
}
publicvoidspeedDOWN(){
timeInterval=(int)(timeInterval*(1+speedChangeRate));
}
publicvoidchangeDirection(intnewDirection){
if(direction%2!
=newDirection%2){
direction=newDirection;
}
}
publicvoidchangePauseState(){
paused=!
paused;
}
publicvoidrun(){
running=true;
while(running){
try{
Thread.sleep(timeInterval);
}catch(InterruptedExceptionex){
Logger.getLogger(SnakeModel.class.getName()).log(Level.SEVERE,null,ex);
}
if(!
paused){
if(moveOn()){//
gs.repaint();
}else{
running=false;
break;
}
}
}
JOptionPane.showMessageDialog(null,"GAMEEND","GameEnd",JOptionpane.INFORMAIION_MESSAGE);
}
}
5.3Node.java
packagesnake;
publicclassNode{
intx;
inty;
publicNode(intx,inty){
this.x=x;
this.y=y;
}
}
参考文献:
[1]耿祥义、张跃平.《Java2实用教程》.北京:
清华大学出版社.2006
[2]黄明梁旭、周绍斌.《Java课程设计》北京:
电子工业出版社.2006
[3]谢希仁.《