基于java的贪吃蛇游戏设计课设.docx
- 文档编号:12099368
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:29
- 大小:170.95KB
基于java的贪吃蛇游戏设计课设.docx
《基于java的贪吃蛇游戏设计课设.docx》由会员分享,可在线阅读,更多相关《基于java的贪吃蛇游戏设计课设.docx(29页珍藏版)》请在冰豆网上搜索。
基于java的贪吃蛇游戏设计课设
成绩评定表
学生姓名
Xxx
班级学号
Xxxxxxx
专业
通信工程
课程设计题目
基于Java的贪吃蛇游戏设计
评
语
组长签字:
成绩
日期
2014年12月5日
课程设计任务书
学院
信息科学与工程学院
专业
通信工程
学生姓名
Xxx
班级学号
Xxxxx
课程设计题目
基于Java的贪吃蛇游戏设计
实践教学要求与任务:
1、熟悉Java的编程
2、熟悉Java的运行环境
3、用Java语言实现贪吃蛇游戏的设计
4、运行、调试游戏程序
5、对游戏程序进行结果验证及分析
工作计划与进度安排:
12月1日熟悉设计任务、查阅资料、进行原理分析及可行性论证
12月2日~3日用Java语言实现贪吃蛇游戏的设计
12月4日验收、答辩、提交报告
指导教师:
2014年12月4日
专业负责人:
2014年12月4日
学院教学副院长:
2014年12月4日
1.Java语言的特点
1.1Java简介
SunMicrosystems公司在推出Java语言的同时,推出了一套开发工具JDK。
Sun提供的基于字符模式的Java开发工具包JDK:
Java开发工具(JDK)是许多Java专家最初使用的开发环境。
Java是平台无关的语言是指用Java写的应用程序不用修改就可在不同的软硬件平台上运行。
Java源程序编写借助于记事本,Editpuls,UltraEdit等第三方编辑工具。
所有的Java文件编辑、编译、调试、解释运行都是通过使用字符命令来执行操作。
JDK由一个标准类库和一组建立,测试及建立文档的Java实用程序组成。
其核心Java
API是一些预定义的类库,开发人员需要用这些类来访问Java语言的功能。
JDK是整个Java的核心,包括了Java运行环境(JavaRuntimeEnvirnment),一堆Java工具和Java基础的类库(rt.jar)。
不论什么Java应用服务器实质都是内置了某个版本的JDK。
因此掌握JDK是学好Java的第一步。
JDK里面是java类库和java的语言规范,它提供的是无论你用何种开发软件写java程序都必须用到的类库和java语言规范.没有jdk,你的java程序根本就不能用。
最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等。
其中IBM的JDK包含的JVM(JavaVirtualMachine)运行效率要比SunJDK包含的JVM高出许多。
而专门运行在x86平台的Jrocket在服务端运行效率也要比SunJDK好很多。
但不管怎么说,我们还是需要先把SunJDK掌握好。
1.2.应用环境
(1).操作系统:
Solaris、WindowsNT、Windows95等
(2).应用软件:
jdk1.5
2.需求分析
2.1游戏开发的可行性
游戏开发至今已经有30多年,在这个短暂的时期里,随着硬件水平的提高,游戏开发新技术层出不穷,经典游戏比比皆是。
游戏这个名称一直就存在于每个人的日常生活中,如猜拳游戏、猜谜游戏、大地游戏、球类游戏等,林林总总,不胜枚举,甚至于有些流行歌曲把人生也比喻为游戏,好比“一场游戏一场梦”。
因此,游戏对于现代人的成长历程,绝对是一个不可或缺的重要角色。
2.2设计目的
综合运用在校期间所学理论知识和技能,设计开发贪吃蛇游戏,使自己熟悉应用系统的开发过程,培养独立思考能力,检验学习效果和动手能力,提高工程实践能力。
2.3游戏需求
给出1条小蛇和随机出1个食物当小蛇吃到食物时就加分。
2.3.1游戏界面需求
良好的用户界面,有分数显示。
有存取档功能,并且可以暂停,还有“英雄榜”记录分数排名情况,并且可调节小蛇运动速度。
2.3.2游戏形状(方块)需求
良好的方块形状设计,绘制小蛇和食物,小蛇由几个方块组成,食物由1个方块组成。
2.3.3键盘处理事件
小蛇可通过键盘方向键(上、下、左、右键)进行向上、向下、向左、向右移动。
2.3.4显示需求
当小蛇吃掉几个食物后会变长,并且吃完食物时食物会消失,并立即随机生成1个新的食物。
2.3.5接口控制
本软件需求通过键盘进行操作,在Windows的操作系统下,利用键盘的上、下、左、右键对小蛇进行移动操作,要使用键盘的接口事件。
3.功能设计及源程序的主要部分
3.1游戏流程图
图1游戏流程图
3.2功能的实现,类的实现及类层次
3.2.1游戏界面
publicSnakeFrame(){
setSize(width,height);//设置窗体大小
setTitle("贪吃蛇");//标题
SnakePanelpanel=newSnakePanel();//游戏面板
add(panel);//将面板添加到窗体中
setLocation(260,160);//设置窗体位置
setVisible(true);
setResizable(false);//禁用窗体最大化
}
3.2.2功能按钮
publicSnakePanel(){//构造函数
//添加功能按钮
setLayout(null);
add(startGame);
add(stopGame);
add(saveGame);
add(listGame);
add(newGame);
add(exitGame);
//设置位置
startGame.setBounds(402,50,80,40);
stopGame.setBounds(402,100,80,40);
saveGame.setBounds(402,150,80,40);
listGame.setBounds(402,200,80,40);
newGame.setBounds(402,250,80,40);
exitGame.setBounds(402,300,80,40);
//添加监视器
ButtonListenerbtnListener=newButtonListener();
startGame.addActionListener(btnListener);
stopGame.addActionListener(btnListener);
saveGame.addActionListener(btnListener);
listGame.addActionListener(btnListener);
newGame.addActionListener(btnListener);
exitGame.addActionListener(btnListener);
//取消所有Button的焦点
startGame.setFocusable(false);
stopGame.setFocusable(false);
saveGame.setFocusable(false);
listGame.setFocusable(false);
newGame.setFocusable(false);
//速度
Stringspeed[]={"1","2","3","4","5","预设"};
combspeed=newJComboBox(speed);
combspeed.setBorder(BorderFactory.createTitledBorder("速度"));
add(combspeed);//添加组合框
combspeed.setBounds(402,340,80,46);
comboBoxListenercomblistener=newcomboBoxListener();
combspeed.addActionListener(comblistener);//添加监视器
combspeed.setFocusable(false);//取消焦点
initGame();//初始化游戏
addKeyListener(newListener());//添加键盘按键监视器
setFocusable(true);//将焦点设置在当前面板上以便通过键盘控制游戏
thiswin=this;
}
3.2.3键盘监视器
classListenerimplementsKeyListener{
publicvoidkeyPressed(KeyEvente){
intkey=e.getKeyCode();//获得键码
if(key==KeyEvent.VK_LEFT&&direction!
=2)
direction=0;//左
elseif(key==KeyEvent.VK_UP&&direction!
=3)
direction=1;//上
elseif(key==KeyEvent.VK_RIGHT&&direction!
=0)
direction=2;//右
elseif(key==KeyEvent.VK_DOWN&&direction!
=1)
direction=3;//下
}
publicvoidkeyReleased(KeyEvente){
}
@Override
publicvoidkeyTyped(KeyEvente){
}
}publicvoidkeyPressed(KeyEvente){
intkey=e.getKeyCode();//获得键码
if(key==KeyEvent.VK_LEFT&&direction!
=2)
direction=0;//左
elseif(key==KeyEvent.VK_UP&&direction!
=3)
direction=1;//上
elseif(key==KeyEvent.VK_RIGHT&&direction!
=0)
direction=2;//右
elseif(key==KeyEvent.VK_DOWN&&direction!
=1)
direction=3;//下
}
3.2.4蛇和食物的变化
3.2.4.1蛇和食物的产生:
publicvoiddrawSnake(Graphicsg){
Graphics2Dg2d=(Graphics2D)g;
for(inti=0;i for(intj=0;j if(arrayList[i][j]==1){//蛇身 g.setColor(frontcolor);//蛇身颜色 }elseif(arrayList[i][j]==2){//蛇头 g.setColor(Color.RED);//蛇头颜色 }elseif(arrayList[i][j]==3){//食物 g.setColor(foodcolor);//食物颜色 } if(arrayList[i][j]! =0){ intcurx=border_left+i*10; intcury=border_top+j*10; g2d.draw(newRectangle2D.Double(curx,cury,8,8)); } } } } 3.2.4.2小蛇移动和吃掉食物: publicbooleanMove(){//移动 if(direction==0) x-=1;//左 elseif(direction==1) y-=1;//上 elseif(direction==2) x+=1;//右 elseif(direction==3) y+=1;//下 //向前移动一步 if(GameOver()){//游戏结束 clock.stop(); gameover=true; flag=false;//不再产生新的豆豆 if(x<0||x>=arrayList.length||y<0||y>=arrayList[0].length){ }else{ arrayList[x][y]=2;//此时蛇头位置 } intheadx=snakeBody.get(0).x;//头部坐标 intheady=snakeBody.get(0).y; arrayList[headx][heady]=1;//蛇头变蛇身 inttailx=snakeBody.get(snakeBody.size()-1).x;//尾部坐标 inttaily=snakeBody.get(snakeBody.size()-1).y; arrayList[tailx][taily]=0;//修改尾部 returnfalse;//游戏结束 } arrayList[x][y]=2;//此时蛇头位置 intheadx=snakeBody.get(0).x;//头部坐标 intheady=snakeBody.get(0).y; arrayList[headx][heady]=1;//蛇头变蛇身 snakeBody.add(0,newPoint(x,y));//添加新的头部 inttailx=snakeBody.get(snakeBody.size()-1).x;//尾部坐标 inttaily=snakeBody.get(snakeBody.size()-1).y; if(x==foodx&&y==foody){//吃掉了豆豆 flag=true;//可以产生新的豆豆 score+=time;//总分数 time=30;//新豆豆的分值 }else{ arrayList[tailx][taily]=0;//修改尾部 snakeBody.remove(snakeBody.size()-1);//删除旧的尾部 } returntrue; } 3.2.5记录游戏的功能 3.2.5.1判断是否可进入记录: publicbooleanenableShow(){ if(score==0){ returnfalse; } if(! newFile("Data").exists()){//Data目录不存在 returntrue; } if(! newFile("Data","list.snake").exists()){//list.snake文件不存在 returntrue; } Filefile=newFile("Data","list.snake"); try{ BufferedReaderiostream=newBufferedReader(newFileReader(file)); Stringstrline=iostream.readLine(); if(strline==null){//空文件 returntrue; } introw=0; while(strline! =null){ Stringstr[]=strline.split("#");//信息以#分隔成name和score两部分 if(str.length! =2){//格式错误时删除文件 iostream.close();//关闭流否则无法删除文件 file.delete();//删除文件 returntrue; } intgain=Integer.parseInt(str[1]); if(score>=gain){ returntrue; } strline=iostream.readLine();//读取下一行 row++; } if(row<=9){ returntrue; } iostream.close();//关闭流 }catch(FileNotFoundExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } returnfalse; } 3.2.5.2保存数据到文件: publicvoidsaveDataToFile(Stringfilename){ if(gameover){//游戏已结束无法保存 return; } Filefile=newFile("Data",filename); try{ BufferedWriterout=newBufferedWriter(newFileWriter(file)); //当前矩阵 out.write("Matrix\n"); for(inti=0;i for(intj=0;j out.write(arrayList[i][j]+"#"); } out.write("\n");//换行 } //snakeBody out.write("snakeBody\n"); for(inti=0;i Stringstr=String.valueOf(snakeBody.get(i).x); str+=","+String.valueOf(snakeBody.get(i).y); out.write(str+"\n"); } //头部坐标 out.write("head\n"); out.write(x+","+y+"\n"); //当前食物坐标 out.write("food\n"); out.write(foodx+","+foody+"\n"); //是否可产生新的食物 out.write("flag\n"); out.write(String.valueOf(flag)+"\n"); //移动方向 out.write("direction\n"); out.write(String.valueOf(direction)+"\n"); //当前总分 out.write("score\n"); out.write(String.valueOf(score)+"\n"); //当前食物剩余分值 out.write("time\n"); out.write(String.valueOf(time)+"\n"); //关闭流 out.close(); }catch(IOExceptione){ e.printStackTrace(); }catch(Exceptionee){ } } 3.2.5.3从文件中读取数据: publicvoidreadDataFromFile(Stringfilename){ for(inti=0;i for(intj=0;j arrayList[i][j]=0;//全部初始化为空 } } snakeBody.clear(); Filefile=newFile("Data",filename); try{ BufferedReaderin=newBufferedReader(newFileReader(file)); Stringstr=in.readLine(); if(! str.equals("Matrix")){ JOptionPane.showMessageDialog(this,"文件格式错误: 无法读取"); return; } //读取矩阵元素 str=in.readLine(); inti=0; while(str! =null){ Stringdata[]=str.split("#"); for(intj=0;j arrayList[i][j]=Integer.parseInt(data[j]); } i++;//下一行 str=in.readLine(); if(str.equals("snakeBody")){ break;//跳出while循环 } } //读取snakeBody数据 str=in.readLine(); while(str! =null){ Stringdata[]=str.split(","); intx=Integer.parseInt(data[0]); inty=Integer.parseInt(data[1]);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 java 贪吃 游戏 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)