java贪吃蛇.docx

上传人:b****8 文档编号:9560839 上传时间:2023-02-05 格式:DOCX 页数:20 大小:194.21KB
下载 相关 举报
java贪吃蛇.docx_第1页
第1页 / 共20页
java贪吃蛇.docx_第2页
第2页 / 共20页
java贪吃蛇.docx_第3页
第3页 / 共20页
java贪吃蛇.docx_第4页
第4页 / 共20页
java贪吃蛇.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

java贪吃蛇.docx

《java贪吃蛇.docx》由会员分享,可在线阅读,更多相关《java贪吃蛇.docx(20页珍藏版)》请在冰豆网上搜索。

java贪吃蛇.docx

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;i

matrix[i]=newboolean[maxY];

Arrays.fill(matrix[i],false);

}

//初始化蛇

intinitArrayLength=maxX>20?

10:

maxX/2;

for(inti=0;i

intx=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&&y

if(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]谢希仁.《

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1