版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 面向对象程序设计课程设计报告题 目: 贪吃蛇游戏设计与实现 院 (系): 信息科学与工程学院 专业班级: 计科1302班 学生姓名: 毛慧剑 学 号: 20131101057 指导教师: 苏莹 2015年8月31日至2015年9月25日华中科技大学武昌分校制 面向对象程序设计 课程设计任务书一、设计(调查报告/论文)题目贪吃蛇游戏设计与实现二、设计(调查报告/论文)主要内容内容:玩家可以通过键盘或鼠标控制游戏区。游戏设定不同级别,级别越高难度越大,玩家可以根据自己的需要自由设定初始游戏级别,当玩家取得的分数到达一定水平时游戏自动进入下一个级别。游戏以最终玩家获得的分数来判断玩家水平的高低。使
2、用Eclipse 和JDK1.6工具,操作系统为WINDOWS,采用面向对象方法完成,包括总体设计、详细设计、编码实现、测试。设计要求如下:游戏由模块组成:游戏区模块,游戏控制模块,级别设置模块和帮助模块。游戏区模块,为玩家提供主体游戏功能,能够处理玩家的各种游戏操作,显示得分情况,并最终显示游戏结果。游戏控制模块,该模块为玩家提供游戏控制功能,应包括开始游戏,暂停游戏和退出游戏三部分功能。级别设置模块为玩家提供自行设置游戏的初始级别功能,主要提供初级,中级和高级三个游戏初始级别设置。 三、原始资料1.面向对象程序设计课程设计指导书2. 耿祥义JAVA大学实用教程北京:清华大学出版社,2009
3、四、要求的设计(调查/论文)成果1.课程设计报告2.课程设计软件五、进程安排布置任务,查找资料、需求分析2天总体设计1天详细设计2天编制源程序实现4天测试与修改1天撰写课设报告2天六、主要参考资料1 张广彬. Java课程设计案例精编(第二版).北京:清华大学出版社, 2011. 2 耿祥义. Java课程设计(第二版).北京:清华大学出版社, 2008.3 耿祥义JAVA大学实用教程北京:清华大学出版社,20094 邹林达陈国君 Java2程序设计基础北京:清华大学出版社,2010指导教师(签名): 20 年 月 日目录1需求与总体设计11.1总体设计思路11.2系统主要功能图11.3系统主
4、要类图22详细设计32.1 Login类32.2 SnakeFrame类32.3 SnakeModel类32.4 SnakePanel类32. 5 LocationRO类. .42.6 Location类.43.编码实现43.1 Login类的详细代码43.2 SnakeFrame类的详细代码73.3 SnakeModel类的详细代码123.4 SnakePanel类的详细代码173.5 LocationRO类的详细代码223.6 Location类的详细代码234系统运行与测试254.1程序主界面254.2游戏开始界面254.3游戏操作界面254.4游戏难度设置界面264.5游戏窗口大小设置
5、274.6游戏软件开发人员介绍275系统使用步骤28总结291需求与总体设计1.1总体设计思路 本系统要进行的是贪吃蛇游戏的开发。这个游戏是在窗口的平台上进行相关操作的。为了满足大部分用户的要求,本游戏必须实现的功能有如下要求:(1)贪吃蛇游戏是大家很常见的小游戏,在生活工作之余大家可以玩它,已达到放松各种压力的目的。 (2)游戏可以进行升级,也就是增加吃食物的难度,以便使大家更有挑战性,不觉得太无趣。(3)游戏界面大小可以任意指定,数据从文件读入。(4)利用swing实现良好的GUI界面。(5)基本功能与要求:给出1条小蛇和随机出一个食物当小蛇吃到食物时就加分.良好的用户界面,有分数显示,并
6、且可调节小蛇运动速度。良好的方块形状设计,绘制小蛇和食物,小蛇有六个方块组成,食物由1个方块组成。小蛇可通过键盘方向键(上、下、左、右键)进行向上、向下、向左、向右移动。当小蛇吃掉一个食物后会变长,并且吃完食物时食物会消失,并立即随即生成一个新的食物.1.2系统主要功能图贪吃蛇实现的基本功能:生成登录窗口界面,登录进入游戏,可以设置游戏的窗口大小和难度等级 游戏途中有暂停 继续 开始等基本功能。同时还设有游戏帮助等具体游戏操作指示、在加入了软件开发人员的相关信息介绍结束游戏之后得分在窗口下自动统计得出贪吃蛇游戏设计游戏设置结束游戏得出分数 控制方向进入游戏 登陆界面 图1-1系统功能图1.3系
7、统主要类图 图1-2类图2详细设计2.1 Login类Login类,登陆界面要求输入登陆者输入用户名和密码,分别设Go和Cancel两个登陆选项。 2.1.1 Login属性: 用户名 密码Go(进入游戏) Cancel(取消)操作: Enter() Close()2.2 SnakeFrame类创建游戏窗口主界面。采用图形界面设计,有窗体,菜单栏和游戏操作界面。2.3 SnakeModel类此类为蛇的初始化状态及模型,所有的游戏的开始都通过此类初始化及对蛇的操作。SnakeModel属性: rows,cols,snakeHead,runingDiriction,locRO,snake,play
8、Blocks snakeFood,gameScore,AddScore操作: LocationRO getSnakeHead(),LocationRO getSnakeTail(), Location getRuningDiriction(),LinkedList getSnake(), LinkedList getOthers(), getScore(),getAddScore(), setSnakeHead(Location snakeHead),LocationRO getSnakeFood(), setSnakeFood(),moveTo(Object a,LinkedList fro
9、mlist,LinkedList tolist), init(),SnakeModel(int rows1,int cols1),move(Location direction)2.4 SnakePanel类此类为游戏界面创建蛇的面板和蛇的移动控制实现SnakePanel属性:gridsPanel, row; col; gridsPanel;direction;snake; snakeBody; otherBlocks;snakeHead; snakeFood; gameScore=0; speed; AddScore; t; isEnd; notExit;操作:SnakePanel(Snak
10、eFrame parent,int row,int col),newGame(long speed)stopGame(),returnGame(),getGameScore(),updateTextFiled(String str)updateColors(),run(),keyPressed(KeyEvent event)keyReleased(KeyEvent event),keyTyped(KeyEvent event)change(SnakeFrame parent,int row2, int col2)2.5 LocationRO类随机生成的食物位置。用来随机生成食物。引导蛇的移动方
11、向。2.6 Location类对蛇的位置的描述类Location属性: x y操作:Location(int x,int y) ,getX(),getY(),setX(int x),setY(int y) ,equalOrRev(Location e),equals(Location e) ,reverse(Location e)3编码实现1.Login类/登陆界面public class Login extends JFrame private TextField f1;/创建文本框private TextField f2;private JButton b1;/创建按钮private JB
12、utton b2;public Login() /登陆界面Container cp=getContentPane();/获取容器cp.setLayout(new GridLayout(4,1);/设置布局管理为网格四行一列Label l1=new Label("用户名");/创建标签了l1,l2Label l2=new Label("密 码"); Panel p1=new Panel();/创建面板,p1,p2,p3,p4Panel p2=new Panel();Panel p3=new Panel();MyPanel1 p4=new MyPanel1(
13、);/创建插入图片平面p4f1=new TextField(10);f2=new TextField(10);f2.setEchoChar('*');/回显字符为* 用于输入密码,设置为不可见b1=new JButton("确定");/新建按钮b1,b2b2=new JButton("取消");p1.add(l1);/第一行添加label 1p1.add(f1);p2.add(l2);p2.add(f2);p3.add(b1);p3.add(b2);cp.add(p4);/面板p4,p1,p2,p3分别加入容器cpcp.add(p1);c
14、p.add(p2);cp.add(p3);b1.addActionListener(new Enter();/添加按钮事件响应b2.addActionListener(new Close(); JFrame.setDefaultLookAndFeelDecorated(true); SnakeFrame frame=new SnakeFrame();/创建游戏主界面 frame.setSize(frame.col*11+11,frame.row*11+100); frame.setResizable(false); frame.setLocation(500,200);/设置窗体位置 fram
15、e.setTitle("疯狂贪吃蛇"); frame.setVisible(true); else JOptionPane.showMessageDialog(null, "用户名或密码错误,请重新登录!");/错误用户提示class Close implements ActionListener /关闭登陆按钮响应public void actionPerformed(ActionEvent e) JButton bt=(JButton)e.getSource();if(bt=b2) System.exit(0);/退出/主函数 程序开始public
16、static void main(String args) Login log=new Login(); log.setTitle("疯狂贪吃蛇界面登陆"); log.setBounds(500, 200, 300, 300); log.setBackground(Color.blue); log.setVisible(true);class MyPanel1 extends JPanel /插入登陆界面图片Image img=Toolkit.getDefaultToolkit().getImage("imgs/201.jpg");/添加图片public
17、 void paint(Graphics g) g.drawImage(img,0,0,this);2.SnakeFrame 类public class SnakeFrame extends JFrame implements ActionListenerint row=30;int col=45;SnakePanel p=new SnakePanel(this,row,col);JMenuBar menubar=new JMenuBar();/菜单条JMenu fileMenu=new JMenu("文件");/菜单JMenuItem newgameitem=new JM
18、enuItem("开始");/菜单条目JMenuItem stopitem=new JMenuItem("暂停");JMenuItem runitem=new JMenuItem("继续");JMenuItem exititem=new JMenuItem("退出"); /"设置"菜单JMenu optionMenu=new JMenu("设置"); /* * 等级选项 * ButtonGroup 创建一组按钮选项 * JRadioButtonMenuItem 是属于一组菜单
19、项中的一个菜单项,该组中只能选择一个项。 * 被选择的项显示其选择状态。选择此项的同时,其他任何以前被选择的项都切换到未选择状态。 * Panel 是最简单的容器类。应用程序可以将其他组件放在面板提供的空间内,这些组件包括其他面板。 */ JMenu degreeMenu=new JMenu("等级"); ButtonGroup groupDegree = new ButtonGroup(); JRadioButtonMenuItem oneItem= new JRadioButtonMenuItem("初级"); JRadioButtonMenuIte
20、m twoItem= new JRadioButtonMenuItem("中级"); JRadioButtonMenuItem threeItem= new JRadioButtonMenuItem("高级"); / 设置“窗口大小”菜单 JMenu windowsMenu = new JMenu("窗口大小"); JMenu windowsMenu1 = new JMenu("视图"); ButtonGroup groupDegree1 = new ButtonGroup(); JRadioButtonMenuI
21、tem minItem= new JRadioButtonMenuItem("小"); JRadioButtonMenuItem midItem= new JRadioButtonMenuItem("中"); JRadioButtonMenuItem maxItem= new JRadioButtonMenuItem("大"); / 设置“作者信息”菜单 JMenu XinXi=new JMenu("关于开发者"); JMenuItem XinXiItem=new JMenuItem("软件相关"
22、;); /设置“帮助”菜单 JMenu helpMenu=new JMenu("帮助"); JMenuItem helpItem=new JMenuItem("操作指南"); /可以被选定或取消选定的菜单项. final JCheckBoxMenuItem showGridItem = new JCheckBoxMenuItem("显示网格"); JLabel scorelabel;/为分数创建标签 public JTextField scoreField;/显示分数的文本框 private long speedtime=200; p
23、rivate String helpstr = "游戏说明:n1 :方向键控制蛇移动的方向."+ "n2 :单击菜单'文件->开始'开始游戏."+ "n3 :单击菜单'文件->暂停'或者单击键盘空格键暂停游戏."+ "n4 :单击菜单'文件->继续'继续游戏."+ "n5 :单击菜单'设置->等级'可以设置难度等级."+ "n6 :单击菜单'设置->显示网格'可以设置是否显示网
24、格."+ "n7 :红色为食物,吃一个得30分同时蛇身加长."+ "n8 :蛇不可以出界或自身相交,否则结束游戏."SnakeFrame() scoreField.setHorizontalAlignment(0);/设置图标和文本的水平对齐方式JPanel toolPanel=new JPanel();toolPanel.add(scorelabel);toolPanel.add(scoreField);contentpane.add(toolPanel);/事件监听 使得按钮可以响应 showGridItem.addActionListen
25、er(this);public void actionPerformed(ActionEvent e) / 事件响应 从接口 ActionListener 复制的描述 ,发生操作时调用。 try/异常捕获 if(e.getSource()=helpItem) JOptionPane.showConfirmDialog(p,helpstr,"操纵说明",JOptionPane.PLAIN_MESSAGE); else if(e.getSource()=exititem) JOptionPane.showConfirmDialog(null, "你确定退出游戏吗?&q
26、uot;, " ", JOptionPane.showMessageDialog(this,"疯狂贪吃蛇nn武昌首义学院n信息科学与工程学院n计算机科学与技术" +"n学号:20131101057" +"n姓名: 毛慧剑n指导老师:苏莹n2015年9月", "软件相关",JOptionPane.INFORMATION_MESSAGE); else if(e.getSource()=midItem) row=40;col=60; p.change(this,row,col); this.setSi
27、ze(col*11+11,row*11+100); else if(e.getSource()=maxItem) row=50;col=70; p.change(this,row,col); this.setSize(col*11+11,row*11+100); catch(Exception ee)ee.printStackTrace();/异常处理3.SnakeModelimport java.util.LinkedList;import javax.swing.JOptionPane;public class SnakeModel private int rows,cols;/行列数pr
28、ivate Location snakeHead,runingDiriction;/运行方向private LocationRO locRO;/LocationRO类数组private LinkedList snake,playBlocks;/蛇及其它区域块private LocationRO snakeFood;/目标食物private int gameScore=0; /分数private boolean AddScore=false;/加分 /获得蛇头public LocationRO getSnakeHead() return (LocationRO)(snake.getLast();
29、/蛇尾public LocationRO getSnakeTail()return (LocationRO)(snake.getFirst();/运行路线public Location getRuningDiriction()return runingDiriction;/获得蛇实体区域public LinkedList getSnake()return snake;private void setSnakeHead(Location snakeHead)this.snakeHead=snakeHead; /获得目标食物public LocationRO getSnakeFood()retur
30、n snakeFood;/随机设置目标食物private void moveTo(Object a,LinkedList fromlist,LinkedList tolist)fromlist.remove(a);tolist.add(a); public void init()playBlocks.clear();snake.clear();gameScore=0; for(int i=0;i<rows;i+) for(int j=0;j<cols;j+) playBlocks.add(locROij); /初始化蛇的形状 for(int i=4;i<6;i+) moveT
31、o(locRO4i,playBlocks,snake); /蛇头位置 snakeHead=new Location(4,6); /设置随机块 snakeFood=new LocationRO(0,0); setSnakeFood(); /初始化运动方向 init();/ /*定义布尔型move方法,如果运行成功则返回true,否则返回false/*参数direction是Location类型,/*direction 的值:(-1,0)表示向上;(1,0)表示向下;/*(0,-1)表示向左;(0,1)表示向右;/*/public boolean move(Location direction)/
32、判断设定的方向跟运行方向是不是相反if (direction.reverse(runingDiriction)snakeHead.setX(snakeHead.getX()+runingDiriction.getX();snakeHead.setY(snakeHead.getY()+runingDiriction.getY();elsesnakeHead.setX(snakeHead.getX()+direction.getX();snakeHead.setY(snakeHead.getY()+direction.getY();/如果蛇吃到了目标食物tryif (snakeHead.getX(
33、)=snakeFood.getX()&&(snakeHead.getY()=snakeFood.getY()moveTo(locROsnakeHead.getX()snakeHead.getY(),playBlocks,snake);setSnakeFood();gameScore+=30;AddScore=true;elseAddScore=false;/是否出界if(snakeHead.getX()<rows)&&(snakeHead.getY()<cols)&&(snakeHead.getX()>=0&&(
34、snakeHead.getY()>=0)/如果不出界,判断是否与自身相交if(snake.contains(locROsnakeHead.getX()snakeHead.getY()/如果相交,结束游戏JOptionPane.showMessageDialog(null, "Game Over!", "游戏结束", JOptionPane.INFORMATION_MESSAGE);return false;else/如果不相交,就把snakeHead加到snake里面,并且把尾巴移出moveTo(locROsnakeHead.getX()snake
35、Head.getY(),playBlocks,snake);moveTo(snake.getFirst(),snake,playBlocks);elsereturn true;4、SnakePanel类public class SnakePanel extends JPanel implements Runnable,KeyListenerJFrame parent=new JFrame();private int row; /网格行数 30-341 60-671 40-451private int col; /列数private JPanel gridsPanel; /面板网格private
36、 Location direction;/方向定位private SnakeModel snake; /贪吃蛇private LinkedList snakeBody; /蛇的身体private LinkedList otherBlocks; /其他区域private LocationRO snakeHead; /蛇的头部private LocationRO snakeFood; /目标食物private Color bodyColor=Color.blue;/蛇的身体颜色private Color headColor=Color.red; /蛇的头部颜色private Color foodC
37、olor=Color.pink; /目标食物颜色private Color othersColor=Color.white;/其他区域颜色private int gameScore=0; /总分private long speed; /速度(难度设置)private boolean AddScore;/加分private Thread t; /线程private boolean isEnd; /暂停private static boolean notExit; /构造器,初始化操作public SnakePanel(SnakeFrame parent,int row,int col)chang
38、e(parent,row,col); /开始游戏public void newGame(long speed)this.speed=speed;if (notExit) snake.init();/初始化elserequestFocus();direction.setX(0);direction.setY(1);gameScore=0;updateTextFiled(""+gameScore);isEnd=false; /暂停游戏public void stopGame()requestFocus();isEnd=true; /继续public void returnGam
39、e()requestFocus();isEnd=false; /获得总分public int getGameScore()return gameScore;/更新总分private void updateTextFiled(String str)(SnakeFrame)parent).scoreField.setText(str);/更新各相关单元颜色private void updateColors() / 设定蛇身颜色snakeBody=snake.getSnake();Iterator i =snakeBody.iterator();while(i.hasNext()LocationRO
40、 t=(LocationRO)(i.next();gridsPanelt.getX()t.getY().setBackground(bodyColor);/设定蛇头颜色snakeHead=snake.getSnakeHead();gridsPanelsnakeHead.getX()snakeHead.getY().setBackground(headColor);/设定背景颜色otherBlocks=snake.getOthers();i =otherBlocks.iterator();while(i.hasNext()LocationRO t=(LocationRO)(i.next();gr
41、idsPanelt.getX()t.getY().setBackground(othersColor);/设定临时块的颜色/实现Runnable接口public void run() while(true)tryThread.sleep(speed);catch (InterruptedException e) if(!isEnd)isEnd=!snake.move(direction);updateColors(); if(snake.getAddScore()gameScore+=10;updateTextFiled(""+gameScore);/实现KeyListen
42、er接口public void keyPressed(KeyEvent event) int keyCode = event.getKeyCode(); if(notExit) if (keyCode = KeyEvent.VK_LEFT) /向左 direction.setX(0); direction.setY(-1); else if (keyCode = KeyEvent.VK_RIGHT) /向右 direction.setX(0); direction.setY(1); else if (keyCode = KeyEvent.VK_UP) /向上 direction.setX(-1
43、); direction.setY(0); else if (keyCode = KeyEvent.VK_DOWN) /向下 direction.setX(1); direction.setY(0); else if (keyCode = KeyEvent.VK_SPACE) /空格键 isEnd=!isEnd;public void keyReleased(KeyEvent event)public void keyTyped(KeyEvent event)public void change(SnakeFrame parent,int row2, int col2) this.row=ro
44、w2;this.col=col2;this.parent=parent;gridsPanel=new JPanelrowcol;5. LocationRO类public class LocationRO private int x;private int y;LocationRO(int x,int y) this.x=x;this.y=y;int getX() return x; int getY()return y;public boolean equalOrRev(LocationRO e) return (e.getX()=getX()&&(e.getY()=getY()|(e.getX()=getX()&&(e.getY()=-1*getY()|(e.getX()=-1*getX()&&(e.getY()=getY();public boolean equals(LocationRO e) return(e.getX()=getX()&&(e.getY()=getY();public boolean reverse(LocationR
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 数学六年级下册《平面图形的认知与应用》网课教学设计
- 2025年初级会计(经济基础)考试真题及答案
- 网络信息安全风险评估与防范策略(标准版)
- 高中语文写作五步法难点突破策略8
- 小学健康教育学《健康生活方式的构建与实践》教学设计
- 小学数字素养评价在学校数字化转型中促进教师专业发展的实践探索教学研究课题报告
- 初中生物教学中生态农场实践课程设计课题报告教学研究课题报告
- 2026年电气节能技术的成本效益分析
- 护理安全管理中的领导力作用
- 2026年电气火灾及其扑救常识
- 营养风险筛查2002临床应用
- (2025年版)慢性肾脏病高磷血症临床管理中国专家共识解读
- (高清版)T∕CES 243-2023 《构网型储能系统并网技术规范》
- 医院药房医疗废物处置方案
- 天塔之光模拟控制PLC课程设计
- 金属眼镜架抛光等工艺【省一等奖】
- 《药品经营质量管理规范》的五个附录
- ASMEBPE介绍专题知识
- 八年级上册地理期末复习计划通用5篇
- 初中日语人教版七年级第一册单词表讲义
- GB/T 9065.5-2010液压软管接头第5部分:37°扩口端软管接头
评论
0/150
提交评论