贪吃蛇java课程设计贪吃蛇程序设计.docx
《贪吃蛇java课程设计贪吃蛇程序设计.docx》由会员分享,可在线阅读,更多相关《贪吃蛇java课程设计贪吃蛇程序设计.docx(14页珍藏版)》请在冰豆网上搜索。
![贪吃蛇java课程设计贪吃蛇程序设计.docx](https://file1.bdocx.com/fileroot1/2023-6/26/a331f27a-303c-4bb8-9f86-9a58cfa1a7f8/a331f27a-303c-4bb8-9f86-9a58cfa1a7f81.gif)
贪吃蛇java课程设计贪吃蛇程序设计
课程设计说明书NO.1
贪吃蛇程序设计
1.程序设计的目的
Java语言是当今流行的网络编程语言,它具有面向对象、跨平台、分布应用等特点。
面向对象的开发方法是当今世界最流行的开发方法,它不仅具有更贴近自然的语义,而且有利于软件的维护和继承。
为了对所学的课程进行加深理解,熟练的掌握JAVA的语法与语句,对其进行应用。
通过此次课程设计,巩固所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、JCreator等开发工具的运用,拓宽常用类库的应用。
为了进一步巩固课堂上所学到的知识,深刻把握Java语言的重要概念与其面向对象的特性,锻炼我们熟练的应用面向对象的思想和设计方法解决实际问题的能力。
使我们通过进行课程设计,把所学课程与相关知识加以融会贯通,全面掌握Java语言的编程思想与面向对象程序设计的方法,为今后从事实际工作打下坚实的基础。
通过课程设计来对JAVA语言有更深的了解,以与应用。
2.设计方案论证
2.1系统模块图
如图1所示
图1系统模块图
沈阳大学
课程设计说明书NO.2
2.2主要部分流程图
如图2所示:
图2主要流程图
沈阳大学
课程设计说明书NO.3
2.3设计思路与具体实现方法
2.3.1产生一个窗口
(1)定义一个框架,确定大小。
其大小使600,400;
(2)定义一个贪吃蛇的类,确定其大小比例;
(3)在窗口上方定义一个Score得分;
(4)在窗口的下方定义各按钮的位置。
使贪吃蛇运动起来
通过函数的调用,使贪吃蛇运动起来,用按键来调节贪吃蛇的运动方向,运动的速度。
定义各功能键的作用
(1)PageUp使贪吃蛇加速,减速。
并确定其按键位置;
(2)PageDown使贪吃蛇减速。
并确定其按键位置;
(2)ENTER,R,S重新开始游戏,界面回到开始界面;
(3)SPACE,P暂停游戏。
使贪吃蛇听指挥
(1)加键盘监听器类;
(2)添加键盘监听器;
(3)定义其按键上,下,左,右;
(4)针对不同的键改变贪吃蛇的位置,与重画线程结合产生不同方向运动。
通过上下左右来调节。
进行贪吃蛇类的确定
(1)定义背景的颜色为白色;
(2)定义贪吃蛇的颜色为黑色;
(3)定义食物的颜色为红色。
食物出现的位置
通过随机函数调用,实现食物的出现,当贪吃蛇吃完一各食物,随即再生成一个食物。
贪吃蛇身增加一节
运用for函数实现,当贪吃蛇每吃到食物,贪吃蛇蛇身就增加一节,然后在框架中又重新出现新的食物。
得分增加
当贪吃蛇每吃到一块食物,贪吃蛇蛇身就增加一节,分数就有次序的增加。
在框架的上方有显示。
贪吃蛇死亡
(1)当贪吃蛇撞到框架或自身的时候,则贪吃蛇死亡。
然后弹处一个对话框,显示youfailed。
(2)如果想继续游戏,点击“确定”,再按ENTER,R,S重新开始游戏,界面回到开始界面。
游戏结束
显示youfailed,你取消对话框即退出了贪吃蛇游戏。
沈阳大学
课程设计说明书NO.4
2.4设计的源代码
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjava.util.*;
publicclassGreedSnakeimplementsKeyListener
{
JFramemainFrame;
CanvaspaintCanvas;
JLabellabelScore;
SnakeModelsnakeModel=null;
publicstaticfinalintcanvasWidth=600;
publicstaticfinalintcanvasHeight=400;
publicstaticfinalintnodeWidth=10;
publicstaticfinalintnodeHeight=10;
publicGreedSnake()
{
mainFrame=newJFrame("GreedSnake");
Containercp=mainFrame.getContentPane();
labelScore=newJLabel("Score:
");
cp.add(labelScore,BorderLayout.NORTH);
paintCanvas=newCanvas();
paintCanvas.setSize(canvasWidth+1,canvasHeight+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);
沈阳大学
课程设计说明书NO.5
begin();
}
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_ADD:
caseKeyEvent.VK_PAGE_UP:
snakeModel.speedUp();
break;
caseKeyEvent.VK_SUBTRACT:
caseKeyEvent.VK_PAGE_DOWN:
snakeModel.speedDown();
break;
caseKeyEvent.VK_SPACE:
caseKeyEvent.VK_P:
snakeModel.changePauseState();
break;
default:
}
if(keyCode==KeyEvent.VK_R||
keyCode==KeyEvent.VK_S||
keyCode==KeyEvent.VK_ENTER)
{
snakeModel.running=false;
沈阳大学
课程设计说明书NO.6
begin();
}
}
publicvoidkeyReleased(KeyEvente){
}
publicvoidkeyTyped(KeyEvente){
}
voidrepaint()
{
Graphicsg=paintCanvas.getGraphics();
//drawbackground
g.setColor(Color.WHITE);
g.fillRect(0,0,canvasWidth,canvasHeight);
//drawthesnake
g.setColor(Color.BLACK);
LinkedListna=snakeModel.nodeArray;
Iteratorit=na.iterator();
while(it.hasNext())
{
Noden=(Node)it.next();
drawNode(g,n);
}
//drawthefood
g.setColor(Color.RED);
Noden=snakeModel.food;
drawNode(g,n);
updateScore();
}
privatevoiddrawNode(Graphicsg,Noden)
{
g.fillRect(n.x*nodeWidth,
n.y*nodeHeight,
nodeWidth-1,
nodeHeight-1);
}
publicvoidupdateScore()
{
Strings="Score:
"+snakeModel.score;
labelScore.setText(s);
}
voidbegin()
沈阳大学
课程设计说明书NO.7
{
if(snakeModel==null||!
snakeModel.running)
{
snakeModel=newSnakeModel(this,
canvasWidth/nodeWidth,
canvasHeight/nodeHeight);
(newThread(snakeModel)).start();
}
}
publicstaticvoidmain(String[]args)
{
GreedSnakegs=newGreedSnake();
}
}
classSnakeModelimplementsRunnable
{
GreedSnakegs;
boolean[][]matrix;
LinkedListnodeArray=newLinkedList();
Nodefood;
intmaxX;
intmaxY;
intdirection=2;
booleanrunning=false;
inttimeInterval=200;
doublespeedChangeRate=0.75;
booleanpaused=false;
intscore=0;
intcountMove=0;
//UPandDOWNshouldbeeven
//RIGHTandLEFTshouldbeodd
publicstaticfinalintUP=2;
publicstaticfinalintDOWN=4;
publicstaticfinalintLEFT=1;
publicstaticfinalintRIGHT=3;
publicSnakeModel(GreedSnakegs,intmaxX,intmaxY)
{
this.gs=gs;
this.maxX=maxX;
this.maxY=maxY;
//initialmatirx
沈阳大学
课程设计说明书NO.8
matrix=newboolean[maxX][];
for(inti=0;i matrix[i]=newboolean[maxY];
Arrays.fill(matrix[i],false);
}
//initialthesnake
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;
}
food=createFood();
matrix[food.x][food.y]=true;
}
publicvoidchangeDirection(intnewDirection)
{
if(direction%2!
=newDirection%2)
{
direction=newDirection;
}
}
publicbooleanmoveOn()
{
Noden=(Node)nodeArray.getFirst();
intx=n.x;
inty=n.y;
switch(direction)
{
caseUP:
y--;
break;
caseDOWN:
y++;
break;
caseLEFT:
x--;
break;
caseRIGHT:
沈阳大学
课程设计说明书NO.9
x++;
break;
}
if((0<=x&&x{
if(matrix[x][y])
{
if(x==food.x&&y==food.y)
{
nodeArray.addFirst(food);
intscoreGet=(10000-200*countMove)/timeInterval;
core+=scoreGet>0?
scoreGet:
10;
countMove=0;
food=createFood();
matrix[food.x][food.y]=true;
returntrue;
}
else
returnfalse;
}
else
{
nodeArray.addFirst(newNode(x,y));
matrix[x][y]=true;
n=(Node)nodeArray.removeLast();
matrix[n.x][n.y]=false;
countMove++;
returntrue;
}
}
returnfalse;
}
publicvoidrun()
{
running=true;
while(running)
{
try
{
Thread.sleep(timeInterval);
}
沈阳大学
课程设计说明书NO.10
catch(Exceptione)
{
break;
}
if(!
paused){
if(moveOn()){
gs.repaint();
}
else
{
JOptionPane.showMessageDialog(
null,
"youfailed",
"GameOver",
JOptionPane.INFORMATION_MESSAGE);
break;
}
}
}
running=false;
}
privateNodecreateFood()
{
intx=0;
inty=0;
do{
Randomr=newRandom();
x=r.nextInt(maxX);
y=r.nextInt(maxY);
}
while(matrix[x][y]);
returnnewNode(x,y);
}
publicvoidspeedUp(){
timeInterval*=speedChangeRate;
}
publicvoidspeedDown()
{
timeInterval/=speedChangeRate;
}
publicvoidchangePauseState()
沈阳大学
课程设计说明书NO.11
{
paused=!
paused;
}
publicStringtoString()
{
Stringresult="";
for(inti=0;i{
Noden=(Node)nodeArray.get(i);
result+="["+n.x+","+n.y+"]";
}
returnresult;
}
}
classNode
{
intx;
inty;
Node(intx,inty)
{
this.x=x;
this.y=y;
}
}
3.设计结果与分析
本设计是在JCreator+JDK平台上开发、调试运行的,运行的结果截图如下几个图所示。
图3程序运行起始界面
沈阳大学
课程设计说明书NO.12
图3游戏开始界面
图4游戏进行中界面
图4游戏进行中界面
沈阳大学
课程设计说明书NO.13
4.设计心得体会
这次课程设计历时二个星期多左右,通过这两个星期的学习,发现了自己的很多不足,自己知识的很多漏洞,看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。
通过对Java的程序设计,感觉到自己在知识的理解上有很大的不足,对知识的掌握程度还是不那么的深入。
在这个课程设计中,融入了太多的汗水,就因为付出了很多,才感觉到这个课程设计所给我带来的深刻意义。
在知识的海洋里,我们应该勇于发现问题,积极的去探索问题,不应该遇到比较棘手的问题就对自己放松,对自己就降低了要求。
这个课程设计就是我自己的辛辛苦苦的劳动成果,所以当我顺利的完成了这个课程设计的时候,我的心情使无比的激动。
重拾教材与实验手册,对知识系统而全面进行了梳理,遇到难处先是苦思冥想再向同学请教,终于熟练掌握了基本理论知识,而且领悟诸多平时学习难以理解掌握的较难知识,学会了如何思考的思维方式,找到了设计的灵感。
在此过程中,有太多的艰辛,有太多的坎坷。
正是有了老师的耐心辅导,还有同学们的辛苦帮助,我才能这么顺利的完成这个课程设计。
所以我要谢谢他们每个人。
我想说:
为完成这次课程设计我们确实很辛苦,但苦中仍有乐,和同学这十几天的一起完成课程设计的日子,让我们有说有笑,相互帮助,配合默契,多少人间欢乐在这里洒下,大学里一年的相处还赶不上这十来天的实习,我感觉我和同学们之间的距离更加近了。
5.参考文献
[1]陈德志、冯智圣.Java程序设计习题解析[M].:
冶金工业,2004.7:
101-188
[2]李向明,姜遇姬.Java程序设计教程[M].:
人民邮电大学,2004.6:
204-260
[3]刘其红.Java程序设计实例教程[M].:
冶金,2004.7:
51-127
[4]朱喜福.Java程序设计[M].:
清华大学,2005.3:
120-150
沈阳大学