Java期中课程设计报告贪食蛇.docx
《Java期中课程设计报告贪食蛇.docx》由会员分享,可在线阅读,更多相关《Java期中课程设计报告贪食蛇.docx(19页珍藏版)》请在冰点文库上搜索。
Java期中课程设计报告贪食蛇
Java期中课程设计报告
题目:
贪食蛇游戏程序
姓名:
学号:
院系:
专业:
年级:
贪吃蛇游戏程序设计
1、基本内容描述
运用java技术开发出贪吃蛇游戏,这个程序是用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块。
移动时必须从蛇头开始,也就是蛇尾不能改作蛇头。
当游戏者按了方向键后,蛇头朝着指定的方向移动,一步移动一节身体。
图形的实现是从蛇头的新位置开始画出蛇。
用户可以用上下左右键控制蛇头的方向,用空格键暂停或继续,非常简单!
可以实现如下功能:
1.贪吃蛇游戏是大家很常见的小游戏,在生活工作之余大家可以玩它,已达到放松各种压力的目的。
2.游戏可以进行升级,也就是增加吃食物的难度,以便使大家更有挑战性,不觉得太无趣。
3.游戏界面大小可以任意指定,数据从文件读入。
4.利用swing实现良好的GUI界面。
2、需求分析
(1)系统功能要求:
1.利用方向键来改变蛇的运行方向。
2.空格键暂停或继续游戏,并在随机的地方产生食物。
3.吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常运行。
(2)系统设计思路:
1.贪吃蛇是很经典的格子游戏。
所谓格子游戏就是在设计游戏时的主要思想是每个设对象都是由格子组成,游戏运行界面也是由格子组成。
格子思想决定了此类游戏在设计时的算法思想。
2.方向键控制一个方块的移动的方法,一个方块的移动是靠移动其坐标位置来实现的。
3.方向键控制是上下左右对一个方块的控制,用四个判断语句实现。
4.蛇的移动算法思想可以看成是第一个方块移动,第二个方块移到第一个方块的位置,第三个方块移动到第二个方块的位置?
?
第N个方块移动到第N-1个方块的位置。
这样连续的移动就是蛇的移动了。
方向控制键控制了第一个方块的移动后,后面方块跟着移动,这样也实现了方向键控制对长蛇的移动。
5.食物的随机产生的方法食物的随机产生需要一个随机种子函数然后利用系统时间做为随机种子。
6.蛇的身体变长的方法当然要当蛇吃到食物时才能使身体变长。
因此有两个需要解决的问题:
问题一:
如何知道是否吃到食物?
问题二:
吃到食物后身体变长?
解决问题一的方法是需要一个判断语句,当蛇头即构成蛇的第一个方块跟食物所在方块的坐标一样时判断吃到食物。
解决问题二则要相对复杂一些,需要多个判断语句构成。
7.游戏结束的方法,当蛇碰到边框时或者吃到自己时游戏结束。
根据这个思想可以用判断语句实现。
然后是游戏结束后的处理,比如显示继续玩游戏还是退出游戏,并显示所吃到的食物的个数和时间等。
3、系统设计
1.总体设计和个模块设计
importjavax.swing.*;
importjava.util.ArrayList;
importjava.awt.BorderLayout;
importjava.awt.Color;
importjava.awt.FlowLayout;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.event.*;
publicclassSnakeextendsJFrame
{
finalstaticintWidth=340;
finalstaticintHeight=450;
finalstaticintnodeWidth=10;
finalstaticintnodeHeight=10;
//蛇身的坐标
staticintx;
staticinty;
//食物的坐标
staticintfx;
staticintfy;
staticArrayListsnakebody;//设置蛇身
staticintkey;
staticintl;
staticintt;
staticintspeed;
staticTimertimer;
staticJLabelb=newJLabel(""+l);//计分数的
staticJFramesframe;//框架
//设置蛇的坐标
publicstaticclassNode
{
intx;
inty;
ints;
Node(intx,inty)
{
this.x=x;
this.y=y;
}
}
//游戏面板
publicstaticclassGamepanelextendsJPanel
{
publicGamepanel()
{
JPanelo=newJPanel();
JLabela=newJLabel("SCORE");
o.add(a);
o.add(b);
o.setLayout(newFlowLayout(FlowLayout.LEFT,30,0));
add(o,BorderLayout.NORTH);
timer=newTimer(speed,newTimerListener());
timer.start();
}
protectedvoidpaintComponent(Graphicsg)
{
super.paintComponent(g);
//将游戏背景填充成白色
g.setColor(Color.WHITE);
g.fillRect(0,25,340,450);
switch(key)
{
case0:
eatfood(x,y+10);y=y+10;break;
case1:
eatfood(x,y-10);y=y-10;break;
case2:
eatfood(x-10,y);x=x-10;break;
case3:
eatfood(x+10,y);x=x+10;break;
default:
;
}
snakebody.remove(snakebody.size()-1);
//模拟移动,头部加一个尾部减一个
//如果吃上食物,则重新产生食物
if(x==fx&&y==fy)
{
eatfood(fx,fy);
l++;
changefood();
}
//刷新时间
speed=80-(l/10)*10;
//使速度改变
timer.setDelay(speed);
//将蛇头和蛇身还有食物填充在白色的背景下
g.setColor(Color.YELLOW);
drawNode(g,snakebody.get(0));
g.setColor(Color.BLACK);
for(inti=1;idrawNode(g,snakebody.get(i));
Nodefood=newNode(fx,fy);
g.setColor(Color.GREEN);
drawNode(g,food);
if(!
checkifdead())
{
timer.stop();
System.exit(0);
}
}
classTimerListenerimplementsActionListener
{
publicvoidactionPerformed(ActionEvente)
{
repaint();
b.setText(""+l);
}
}
}
//蛇下一步的方向
publicstaticNodenextstep(intfx,intfy)
{
Noden=newNode(0,0);
if(key==0)
{
n.x=fx;
n.y=fy+10;
}
if(key==1)
{
n.x=fx;
n.y=fy-10;
}
if(key==2)
{
n.x=fx-10;
n.y=fy;
}
if(key==3)
{
n.x=fx+10;
n.y=fy;
}
returnn;
}
//结束判断,是否撞到边界或是否撞到自己
publicstaticbooleancheckifdead()
{
if(x>(Width-25)||(y>Height-70)||x<0||y<25||ifinbody(nextstep(x,y).x,nextstep(x,y).y))
{
if(x>(Width-25)||y>(Height-70)||x<0||y<25)
{
x=55;
y=55;
}
returnfalse;
}
returntrue;
}
//判断蛇身是否撞到自己
publicstaticbooleanifinbody(intfx,intfy)
{
for(inti=1;i{
if(fx==snakebody.get(i).x&&fy==snakebody.get(i).y)
returntrue;
}
returnfalse;
}
//画新加的头
publicstaticvoiddrawNode(Graphicsg,Noden)
{
g.fillRect(n.x,n.y,nodeWidth,nodeHeight);
}
//如果吃上食物,则在头部加一个
publicstaticvoideatfood(intx,inty)
{
Noden=newNode(x,y);
snakebody.add(0,n);
}
//改变食物的坐标
publicstaticvoidchangefood()
{
fx=25+(int)(Math.random()*10)*10;
fy=25+(int)(Math.random()*20)*10;
}
//开始游戏
publicstaticvoidstartgame()
{
x=55;
y=55;
//随机产生食物的坐标
fx=25+(int)(Math.random()*10)*10;
fy=25+(int)(Math.random()*20)*10;
snakebody=newArrayList();
//蛇一开始往又走
key=3;
l=0;
//设置空格暂停的标志
t=0;
speed=80;
Noden=newNode(50,50);
//设置蛇身的坐标
snakebody.add(n);
//标题
sframe=newJFrame("GreedySnake");
Gamepanelpanel=newGamepanel();
//给框架设置监听器
sframe.addKeyListener
(
newKeyListener()
{
publicvoidkeyPressed(KeyEvente)
{
switch(e.getKeyCode())
{
caseKeyEvent.VK_DOWN:
if(ifinbody(x,y+10)==false)
key=0;break;
caseKeyEvent.VK_UP:
if(ifinbody(x,y-10)==false)
key=1;break;
caseKeyEvent.VK_LEFT:
if(ifinbody(x-10,y)==false)
key=2;break;
caseKeyEvent.VK_RIGHT:
if(ifinbody(x+10,y)==false)
key=3;break;
//空格为暂停
caseKeyEvent.VK_SPACE:
if(t==0)
{
timer.stop();
t=1;
}
else
{
timer.start();
t=0;
}
break;
default:
;
}
}
publicvoidkeyTyped(KeyEvente){}
publicvoidkeyReleased(KeyEvente){}
}
);
sframe.add(panel);
//设置菜单框
JMenuBarmenubar=newJMenuBar();
sframe.setJMenuBar(menubar);
JMenumenu1=newJMenu("Game");
JMenumenu2=newJMenu("Help");
menubar.add(menu1);
menubar.add(menu2);
//分别写三个按钮的监听器
JMenuItemnewgame=newJMenuItem("NewGame");
menu1.add(newgame);
newgame.addActionListener
(
newActionListener()
{
publicvoidactionPerformed(ActionEventevent)
{
newgame();
}
}
);
JMenuItemmoption=newJMenuItem("Quit");
menu1.add(moption);
moption.addActionListener
(
newActionListener()
{
publicvoidactionPerformed(ActionEventevent)
{
System.exit(0);
}
}
);
JMenuItemabout=newJMenuItem("About");
menu2.add(about);
about.addActionListener
(
newActionListener()
{
publicvoidactionPerformed(ActionEventevent)
{
timer.stop();
JOptionPane.showMessageDialog(null,"GreedySnake\n"+"Version1.0\n"+"MadebySherlock");
timer.start();
}
}
);
sframe.pack();
sframe.setTitle("GreedySnake");
sframe.setSize(Width,Height);
sframe.setLocationRelativeTo(null);
sframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
sframe.setVisible(true);
}
publicstaticvoidmain(String[]args)
{
startgame();
}
}
2.流程图或类图
4、系统实现与测试
系统实现工具我使用了NetBeansIDE8.0
在NetBeans下运行程序:
运行结果初始界面:
试玩一段时间后的界面:
标题菜单栏—Game:
NewGameQuitHelp:
About
5、个人体会
通过一学期的学习,我对Java课程更加了解了,Java是一门功能强大的语言工具,在整个工程设计专题中我觉得贪吃蛇的游戏是最简单的,因此期中作业阅读了大量书籍,自己改了无数程序,终于完成了简单版本的贪食蛇。
但是我的设计功能有限,还有好多地方值得加强。
比如:
游戏结束无显示,可以加一个游戏结束标志并显示分数等。
通过这次课程设计,我对java又有了更深刻的认识。
也有了更深一步的喜爱,决定一定要努力学好java,并能更好的应用于以后的工作中。
这次贪吃蛇的设计,我做的不是很完美,也没想象中的那么好,但也获得了许多宝贵的经验:
1)在设计程序之前,务必要对自己所要设计的题目和内容有一个系统的,大概的了解,知道所设计的题目和内容包含哪些资源。
2)设计程序采用什么编程语言并不是非常重要,关键是要有一个清晰的思路和一个完整的软件流程图,所有要先把设计原理与思路搞清楚,再把流程图画出来,这样设计起来就简单多了。
3)在设计程序时,不能妄想一次就将整个程序设计好,“反复修改,不断改进”是程序设计的必经之路,发现错误也是取得成绩及成绩的一种必经之路。
4)要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而
应该让人一看就能明白自己的思路,这样也为资料的保存和交流提供了方便。
在以后的学习和工作中,我希望我能把这些经验应用起来。
为以后的工作顺利进行,也让自己获得一定的能力,能够拥有一份好的工作。
6、附录(参考文献及其他)
[1]Y.DanielLiang著,李娜译.《Java语言程序设计-基础篇》(原书第八版).北京:
机械工业出版社,2011.5
[2]胡雷,叶曙光,徐饪.《JBuilder9.0入门与提高[M]》.北京:
机械工业出版社,2004.
[3]陆光义,宋现锋.《Java游戏编程导学[M]》.北京:
清华大学出版社.2004.