贪吃蛇游戏开发设计.docx
- 文档编号:4767405
- 上传时间:2022-12-08
- 格式:DOCX
- 页数:19
- 大小:51.28KB
贪吃蛇游戏开发设计.docx
《贪吃蛇游戏开发设计.docx》由会员分享,可在线阅读,更多相关《贪吃蛇游戏开发设计.docx(19页珍藏版)》请在冰豆网上搜索。
贪吃蛇游戏开发设计
广州商学院
课程论文
题目:
贪吃蛇游戏开发设计
课程名称面对对象程序设计
考查学期2016/2017学年第1学期
姓名陈思明李权康
学号22
专业计算机科学与技术
指导教师包汉宗
摘要:
近年来,Java作为一种新的编程语言,以其简单性、可移植性和平台无关性等优点,得到了广泛地应用,它以其友好的开发界面、强大的组件支持等优点,得到广大程序员的接受和认可。
“贪吃蛇”游戏是一个经典的游戏,它因操作简单、娱乐性强而广受欢迎。
本文基于Java技术,开发了一个操作简单、界面美观、功能较齐全的“贪吃蛇”游戏。
整个游戏程序分为二个功能模块,四个类模块,实现了游戏的开始、暂停、结束。
通过本游戏的开发,达到学习Java技术和熟悉软件开发流程的目的。
关键词:
贪吃蛇,Java,游戏
一、可行性分析
1.1经济可行性
游戏开发至今已经有30多年,在这个短暂的时期里,随着硬件的水平的提高。
游戏开发新技术层出不穷,经典游戏比比皆是,游戏这个名称一直存在于每个人的日常生活中。
因此,游戏对于现代人的成长历程,绝对是一个不可或缺的重要角色.而从技术方面来看,现在的java技术也融入了手机中。
这些都为开发的这款贪吃蛇游戏提供了条件。
1.2技术可行性
本次设计我将主要运用java语言来完成。
Java语言是一种跨平台,适合于分布式计算环境的面向对象编程语言,用Java写的应用程序不用修改就可在不同的软硬件平台上运行。
由于Java主要用于网络应用程序开发,因此对安全性有较高的要求。
如果没有安全保证,用户从网络下载程序执行就非常危险。
Java通过自己的安全机制防止了病毒程序的产生和下载程序对本地系统的威胁破坏。
二、需求分析
2.1游戏的介绍
游戏的名称叫“贪吃蛇”,节:
一条蛇可以看成有许多正方形的“小格子”拼凑成,我把它称作节。
节是蛇身上最小的单位。
段:
当许多节连成一条直线,我称它为段。
贪吃蛇只有一段,如果它拐弯就变成两段。
链表:
用来保存每一段的状态,链表的元素单位是段。
且链表的最后一个元素表示蛇的头部段。
坐标系:
MIDP中的坐标以左上角那点为(0,0),向右则x递增,向下则y递增。
2.2游戏开发的可行性
游戏开发至今已经有30多年,在这个短暂的时期里,随着硬件的水平的提高。
游戏开发新技术层出不穷,经典游戏比比皆是,游戏这个名称一直存在于每个人的日常生活中。
因此,游戏对于现代人的成长历程,绝对是一个不可或缺的重要角色.而从技术方面来看,现在的java技术也融入了手机中。
这些都为开发的这款贪吃蛇游戏提供了条件。
2.3设计目的
综合运用在校所学的知识和技能,设计开发贪吃蛇游戏,使自己熟悉应用系统的开发的过程,培养独立思考的能力,校验学习效果和动手能力,提高工程实践能力。
2.4游戏需求
给出一条小蛇和随机出现一个食物,当小蛇吃到食物时就加分。
2.4.1游戏界面需求
良好的用户界面,有分数显示和暂停。
2.4.2游戏形状需求
良好的方块形状设计,绘制小蛇和食物,小蛇由几个方块组成,食物由一个方块组成。
2.4.3键盘事件处理
小蛇可以通过键盘方向键(上,下,左,右)进行方向的移动。
2.4.4显示需求
当小蛇吃掉几个食物后会变长,平且吃完食物时食物会消失,并立即产生一个1个新的事物。
2.4.5接口控制
本软件通过键盘进行操作,在windows操作系统下,利用键盘的上下左右键进行操作,要使用键盘的接口事件。
2.4.6环境介绍
操作系统:
MicrosoftWindows7程序语言:
Java2
开发包:
Java(TM)2StandardEdition(5.0)
SunMicro.J2ME WirelessToolKit2.2
IDE:
Eclipse4.4
三、功能设计
3.1游戏的流程图
3.2游戏主界面的开发
屏幕的背景用白色,由于屏幕高比宽长,所以取以宽为边长的矩形区域作为游戏区域,下面的部分作为分数、信息区域。
图一(游戏的主界面)
3.3绘制蛇身
publicvoidrepaint(){
Graphicsg=canvas.getGraphics();
//背景
g.setColor(Color.black);
g.fillRect(0,0,DEFAULT_WIDTH,DEFAULT_HEIGHT);
//蛇
g.setColor(Color.PINK);
LinkedList
Iterator
while(it.hasNext()){
Noden=(Node)it.next();
drawNode(g,n);
}
//食物
g.setColor(Color.RED);
Noden=snake.food;
drawNode(g,n);
updateScore();
}
//绘画某一结点(蛇身或食物)
privatevoiddrawNode(Graphicsg,Noden){
g.fillRect(n.x*nodeWidth,n.y*nodeHeight,nodeWidth-1,nodeHeight-1);
}
//更新分数
publicvoidupdateScore(){
Strings="分数:
"+snake.score;
label.setText(s);
}
3.4创建初始“蛇”及“蛇”的移动
蛇的初始长度为5,边长为10个像素(背景为黄色),蛇头初始位于屏幕(100,30),方向向左,用向量表来记录每个蛇的位置以及方向。
部分参考代码如下:
if(e.getKeyCode()!
=KeyEvent.VK_Y&&!
playing)
return;
//TODOAuto-generatedmethodstub
/*根据按键不同,让蛇改变不同的方向*/
switch(e.getKeyCode()){
/*方向键上*/
caseKeyEvent.VK_UP:
if(snake.isPause()){
snake.changePause();
for(GameListenerl:
listeners)
l.gameContinue();
}
snake.changeDirection(Snake.UP);
break;
/*方向键下*/
caseKeyEvent.VK_DOWN:
if(snake.isPause()){
snake.changePause();
for(GameListenerl:
listeners)
l.gameContinue();
}
snake.changeDirection(Snake.DOWN);
break;
/*方向键左*/
caseKeyEvent.VK_LEFT:
if(snake.isPause()){
snake.changePause();
for(GameListenerl:
listeners)
l.gameContinue();
}
snake.changeDirection(Snake.LEFT);
break;
/*方向键右*/
caseKeyEvent.VK_RIGHT:
if(snake.isPause()){
snake.changePause();
for(GameListenerl:
listeners)
l.gameContinue();
}
snake.changeDirection(Snake.RIGHT);
break;
3.5吃掉食物,蛇身增长
当小蛇吃掉食物后,会增长,
部分代码:
publicvoidsnakeMoved(){
/*判断是否吃到食物*/
if(food!
=null&&food.isSnakeEatFood(snake)){
/*吃到食物后,蛇增加身体,再重新丢一个食物*/
snake.eatFood();
food.setLocation(ground==null?
food.getNew():
ground
.getFreePoint());
}/*如果吃到食物,就肯定不会吃到石头*/
elseif(ground!
=null&&ground.isSnakeEatRock(snake)){
/*如果吃到的是石头,或吃到自己的身体,就让蛇死掉*/
stopGame();
}
if(snake.isEatBody())
stopGame();
if(gamePanel!
=null)
gamePanel.redisplay(ground,snake,food);
/*更新提示*/
if(gameInfoLabel!
=null)
gameInfoLabel.setText(getNewInfo());
}
3.6随机产生食物
部分代码:
*产生食物
*说明:
食物的坐标必须位于屏幕内,且不能和蛇身重合
if(food!
=null&&food.isSnakeEatFood(snake)){
/*吃到食物后,蛇增加身体,再重新丢一个食物*/
snake.eatFood();
food.setLocation(ground==null?
food.getNew():
ground
.getFreePoint());
publicPointgetNew(){
Pointp=newPoint();
p.x=random.nextInt(Global.WIDTH);
p.y=random.nextInt(Global.HEIGHT);
returnp;
}
3.7键盘事件处理
可以通过键盘控制蛇的移动方向
/*方向键上*/
caseKeyEvent.VK_UP:
if(snake.isPause()){
snake.changePause();
for(GameListenerl:
listeners)
l.gameContinue();
}
snake.changeDirection(Snake.UP);
break;
/*方向键下*/
caseKeyEvent.VK_DOWN:
if(snake.isPause()){
snake.changePause();
for(GameListenerl:
listeners)
l.gameContinue();
}
snake.changeDirection(Snake.DOWN);
break;
/*方向键左*/
caseKeyEvent.VK_LEFT:
if(snake.isPause()){
snake.changePause();
for(GameListenerl:
listeners)
l.gameContinue();
}
snake.changeDirection(Snake.LEFT);
break;
/*方向键右*/
caseKeyEvent.VK_RIGHT:
if(snake.isPause()){
snake.changePause();
for(GameListenerl:
listeners)
l.gameContinue();
}
snake.changeDirection(Snake.RIGHT);
break;
3.8判断游戏结束
只有两种游戏结束的方式,蛇头碰到蛇身和撞墙游戏结束。
参考代码:
publicvoidsnakeMoved(){
/*判断是否吃到食物*/
if(food!
=null&&food.isSnakeEatFood(snake)){
/*吃到食物后,蛇增加身体,再重新丢一个食物*/
snake.eatFood();
food.setLocation(ground==null?
food.getNew():
ground
.getFreePoint());
}/*如果吃到食物,就肯定不会吃到石头*/
elseif(ground!
=null&&ground.isSnakeEatRock(snake)){
/*如果吃到的是石头,或吃到自己的身体,就让蛇死掉*/
stopGame();
}
if(snake.isEatBody())
stopGame();
if(gamePanel!
=null)
gamePanel.redisplay(ground,snake,food);
/*更新提示*/
if(gameInfoLabel!
=null)
gameInfoLabel.setText(getNewInfo());
第5章自我评价和总结
5.1遇到的问题及解决办法
先是图形化界面的设计,一直想不出好的办法,最后翻看了教程才解决了这个问题,后来在蛇的移动上也遇到了些问题。
上网查了一下,才知道蛇身是由一连串的基本图形组成的,每过1秒检查前面是什么,如果是空的,就把图画成普通身子的样子。
再在前方在画一个头,并将其左标记入数组,数组要足够大,在把尾巴画成背景色,如果前面是食物,尾巴就不删除。
这个里面的难点就是数组里面的操作和坐标的表示。
把头添在最后一个元素,把第一个元素提起。
5.2总结
这款游戏的优点,就是简单的画面和容易的操作很容易使玩家就上手,适合不通年龄段的玩家娱乐。
当然这款游戏也存在有不足的地方,有些功能还是没有实现。
通过这次设计过程中,我查阅了大量的资料,对java有了更深刻的认识,通过这次的设计,更提高了我在程序设计和调试方面的技巧,更重要的是我认识了自己的不足,在编程方面我还需要努力学习来充实自己,来获取更大的收获。
参考资料
【1】Java2实用教程(第三版)清华大学出版社。
【2】java编程思想(第四版)机械工业出版社。
【3】J2ME游戏开发实例大全清华大学出版社出版。
附加源代码
packagecom.gzcc.chen.snake3;
importjava.awt.BorderLayout;
importjava.awt.Canvas;
importjava.awt.Color;
importjava.awt.Container;
importjava.awt.Graphics;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.KeyAdapter;
importjava.awt.event.KeyEvent;
importjava.awt.event.MouseListener;
importjava.util.Iterator;
importjava.util.LinkedList;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JMenu;
importjavax.swing.JMenuBar;
importjavax.swing.JMenuItem;
importjavax.swing.JOptionPane;
importjavax.swing.SwingConstants;
importjava.awt.Font;
importjava.awt.event.MouseAdapter;
importjava.awt.event.MouseEvent;
publicclassMyFrameextendsKeyAdapterimplementsActionListener{
JFrameframe;
Canvascanvas;
Containercontainer;
JLabellabel;//计分
Snakesnake=null;//蛇
publicstaticfinalintDEFAULT_WIDTH=800;//界面宽
publicstaticfinalintDEFAULT_HEIGHT=600;//界面高
publicstaticfinalintnodeWidth=10;//结点宽
publicstaticfinalintnodeHeight=10;//结点高
JMenuItemstart=newJMenuItem("开始");
JMenuItemexit=newJMenuItem("退出");
JMenuItempaused=newJMenuItem("暂停/开始");
JMenuItemspeedUp=newJMenuItem("加速");
JMenuItemspeedDown=newJMenuItem("减速");
JMenuItemabout=newJMenuItem("关于贪吃蛇");
JMenuBarmenuBar;
JMenufile;
JMenufunction;
JMenuhelp;
//初始化游戏界面
publicMyFrame()
{
//设置界面
frame=newJFrame();
frame.setBackground(Color.BLACK);
frame.setTitle("贪吃蛇");
frame.setLocation(200,200);
container=frame.getContentPane();
label=newJLabel("分数:
",SwingConstants.CENTER);
label.setForeground(Color.RED);
label.setFont(newFont("宋体",Font.PLAIN,13));
label.setVerticalAlignment(SwingConstants.TOP);
container.add(label,BorderLayout.SOUTH);
canvas=newCanvas();
canvas.setBackground(Color.BLACK);
canvas.setSize(DEFAULT_WIDTH-20,DEFAULT_HEIGHT-20);
container.add(canvas,BorderLayout.WEST);
menuBar=newJMenuBar();
frame.setJMenuBar(menuBar);
file=newJMenu("文件");
function=newJMenu("功能");
help=newJMenu("帮助");
start.addMouseListener(newMouseAdapter(){
@Override
publicvoidmouseClicked(MouseEvente){
System.out.println("dd");
}
});
(start);
start.addActionListener(this);
(exit);
exit.addActionListener(this);
function.add(paused);
paused.addActionListener(this);
function.add(speedUp);
speedUp.addActionListener(this);
function.add(speedDown);
speedDown.addActionListener(this);
help.add(about);
about.addActionListener(this);
menuBar.add(file);
menuBar.add(function);
menuBar.add(help);
frame.addKeyListener(this);
frame.pack();
frame.setResizable(true);//窗口大小不能变化
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗口关闭方式
frame.setVisible(true);//显示
begin();//开始游戏
}
//绘制游戏界面(包括蛇和食物)
publicvoidrepaint(){
Graphicsg=canvas.getGraphics();
//背景
g.setColor(Color.black);
g.fillRect(0,0,DEFAULT_WIDTH,DEFAULT_HEIGHT);
//蛇
g.setColor(Color.PINK);
LinkedList
Iterator
while(it.hasNext()){
Noden=(Node)it.next();
drawNode(g,n)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贪吃 游戏 开发 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)