版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、面向对象课程设计1. 需求分析1.1游戏开发的可行性游戏开发至今已经有30多年,在这个短暂的时期里,随着硬件水平的提高,游戏开发新技术层出不穷,经典游戏比比皆是。游戏这个名称一直就存在于每个人的日常生活中,如猜拳游戏、猜谜游戏、大地游戏、球类游戏等,林林总总,不胜枚举,甚至于有些流行歌曲把人生也比喻为游戏,好比“一场游戏一场梦” 。因此,游戏对于现代人的成长历程,绝对是一个不可或缺的重要角色。1.2设计目的综合运用在校期间所学理论知识和技能,设计开发贪吃蛇游戏,使自己熟悉应用系统的开发过程,培养独立思考能力,检验学习效果和动手能力,提高工程实践能力。1.3游戏需求 给出1条小蛇和随机出1个食物
2、当小蛇吃到食物时就加分。1.3.1游戏界面需求良好的用户界面,有分数显示。有存取档功能,并且可以暂停,还有“英雄榜”记录分数排名情况,并且可调节小蛇运动速度。1.3.2游戏形状(方块)需求良好的方块形状设计,绘制小蛇和食物,小蛇由几个方块组成,食物由1个方块组成。1.3.3键盘处理事件小蛇可通过键盘方向键(上、下、左、右键)进行向上、向下、向左、向右移动。1.3.4显示需求当小蛇吃掉几个食物后会变长,并且吃完食物时食物会消失,并立即随机生成1个新的食物。1.3.5 接口控制本软件需求通过键盘进行操作,在windows的操作系统下,利用键盘的上、下、左、右键对小蛇进行移动操作,要使用键盘的接口事
3、件。2. 功能设计及源程序的主要部分2.1 游戏流程图2.2 功能的实现,类的实现及类层次 2.2.1游戏界面public snakeframe() setsize(width, height); /设置窗体大小settitle(贪吃蛇); /标题snakepanel panel = new snakepanel();/游戏面板add(panel); /将面板添加到窗体中setlocation(260, 160); /设置窗体位置setvisible(true);setresizable(false); /禁用窗体最大化2.2.2功能按钮public snakepanel() /构造函数/添加
4、功能按钮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
5、.setbounds(402, 300, 80, 40);/添加监视器buttonlistener btnlistener=new buttonlistener();startgame.addactionlistener(btnlistener);stopgame.addactionlistener(btnlistener);savegame.addactionlistener(btnlistener);listgame.addactionlistener(btnlistener);newgame.addactionlistener(btnlistener);exitgame.addactio
6、nlistener(btnlistener);/取消所有 button 的焦点startgame.setfocusable(false);stopgame.setfocusable(false);savegame.setfocusable(false);listgame.setfocusable(false);newgame.setfocusable(false);/速度string speed=1,2,3,4,5,预设;combspeed=new jcombobox(speed);combspeed.setborder(borderfactory.createtitledborder(速度)
7、;add(combspeed);/添加组合框combspeed.setbounds(402,340,80,46);comboboxlistener comblistener=new comboboxlistener();combspeed.addactionlistener(comblistener);/添加监视器combspeed.setfocusable(false); /取消焦点initgame(); /初始化游戏addkeylistener(new listener();/添加键盘按键监视器setfocusable(true); /将焦点设置在当前面板上 以便通过键盘控制游戏thisw
8、in=this;2.2.3键盘监视器class listener implements keylistener public void keypressed(keyevent e) int key = e.getkeycode();/获得键码if (key = keyevent.vk_left & direction != 2)direction = 0; /左else if (key = keyevent.vk_up & direction != 3)direction = 1; /上else if (key = keyevent.vk_right & direction != 0)dire
9、ction = 2; /右else if (key = keyevent.vk_down & direction != 1)direction = 3; /下public void keyreleased(keyevent e) overridepublic void keytyped(keyevent e) public void keypressed(keyevent e) int key = e.getkeycode();/获得键码if (key = keyevent.vk_left & direction != 2)direction = 0; /左else if (key = key
10、event.vk_up & direction != 3)direction = 1; /上else if (key = keyevent.vk_right & direction != 0)direction = 2; /右else if (key = keyevent.vk_down & direction != 1)direction = 3; /下2.2.4蛇和食物的变化2.2.4.1蛇和食物的产生:public void drawsnake(graphics g)graphics2d g2d = (graphics2d) g;for(int i=0;iarraylist.length
11、;i+)for(int j=0;jarraylisti.length;j+)if(arraylistij = 1) /蛇身g.setcolor(frontcolor); /蛇身颜色else if(arraylistij = 2)/蛇头g.setcolor(color.red); /蛇头颜色else if(arraylistij = 3) /食物g.setcolor(foodcolor); /食物颜色if (arraylistij != 0) int curx = border_left + i * 10;int cury = border_top + j * 10;g2d.draw(new r
12、ectangle2d.double(curx, cury, 8, 8);2.2.4.2小蛇移动和吃掉食物:public boolean move() /移动if (direction = 0)x -= 1; /左else if (direction = 1)y -= 1; /上else if (direction = 2)x += 1; /右else if (direction = 3)y += 1; /下/向前移动一步if(gameover()/游戏结束clock.stop();gameover=true;flag=false; /不再产生新的豆豆if(x =arraylist.length
13、 | y = arraylist0.length)elsearraylistxy=2; /此时蛇头位置int headx=snakebody.get(0).x; /头部坐标int heady=snakebody.get(0).y;arraylistheadxheady=1; /蛇头变蛇身int tailx=snakebody.get(snakebody.size()-1).x;/尾部坐标int taily=snakebody.get(snakebody.size()-1).y;arraylisttailxtaily=0; /修改尾部return false; /游戏结束arraylistxy=
14、2; /此时蛇头位置int headx=snakebody.get(0).x; /头部坐标int heady=snakebody.get(0).y;arraylistheadxheady=1; /蛇头变蛇身snakebody.add(0,new point(x,y);/添加新的头部int tailx=snakebody.get(snakebody.size()-1).x;/尾部坐标int taily=snakebody.get(snakebody.size()-1).y;if(x = foodx & y = foody) /吃掉了豆豆flag=true; /可以产生新的豆豆score+=tim
15、e; /总分数time=30; /新豆豆的分值elsearraylisttailxtaily=0; /修改尾部snakebody.remove(snakebody.size()-1);/删除旧的尾部return true;2.2.5记录游戏的功能2.2.5.1判断是否可进入记录:public boolean enableshow()if(score = 0)return false;if(!new file(data).exists()/data 目录不存在return true;if(!new file(data,list.snake).exists()/list.snake 文件不存在re
16、turn true;file file=new file(data,list.snake);try bufferedreader iostream=new bufferedreader(new filereader(file);string strline=iostream.readline();if(strline = null)/空文件return true;int row=0;while(strline!=null)string str=strline.split(#);/信息以#分隔成 name 和 score 两部分if(str.length!=2) /格式错误时删除文件iostre
17、am.close();/关闭流 否则无法删除文件file.delete(); /删除文件return true;int gain=integer.parseint(str1);if(score = gain)return true;strline=iostream.readline();/读取下一行row+;if(row = 9)return true;iostream.close();/关闭流 catch (filenotfoundexception e) / todo auto-generated catch blocke.printstacktrace(); catch (ioexcep
18、tion e) / todo auto-generated catch blocke.printstacktrace();return false;2.2.5.2保存数据到文件:public void savedatatofile(string filename)if(gameover) /游戏已结束无法保存return;file file=new file(data,filename);try bufferedwriter out=new bufferedwriter(new filewriter(file);/当前矩阵out.write(matrixn);for(int i=0;iarra
19、ylist.length;i+)/矩阵数据for(int j=0;jarraylisti.length;j+)out.write(arraylistij+#);out.write(n);/换行/snakebodyout.write(snakebodyn);for(int i=0;isnakebody.size();i+)/链表数据string str=string.valueof(snakebody.get(i).x);str+=,+string.valueof(snakebody.get(i).y);out.write(str+n);/头部坐标out.write(headn);out.wri
20、te(x+,+y+n);/当前食物坐标out.write(foodn);out.write(foodx+,+foody+n);/是否可产生新的食物out.write(flagn);out.write(string.valueof(flag)+n);/移动方向out.write(directionn);out.write(string.valueof(direction)+n);/当前总分out.write(scoren);out.write(string.valueof(score)+n);/当前食物剩余分值out.write(timen);out.write(string.valueof(t
21、ime)+n);/关闭流out.close(); catch (ioexception e) e.printstacktrace();catch(exception ee)2.2.5.3从文件中读取数据:public void readdatafromfile(string filename)for(int i=0;iarraylist.length;i+)for(int j=0;jarraylisti.length;j+)arraylistij=0;/全部初始化为空snakebody.clear();file file=new file(data,filename);try buffered
22、reader in=new bufferedreader(new filereader(file);string str=in.readline();if(!str.equals(matrix)joptionpane.showmessagedialog(this, 文件格式错误:无法读取);return;/读取矩阵元素str=in.readline();int i=0;while(str!=null)string data=str.split(#);for(int j=0;jdata.length;j+)arraylistij=integer.parseint(dataj);i+;/下一行st
23、r=in.readline();if(str.equals(snakebody)break;/跳出while循环/读取snakebody数据str=in.readline();while(str!=null)string data=str.split(,);int x=integer.parseint(data0);int y=integer.parseint(data1);snakebody.add(new point(x,y); /每次都添加到尾部str=in.readline();if(str.equals(head)break;/读取头部坐标str=in.readline();if(s
24、tr!=null)string data=str.split(,);x=integer.parseint(data0);y=integer.parseint(data1);str=in.readline();if (str!=null & str.equals(food) /读取当前食物坐标str = in.readline();if (str != null) string data = str.split(,);foodx = integer.parseint(data0);foody = integer.parseint(data1);/读取flagstr=in.readline();i
25、f(str!=null & str.equals(flag)str=in.readline();if(str!=null)flag=boolean.parseboolean(str);/读取移动方向str=in.readline();if(str!=null & str.equals(direction)str=in.readline();if(str!=null)direction=integer.parseint(str);/读取总分str=in.readline();if(str!=null & str.equals(score)str=in.readline();if(str!=nul
26、l)score=integer.parseint(str);/读取当前食物剩余分值str=in.readline();if(str!=null & str.equals(time)str=in.readline();if(str!=null)time=integer.parseint(str);/关闭流in.close();clock.stop();repaint(); /重绘窗体 catch (filenotfoundexception e) joptionpane.showmessagedialog(this, 文件未找到);catch(exception ee)2.2.6英雄排行榜的设计
27、2.2.6.1排行榜的构造:public listframe()/构造函数settitle(排行版);setlayout(new borderlayout();title=new jbutton(英雄排行榜);add(borderlayout.north,title);title.setfocusable(false);for(int i=0;i10;i+)tabledatai0=string.valueof(i+1);for(int j=1;j3;j+)tabledataij=;2.2.6.2排行榜的排行记录与顺序:public static void main(string args) n
28、ew listframe();/显示记录public static void showlist()new listframe().table.setenabled(false);/插入一条新的记录public static void insertnewdata(int score)listframe listwin=new listframe();object obj=listwin.tabledata;boolean over=false;for(int i=0;i= data)for(int j=9;ji;j-)/依次后移下面的数据objj2=objj-12;objj1=objj-11;o
29、bji2=score;obji1=input your name;over=true;listwin.currentrow=i;break;if(!over)/没有超过以前的记录listwin.table.setenabled(false);/不可编辑return;listwin.table.iscelleditable(listwin.currentrow, 1);listwin.table.editcellat(listwin.currentrow, 1);/选中当前单元格jtextfield editor=(jtextfield)listwin.table.getcelleditor()
30、.gettablecelleditorcomponent(listwin.table, listwin.table.getvalueat(listwin.currentrow, 1), true, listwin.currentrow, 1);editor.selectall();2.2.6.3排行榜记录文件的读取:public void checkfile(string filename)/检查 data 目录是否存在if(new file(data).exists()elsenew file(data).mkdir();/创建 data 目录/检查指定 文件是否存在listfile=new
31、 file(data,filename);if(listfile.exists()/文件已经存在else /文件不存在 创建新的文件trylistfile.createnewfile();catch(exception e)joptionpane.showmessagedialog(this, 创建排名文件时发生错误!);/从文件中读取排名信息public void readfromfile(string filename)checkfile(filename);try/读取排名信息文件iostream=new bufferedreader(new filereader(listfile);s
32、tring strline=iostream.readline();int row=0;while(strline!=null)string str=strline.split(#);/信息以#分隔成 name 和 score 两部分if(str.length!=2)joptionpane.showmessagedialog(this, 读入排名文件时发生错误);return;tabledatarow1=str0;/姓名tabledatarow2=str1;/分数row+;if(row = 10)break;strline=iostream.readline();/读取下一行iostream.
33、close();/关闭流catch(exception ee)system.out.println(ee);/将数据写入文件public void writedatatofile()trybufferedwriter write=new bufferedwriter(new filewriter(listfile);for(int i=0;i10;i+)string str=tabledatai1+#+tabledatai2+n;if(str.equals(#n)break;write.write(str);write.close();catch (exception e) 3. 开发平台ja
34、va: 1.6.0_07; java hotspot(tm) client vm 10.0-b234. 测试与发布4.1运行测试过程4.1.1开始新游戏4.1.2游戏运行4.1.3 游戏结束4.1.4变化游戏难度4.1.5游戏排行榜4.1.6游戏存取档4.2测试结果游戏运行状况良好,未发现bug。5. 自我评价与总结5.1遇到的问题及解决的办法先是不太清楚图形化界面的设计,后来在同学的帮助和自己的查找下解决了这个问题。后来在蛇的移动的表示上也不太清楚,找了一些资料后发现蛇身由一串基本图形构成,每过一秒,检测前面是什么,如果是空的,那么把头画成普通身体的样子,再在前方(或侧面,如果转弯的话)再画一个头,并将其坐标记入
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 儿科医生简短述职报告
- 中秋节的演讲稿(范文15篇)
- 口才班课件教学课件
- 高等数学教程 上册 第4版 习题及答案 P225 第9章 微分方程
- 文书模板-天然气公司股东协议书
- 政策滥用及其对商家的影响 -2023年全球参考基准
- 高校课程课件教学课件
- 綦江区七年级上学期语文期末考试试卷
- 第二中学九年级上学期语文开学考试试卷
- 部编版小学语文三年级上册第20课《美丽小兴安岭》读写练习题
- 做情绪的主人拒绝精神内耗
- 药学大学生职业规划
- 心理放松训练
- 客户需求及层次
- 海绵城市完整
- 力敏传感器教学课件
- 强奸罪起诉状
- 2024年广东佛山市三水区淼城建设投资有限公司招聘笔试参考题库附带答案详解
- 《排球运动》PPT课件(部级优课)
- 高速公路绿化设计案例课件
- 初中美术九年级上册 第8课 最亲近的家具
评论
0/150
提交评论