版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、面向对象课程设计1. 需求分析1.1游戏开发的可行性游戏开发至今已经有30多年,在这个短暂的时期里,随着硬件水平的提高,游戏开发新技术层出不穷,经典游戏比比皆是。游戏这个名称一直就存在于每个人的日常生活中,如猜拳游戏、猜谜游戏、大地游戏、球类游戏等,林林总总,不胜枚举,甚至于有些流行歌曲把人生也比喻为游戏,好比“一场游戏一场梦” 。因此,游戏对于现代人的成长历程,绝对是一个不可或缺的重要角色。1.2设计目的综合运用在校期间所学理论知识和技能,设计开发贪吃蛇游戏,使自己熟悉应用系统的开发过程,培养独立思考能力,检验学习效果和动手能力,提高工程实践能力。1.3游戏需求 给出1条小蛇和随机出1个食物
2、当小蛇吃到食物时就加分。游戏界面需求良好的用户界面,有分数显示。有存取档功能,并且可以暂停,还有“英雄榜”记录分数排名情况,并且可调节小蛇运动速度。游戏形状(方块)需求良好的方块形状设计,绘制小蛇和食物,小蛇由几个方块组成,食物由1个方块组成。键盘处理事件小蛇可通过键盘方向键(上、下、左、右键)进行向上、向下、向左、向右移动。显示需求当小蛇吃掉几个食物后会变长,并且吃完食物时食物会消失,并立即随机生成1个新的食物。 接口控制本软件需求通过键盘进行操作,在Windows的操作系统下,利用键盘的上、下、左、右键对小蛇进行移动操作,要使用键盘的接口事件。2. 功能设计及源程序的主要部分2.1 游戏流
3、程图2.2 功能的实现,类的实现及类层次 游戏界面public SnakeFrame() setSize(width, height); /设置窗体大小setTitle("贪吃蛇"); /标题SnakePanel panel = new SnakePanel();/游戏面板add(panel); /将面板添加到窗体中setLocation(260, 160); /设置窗体位置setVisible(true);setResizable(false); /禁用窗体最大化功能按钮public SnakePanel() /构造函数/添加功能按钮setLayout(null);add
4、(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
5、, 40);/添加监视器ButtonListener btnListener=new ButtonListener();startGame.addActionListener(btnListener);stopGame.addActionListener(btnListener);saveGame.addActionListener(btnListener);listGame.addActionListener(btnListener);newGame.addActionListener(btnListener);exitGame.addActionListener(btnListener);
6、/取消所有 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);combspee
7、d.setBorder(BorderFactory.createTitledBorder("速度");add(combspeed);/添加组合框combspeed.setBounds(402,340,80,46);comboBoxListener comblistener=new comboBoxListener();combspeed.addActionListener(comblistener);/添加监视器combspeed.setFocusable(false); /取消焦点initGame(); /初始化游戏addKeyListener(new Listener(
8、);/添加键盘按键监视器setFocusable(true); /将焦点设置在当前面板上 以便通过键盘控制游戏thiswin=this;键盘监视器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 !=
9、3)direction = 1; /上else if (key = KeyEvent.VK_RIGHT && direction != 0)direction = 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.getKey
10、Code();/获得键码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)direction = 2; /右else if (key = KeyEvent.VK_DOWN && direction != 1)direction =
11、 3; /下蛇和食物的变化.1蛇和食物的产生:public void drawSnake(Graphics g)Graphics2D g2d = (Graphics2D) g;for(int i=0;i<arrayList.length;i+)for(int j=0;j<arrayListi.length;j+)if(arrayListij = 1) /蛇身g.setColor(frontcolor); /蛇身颜色else if(arrayListij = 2)/蛇头g.setColor(Color.RED); /蛇头颜色else if(arrayListij = 3) /食物g.
12、setColor(foodcolor); /食物颜色if (arrayListij != 0) int curx = border_left + i * 10;int cury = border_top + j * 10;g2d.draw(new Rectangle2D.Double(curx, cury, 8, 8);.2小蛇移动和吃掉食物:public boolean Move() /移动if (direction = 0)x -= 1; /左else if (direction = 1)y -= 1; /上else if (direction = 2)x += 1; /右else if
13、(direction = 3)y += 1; /下/向前移动一步if(GameOver()/游戏结束clock.stop();gameover=true;flag=false; /不再产生新的豆豆if(x < 0 | x >=arrayList.length | y < 0 | y >= arrayList0.length)elsearrayListxy=2; /此时蛇头位置int headx=snakeBody.get(0).x; /头部坐标int heady=snakeBody.get(0).y;arrayListheadxheady=1; /蛇头变蛇身int ta
14、ilx=snakeBody.get(snakeBody.size()-1).x;/尾部坐标int taily=snakeBody.get(snakeBody.size()-1).y;arrayListtailxtaily=0; /修改尾部return false; /游戏结束arrayListxy=2; /此时蛇头位置int headx=snakeBody.get(0).x; /头部坐标int heady=snakeBody.get(0).y;arrayListheadxheady=1; /蛇头变蛇身snakeBody.add(0,new Point(x,y);/添加新的头部int tailx
15、=snakeBody.get(snakeBody.size()-1).x;/尾部坐标int taily=snakeBody.get(snakeBody.size()-1).y;if(x = foodx && y = foody) /吃掉了豆豆flag=true; /可以产生新的豆豆score+=time; /总分数time=30; /新豆豆的分值elsearrayListtailxtaily=0; /修改尾部snakeBody.remove(snakeBody.size()-1);/删除旧的尾部return true;记录游戏的功能.1判断是否可进入记录:public bool
16、ean enableShow()if(score = 0)return false;if(!new File("Data").exists()/Data 目录不存在return true;if(!new File("Data","list.snake").exists()/list.snake 文件不存在return true;File file=new File("Data","list.snake");try BufferedReader iostream=new BufferedReade
17、r(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) /格式错误时删除文件iostream.close();/关闭流 否则无法删除文件file.delete(); /删除文件return true;int gain=Integer.parseI
18、nt(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 (IOException e) / TODO Auto-generated catch blocke.printStackTrace();return fal
19、se;.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;i<arrayList.length;i+)/矩阵数据for(int j=0;j<arrayListi
20、.length;j+)out.write(arrayListij+"#");out.write("n");/换行/snakeBodyout.write("snakeBodyn");for(int i=0;i<snakeBody.size();i+)/链表数据String str=String.valueOf(snakeBody.get(i).x);str+=","+String.valueOf(snakeBody.get(i).y);out.write(str+"n");/头部坐标out.
21、write("headn");out.write(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.valu
22、eOf(direction)+"n");/当前总分out.write("scoren");out.write(String.valueOf(score)+"n");/当前食物剩余分值out.write("timen");out.write(String.valueOf(time)+"n");/关闭流out.close(); catch (IOException e) e.printStackTrace();catch(Exception ee).3从文件中读取数据:public void rea
23、dDataFromFile(String filename)for(int i=0;i<arrayList.length;i+)for(int j=0;j<arrayListi.length;j+)arrayListij=0;/全部初始化为空snakeBody.clear();File file=new File("Data",filename);try BufferedReader in=new BufferedReader(new FileReader(file);String str=in.readLine();if(!str.equals("M
24、atrix")JOptionPane.showMessageDialog(this, "文件格式错误:无法读取");return;/读取矩阵元素str=in.readLine();int i=0;while(str!=null)String data=str.split("#");for(int j=0;j<data.length;j+)arrayListij=Integer.parseInt(dataj);i+;/下一行str=in.readLine();if(str.equals("snakeBody")break
25、;/跳出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(str!=null)String data=
26、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);/读
27、取flagstr=in.readLine();if(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.readLi
28、ne();if(str!=null && str.equals("score")str=in.readLine();if(str!=null)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(); /重绘窗体
29、 catch (FileNotFoundException e) JOptionPane.showMessageDialog(this, "文件未找到");catch(Exception ee)英雄排行榜的设计.1排行榜的构造:public ListFrame()/构造函数setTitle("排行版");setLayout(new BorderLayout();title=new JButton("英雄排行榜");add(BorderLayout.NORTH,title);title.setFocusable(false);for(i
30、nt i=0;i<10;i+)tabledatai0=String.valueOf(i+1);for(int j=1;j<3;j+)tabledataij="".2排行榜的排行记录与顺序:public static void main(String args) new ListFrame();/显示记录public static void showList()new ListFrame().table.setEnabled(false);/插入一条新的记录public static void insertNewData(int score)ListFrame l
31、istwin=new ListFrame();Object obj=listwin.tabledata;boolean over=false;for(int i=0;i<10;i+)String str=(String)obji2;if(str.equals("")obji2=score;/插入新的记录obji1="input your name"over=true;listwin.currentrow=i;break;int data=Integer.parseInt(str);if(score >= data)for(int j=9;j&
32、gt;i;j-)/依次后移下面的数据objj2=objj-12;objj1=objj-11;obji2=score;obji1="input your name"over=true;listwin.currentrow=i;break;if(!over)/没有超过以前的记录不可编辑return;选中当前单元格editor.selectAll();.3排行榜记录文件的读取:public void checkFile(String filename)/检查 Data 目录是否存在if(new File("Data").exists()elsenew File
33、("Data").mkdir();/创建 Data 目录/检查指定 文件是否存在listfile=new File("Data",filename);if(listfile.exists()/文件已经存在else /文件不存在 创建新的文件trylistfile.createNewFile();catch(Exception e)JOptionPane.showMessageDialog(this, "创建排名文件时发生错误!");/从文件中读取排名信息public void readFromFile(String filename)
34、checkFile(filename);try/读取排名信息文件iostream=new BufferedReader(new FileReader(listfile);String strline=iostream.readLine();int row=0;while(strline!=null)String str=strline.split("#");/信息以#分隔成 name 和 score 两部分if(str.length!=2)JOptionPane.showMessageDialog(this, "读入排名文件时发生错误");return;
35、tabledatarow1=str0;/姓名tabledatarow2=str1;/分数row+;if(row >= 10)break;strline=iostream.readLine();/读取下一行iostream.close();/关闭流catch(Exception ee)/将数据写入文件public void writeDataToFile()tryBufferedWriter write=new BufferedWriter(new FileWriter(listfile);for(int i=0;i<10;i+)String str=tabledatai1+&quo
36、t;#"+tabledatai2+"n"if(str.equals("#n")break;write.write(str);write.close();catch (Exception e) 3. 开发平台Java: _07; Java HotSpot(TM) Client VM 10.0-b234. 测试与发布4.1运行测试过程开始新游戏游戏运行 游戏结束变化游戏难度游戏排行榜游戏存取档4.2测试结果游戏运行状况良好,未发现bug。5. 自我评价与总结5.1遇到的问题及解决的办法先是不太清楚图形化界面的设计,后来在同学的帮助和自己的查找下解决了这个问题。后来在蛇的移动的表示上也不太清楚,找了一些资料后发现蛇身由一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 夯实基础 2026年秋季九年级道德与法治部编版第二单元单元检测卷(含答案)
- 温故知新 2026-2027学年第一学期九年级英语外研版第五单元单元归类复习卷(含答案)
- 更上一层楼 2026-2027学年第一学期高二英语人教版第二单元单元检测卷(含答案)
- 快速提分 2026年秋季高二道德与法治部编版12月月考试卷(含答案)
- 2027年广东省道德与法治九年级全真模拟卷(含答案)
- 2027年四川省语文初三冲刺提分卷(含答案)
- 2027年云南省语文九年级查缺补漏专练(含答案)
- 经括约肌间入路手术治疗复杂性肛瘘研究总结2026
- 2026 综合岗事业编面试真题集 含答案含解析
- 2026 事业编计算机岗面试真题汇编 含解析
- 2026年强制性产品认证应知应会培训考核卷(十一)
- 2026年法律职业资格考试商经法客观题练习带答案
- 检维修作业:安全要点与应急处置
- 2026金属基陶瓷复合材料技术创新与应用展望报告
- 2026-2027学年人教版七年级数学上册期中测试卷(带答案解析)
- GB 48063-2026交通运输北斗卫星导航系统定位模块通用技术规范
- 2025年江苏泰州市中考语文试卷真题及答案详解(精校打印)
- 人教PEP版(2024)四年级上册英语-Unit 4 Helping in the community 单元整体教学设计(共6课时)
- DCS报警管理制度
- 中外航海文化知到课后答案智慧树章节测试答案2025年春中国人民解放军海军大连舰艇学院
- 《绩效考核培训课件》
评论
0/150
提交评论