贪吃蛇java程序设计.docx
- 文档编号:24618070
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:81
- 大小:313.09KB
贪吃蛇java程序设计.docx
《贪吃蛇java程序设计.docx》由会员分享,可在线阅读,更多相关《贪吃蛇java程序设计.docx(81页珍藏版)》请在冰豆网上搜索。
贪吃蛇java程序设计
JAVA课程设计报告
题目:
贪吃蛇AI版
学生姓名:
学号:
专业班级:
同组姓名:
指导教师:
谭文学
设计时间:
2014年下学期第15周
指导老师意见:
评定成绩:
指导老师签名:
年月日
一、课程设计的目的及意义
1.课程设计的目的
1)了解java的基本使用方法
2)熟悉eclipse的运行环境
3)用java面向对象的方法来设计一个贪吃蛇的小游戏
4)基本实现贪吃蛇的应用功能
2.课程设计的意义
贪吃蛇游戏一款非常经典的手机游戏,因为它比较简单有趣,无论老少都比较适合。
贪吃蛇的设计对每一个Java语言设计者进行语言提高和进阶都是一个很好的锻炼机会。
贪吃蛇游戏的设计比较复杂,它涉及面广、牵涉方面多,如果不好好考虑和设计,将难以成功开发出这个游戏。
在这个游戏的设计中,牵涉到图形界面的显示与更新、数据的收集与更新,并且在这个游戏的开发中,还要应用类的继承机制以及一些设计模式。
因此,如何设计和开发好这个贪吃蛇游戏,对于提高Java开发水平和系统的设计能力有极大的帮助。
在设计开发过程中,需要处理好各个类之间的继承关系,还要处理各个类相应的封装,并且还要协调好各个模块之间的逻辑依赖关系和数据通信关系。
正是因为如此,本次课程设计的目的在于学习Java程序设计基本技术,熟悉游戏“贪吃蛇”的需求,熟悉项目开发的完整过程。
学会怎样进行一个项目的需求分析、概要设计、详细设计等软件开发过程,熟练地掌握Java程序设计的基本技术和方法,熟练地掌握eclipse的使用方法,培养起初步的项目分析能力和程序设计能力。
二、系统描述
2.1 设计的主要内容
贪吃蛇游戏设计与实现,主要分为以下二个模块:
游戏主界面模块游戏控制模块。
在此只实现游戏的游戏主界面模块、游戏控制模块。
并且只是实现开始、暂停、退出等功能。
2.2设计要达到的目标
本次设计要达到的目标分别从以下模块进行阐述:
游戏主界面模块:
游戏的主界面是进入游戏后,能够给玩家第一感官的部分,主要包括游戏图形区域界面、游戏的速度选择更新界面、游戏分数的显示更新界面、新生方块的预览、游戏开始按钮、暂停游戏按钮、退出游戏按钮以及游戏排行榜按钮。
从很大程度上决定了玩家对游戏的兴趣问题,因此,游戏的主界面应该力求美观,爽心悦目。
游戏控制模块:
这个模块是游戏的中心环节,主要完成控制游戏的开始、暂停、退出等功能。
为了能够给玩家一个很好的游戏环境,这部分应该做到易懂、易操作。
2.3 设计实现功能和目标
本设计所开发的是基于Java的一个贪吃蛇游戏软件,主要实现游戏的开始、暂停、退出、等功能,分为:
游戏主界面模块、游戏控制模块以二个模块。
性能:
本软件在设计方面本着方便、实用及娱乐性高的宗旨,在对界面进行设计的过程中,始终坚持清晰明了,在性能方面能够实现效率高,不易出错等优点。
游戏主界面模块:
主要包括游戏图形区域界面、游戏开始按钮、暂停游戏按钮、关闭按钮。
游戏的主界面应该力求美观,爽心悦目。
游戏控制模块:
主要完成控制游戏的开始、暂停、退出等功能,这部分应该做到易懂、易操作而且准确率高,不易出错。
2.4游戏设计环境
本次课程设计所涉及和实现的是用Java编程语言和eclipse开发工具开发的贪吃蛇游戏。
本次设计的系统环境及工具如下:
运行环境:
装java环境的windows系统
编程语言:
Java
使用工具:
eclipse
三、分析与设计
3.1功能模块的划分
本软件实现的基本功能如下:
游戏区:
玩家可以在游戏区中堆积方块,并能够在游戏过程中随时了解得分
情况和下一个将要出现方块的提示。
游戏控制:
玩家可以通过游戏控制功能来控制游戏开始,暂停,结束游戏,
游戏难度的设置以及音效控制。
游戏方块的设计:
游戏的核心代码,算法的实现,各个形状的方块的各种操
作的实现。
3.2整体结构图
整体结构如图1
图1整体结构图
3.3主界面的框架及设计图
游戏界面主框架主要包括游戏菜单界面、游戏区域界面、游戏信息更新界面。
菜单界面包括选项、难度设置、模式设置及帮助。
游戏信息更新界面包括模式更新、难度更新及得分更新。
设计图(如图2)
图2整体结构图
3.4程序模块分析
程序只有两个java文件,一个LinkedListQueueTest.java是为了实现队列,另一个Snake.java则是贪吃蛇的类,里面分有几个内部类。
下面是Snake类中的定义的变量、构造函数和main函数:
privateJPanelcontentPane;//窗体内容网格
privateJMenuBarFile=newJMenuBar();//菜单
privateJMenumainFile=newJMenu("选项");//添加菜单
privateIconicon=newImageIcon("C:
\\Users\\YH\\Desktop\\java\\新建.png");
privateIconicon1=newImageIcon("C:
\\Users\\YH\\Desktop\\java\\开始游戏.png");
privateIconicon2=newImageIcon("C:
\\Users\\YH\\Desktop\\java\\退出.png");
privateIconicon3=newImageIcon("C:
\\Users\\YH\\Desktop\\java\\提示.png");
privateJMenuItemmainNew=newJMenuItem("开始游戏",icon1);//为开始游戏选项添加图片
privateJMenuItemmainPause=newJMenuItem("暂停游戏",icon);
privateJMenuItemmainRestart=newJMenuItem("重新开始",icon);
privateJMenuItemmainExit=newJMenuItem("退出",icon2);
privateJMenumainSet=newJMenu("难度设置");//添加等级菜单
privateJMenuItemrbtnLow=newJMenuItem("低级",icon);//为设置难度选项添加图片
privateJMenuItemrbtnMid=newJMenuItem("中级",icon);//为设置难度选项添加图片
privateJMenuItemrbtnHigh=newJMenuItem("高级",icon);//为设置难度选项添加图片
privateJMenuItemrbtnHigher=newJMenuItem("大师级",icon);//为设置难度选项添加图片
privateJMenuItemrbtnbfser=newJMenuItem("暴走级",icon);
privateJMenumainkind=newJMenu("模式设置");//添加模式菜单
privateJMenuItemrbtnp=newJMenuItem("普通模式",icon);
privateJMenuItemrbtnrand=newJMenuItem("随机模式",icon);//为设置模式选项添加图片
privateJMenuItemrbtnbfs=newJMenuItem("AI模式(bfs)",icon);
privateJMenumainHelp=newJMenu("帮助");
privateJMenuItemm=newJMenuItem("提示",icon3);
privateJMenuItemb=newJMenuItem("申明",icon3);
privateJPanelpnlTop=newJPanel();//顶部按钮和分数面板
privateJPanelpnlLeft=newJPanel();//左侧面板
privateJPanelplayPanel=newJPanel();//游戏区面板
privateBorderLayoutborderLayout1=newBorderLayout();//容器布局管理器
privatestaticfinalintUP=1,LEFT=2,DOWN=3,RIGHT=4;//蛇运动方向
privatestaticfinalintROWS=30;//游戏区行数
privatestaticfinalintCOLS=50;//游戏区列数
privatebooleanisPause=false;//游戏暂停标志
privatebooleanisEnd;//游戏结束标志
privatebooleanisrand=false;
privatebooleanisbfs=false;
privateSnakeBodysnake;//贪食蛇
privateintscore=0;//当前得分
privateintx,y;
SnakeThreadthread=newSnakeThread();//游戏主线程
privateGridLayoutgrid1=newGridLayout(ROWS,COLS,0,0);
//游戏区布局分成rows行,cols列的格子,水平间距和垂直间距均为0
privateJButton[][]blocks;//游戏区的所有方块
JPaneljPanel2=newJPanel();
JLabeljLabel1=newJLabel("得分:
");
JLabellblScroe=newJLabel("0");
JLabellevels=newJLabel("难度:
");
JLabelkinds=newJLabel("模式:
");
JLabelkind=newJLabel("普通模式");
JLabellevel=newJLabel("1");
JLabelspace=newJLabel("");
JLabelspace1=newJLabel("");
publicSnake(){//构造函数
super("贪食蛇AI版");
//JFrameframe=newJFrame("测试程序");
this.setJMenuBar(File);//添加菜单
mainFile.addSeparator();//添加分界线
File.setBackground(getForeground());//设置菜单背景
File.add(mainFile);
File.add(mainSet);
File.add(mainkind);
File.add(mainHelp);
mainFile.add(mainNew);//选项菜单添加开始游戏
mainFile.add(mainPause);
mainFile.add(mainRestart);//选项菜单添加重新开始
mainFile.add(mainExit);//选项菜单添加退出
mainSet.add(rbtnLow);//设置菜单添加设置难度
mainSet.add(rbtnMid);//设置菜单添加设置难度
mainSet.add(rbtnHigh);//设置菜单添加设置难度
mainSet.add(rbtnHigher);//设置菜单添加设置难度
mainSet.add(rbtnbfser);
mainkind.add(rbtnp);
mainkind.add(rbtnrand);
mainkind.add(rbtnbfs);
mainHelp.add(m);
mainHelp.add(b);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
contentPane=(JPanel)this.getContentPane();
//contentPane.setLayout(borderLayout2);
this.setResizable(false);
this.setSize(512,414);//窗口大小
this.setLocation(430,80);
keyActionkeyAct=newkeyAction();//监听输入下方已定义
this.addKeyListener(keyAct);
rbtnLow.addKeyListener(keyAct);//初级
rbtnMid.addKeyListener(keyAct);//中级
rbtnHigh.addKeyListener(keyAct);//高级
rbtnHigher.addKeyListener(keyAct);//高级
mainNew.addKeyListener(keyAct);//开始游戏
mainRestart.addKeyListener(keyAct);//重新开始
mainExit.addKeyListener(keyAct);//退出
rbtnrand.addKeyListener(keyAct);
mainPause.addKeyListener(keyAct);
rbtnbfs.addKeyListener(keyAct);
rbtnbfser.addKeyListener(keyAct);//暴走级难度
rbtnp.addKeyListener(keyAct);//普通模式
m.addKeyListener(keyAct);
b.addKeyListener(keyAct);
btnActionbtnAct=newbtnAction();//监听需要进行的操作
rbtnLow.addActionListener(btnAct);//初级
rbtnMid.addActionListener(btnAct);//中级
rbtnHigh.addActionListener(btnAct);//高级
rbtnHigher.addActionListener(btnAct);//大师级
mainNew.addActionListener(btnAct);//开始游戏
mainRestart.addActionListener(btnAct);//重新开始
mainExit.addActionListener(btnAct);//退出
rbtnrand.addActionListener(btnAct);//大师级
mainPause.addActionListener(btnAct);
rbtnbfs.addActionListener(btnAct);
rbtnbfser.addActionListener(btnAct);
rbtnp.addActionListener(btnAct);
m.addActionListener(btnAct);
b.addActionListener(btnAct);
pnlLeft.setLayout(borderLayout1);//容器布局管理器
playPanel.setLayout(grid1);//游戏区面板
playPanel.setBackground(Color.BLACK);//游戏区背景
playPanel.setBorder(BorderFactory.createEtchedBorder());
pnlLeft.add(playPanel);//添加游戏区
pnlTop.setBackground(Color.gray);
pnlTop.add(kinds);
pnlTop.add(kind);
pnlTop.add(space1);
pnlTop.add(levels);
pnlTop.add(level);
pnlTop.add(space);
//pnlTop.add(levelAdd);
pnlTop.add(jLabel1);//顶部面板添加得分
pnlTop.add(lblScroe);//顶部面板添加分数
contentPane.add(pnlTop,BorderLayout.NORTH);//窗体内容网格添加顶部面板设置位置为上方
contentPane.add(pnlLeft,BorderLayout.CENTER);//窗体内容网格添加左边面板设置位置为中间
//创建并初始化游戏区方块
blocks=newJButton[ROWS][COLS];
for(inti=0;i for(intj=0;j blocks[i][j]=newJButton(); blocks[i][j].setBackground(Color.lightGray);//设置底色 blocks[i][j].setVisible(false); playPanel.add(blocks[i][j]); } } } //主函数 publicstaticvoidmain(String[]args){ Snakeapp=newSnake(); app.validate();//更新 app.setVisible(true); } publicvoidstart(){ snake=newSnakeBody();//创建蛇身 score=0; isPause=false; isEnd=false; //btnPause.setText("暂停"); //初始化游戏区 for(inti=0;i for(intj=0;j blocks[i][j].setBackground(Color.lightGray); blocks[i][j].setVisible(false); } } //在游戏区内随机放置豆 x=(int)(Math.random()*ROWS); y=(int)(Math.random()*COLS); while(blocks[x][y].isVisible()){ x=(int)(Math.random()*ROWS); y=(int)(Math.random()*COLS); } blocks[x][y].setBackground(Color.yellow); blocks[x][y].setVisible(true); try{ thread.start();//如果在start中出现异常跳到catch中 } catch(IllegalThreadStateExceptionillegalThreadStateException){} } 然后是蛇身类: 用来控制蛇的运动方向及运动模式 其中move函数是普通模式,通过从键盘输入的键改变direction的值来控制rol[0]和row[0]的位置控制方向,并通过将两个数组中的元素移动到前一个元素的位置来实现蛇身的移动。 Rand函数是随机模式,通过随机direction的值,来使蛇的方向随机,且如果下一步撞墙或者撞到自己重新调用rand函数,这样就使得不会撞到墙也不会撞到自己 bfs函数是ai模式,顾名思义就是自动吃食物,该模式通过使用广度优先搜索来搜索从蛇头到食物的最快路径来判断下一步的方向,所以每次都把下一步四个方向的位置到食物的步数算出来,取步数最小的方向走,其中通过bfs2来确定改点到食物最小的步数,如此就可以达到ai的效果,如果蛇四个方向都不能到达食物,则通过bfs3判断按照当前方向运动方向会不会死,如果会死则通过随机方式改变方向,通过wihle来控制下一个随机的方向一定不会死,当然必死的情况会陷入死循环。 classSnakeBody{//蛇身 publicintrow[]; publicintcol[]; publicintlen=3,direction=RIGHT,lastdirection=RIGHT;//初始状态 publiclongspeed=300;//初始速度 publicSnakeBody(){//蛇身构造函数 len=3; direction=RIGHT;//方向 lastdirection=RIGHT; row=newint[10000];//设置最大长度 col=newint[10000]; for(inti=0;i<=len;i++){//初始位置 row[i]=1;//初始横坐标 col[i]=len-i;//初始纵坐标 } } publicvoidsetSpeed(ints){//设置速度 speed=s; } publicvoidmove(){//移动 blocks[row[len]][col[len]].setVisible(false);//去掉蛇尾 blocks[row[len]][col[len]].setBackground(Color.white);//修改颜色 //显示蛇身 for(inti=0;i blocks[row[i]][col[i]].setBackground(Color.green); blocks[row[i]][col[i]].setVisible(true); } //移动蛇身 for(inti=len;i>0;i--){//后一个变成前一个的位置 row[i]=row[i-1]; col[i]=col[i-1]; } //根据蛇身运动方向,决定蛇头位置 switch(direction){ caseUP: { if(lastdir
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贪吃 java 程序设计