基于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;ifor(intj=0;jif(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;ifor(intj=0;jout.write(arrayList[i][j]+"#");
}
out.write("\n");//换行
}
//snakeBody
out.write("snakeBody\n");
for(inti=0;iStringstr=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;ifor(intj=0;jarrayList[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;jarrayList[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]);