贪吃蛇课程设计_第1页
贪吃蛇课程设计_第2页
贪吃蛇课程设计_第3页
贪吃蛇课程设计_第4页
贪吃蛇课程设计_第5页
免费预览已结束,剩余24页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、«面向对象程序设计课程设计报告题 目:贪吃蛇游戏设计与实现院(系): 信息科学与工程学院专业班级:计科1302班学生姓名:毛慧剑学 号:20131101057指导教师:苏莹2015年8月31日至2015年9月25日华中科技大学武昌分校制面向对象程序设计课程设计任务书、设计(调查报告/论文)题目贪吃蛇游戏设计与实现 二、设计(调查报告/论文)主要内容内容:玩家可以通过键盘或鼠标控制游戏区。游戏设定不同级别,级别越高难度越大,玩 家可以根据自己的需要自由设定初始游戏级别,当玩家取得的分数到达一定水平时游戏 自动进入下一个级别。游戏以最终玩家获得的分数来判断玩家水平的高低。使用Eclips

2、e 和JDK1.6工具,操作系统为 WINDOWS,采用面向对象方法完成,包括总体设计、详 细设计、编码实现、测试。设计要求如下:游戏由模块组成:游戏区模块,游戏控制模块,级别设置模块和帮助模块。游戏区模块,为玩家提供主体游戏功能,能够处理玩家的各种游戏操作, 显示得分情况,并最终显示游戏结果。游戏控制模块,该模块为玩家提供游戏控制功能,应包括开始游戏,暂停游戏和退出 游戏三部分功能。级别设置模块为玩家提供自行设置游戏的初始级别功能,主要提供初级,中级和高级 三个游戏初始级别设置。三、原始资料1 .面向对象程序设计课程设计指导书2 .耿祥义.JAVA大学实用教程.北京:清华大学出版社,2009

3、.四、要求的设计(调查/论文)成果1 .课程设计报告2 .课程设计软件五、进程安排布置任务,查找资料、需求分析 2天总体设计1天详细设计2天编制源程序实现4天测试与修改1天撰写课设报告2天六、主要参考资料1张广彬.Java课程设计案例精编(第二版).北京:清华大学出版社,2011.2耿祥义.Java课程设计(第二版).北京:清华大学出版社,2008.3耿祥义.JAVA大学实用教程.北京:清华大学出版社,2009.4邹林达.陈国君Java2程序设计基础.北京:清华大学出版社,2010.指导教师(签名)目录1 需求与总体设计112错误!未定义书签。错误!未定义书签。错误!未定义书签。错误!未定义书

4、签。1.1 总体设计思路1.2 系统主要功能图 1.3 系统主要类图 2 详细设计 2.1 Login 类 2.2 SnakeFrame 类 2.3 SnakeModel 类 2.4 SnakePanel 类 32 . 5 LocationRO 类 错误!未定义书签。2.6 Location 类 错误!未定义书签。3 . 编码实现 43.1 Login 类的详细代码 43.2 SnakeFrame 类的详细代码 73.3 SnakeModel 类的详细代码 123.4 SnakePanel 类的详细代码 173.5 LocationRO 类的详细代码 223.6 Location 类 的详细代

5、码 234 系统运行与测试 254.1 程序主界面 254.2 游戏开始界面 254.3 游戏操作界面 254.4 游戏难度设置界面 264.5 游戏窗口大小设置 274.6 游戏软件开发人员介绍 275 系统使用步骤 28总结 .291需求与总体设计1.1 总体设计思路本系统要进行的是贪吃蛇游戏的开发。这个游戏是在窗口的平台上进行相关操作 的。为了满足大部分用户的要求,本游戏必须实现的功能有如下要求:(1)贪吃蛇游戏是大家很常见的小游戏,在生活工作之余大家可以玩它,已达到 放松各种压力的目的。(2)游戏可以进行升级,也就是增加吃食物的难度,以便使大家更有挑战性,不 觉得太无趣。(3)游戏界面

6、大小可以任意指定,数据从文件读入。(4)利用swing实现良好的GUI界面。(5)基本功能与要求:给出1条小蛇和随机出一个食物当小蛇吃到食物时就加分 .良好的用户界面,有分数显 示,并且可调节小蛇运动速度。良好的方块形状设计,绘制小蛇和食物,小蛇有六个方 块组成,食物由1个方块组成。小蛇可通过键盘方向键(上、下、左、右键)进行向上、 向下、向左、向右移动。当小蛇吃掉一个食物后会变长,并且吃完食物时食物会消失, 并立即随即生成一个新的食物1.2 系统主要功能图贪吃蛇实现的基本功能:生成登录窗口界面,登录进入游戏,可以设置游戏的窗口 大小和难度等级游戏途中有暂停 继续 开始等基本功能。同时还设有游

7、戏帮助等具体 游戏操作指示、在加入了软件开发人员的相关信息介绍 结束游戏之后得分在窗口下自 动统计得出图1-1系统功能图1.3 系统主要类图(ogbnF用户名>czancel*&rrt=rO-U 10360SnakeFrame第 Color 叁 Container 金FIqwL剪out /GridLayout .Action Eent SAction Listener0口 tionMenu。 setJMenuBar()set Layout。 setEnabled()18SnakeM odel命rows 备 cols 鼠5naKeHe2d ijuningDi notion 令 Iq

8、g RO jsnake jJ; play Blacks 第 5ndMFood games core皂Adds 8 re*LocationRO()*getSnakeHead()LocationROO*getSnakeTailQLocation。g&t Runing Diriction() LinkedListj) *getSnake() LinkedListQ getOthers。gctSco的 0*moeTo()*opname()SnakePand电ri#Pa侧 品;d %.S nak eBody otherBlocks 为 Mt eHead snakeFood g am eScore

9、 = 0 电speed '%'AddScofe麻End 职 dtExit*newGame() *stopGameO retumGamefl getGarneScore() %pdateTextFiledO updateCdors() *runQkey Pressed。keyRel 瞄刈 /eyTyp 剜 ,change。Location图1-2备,vLocationf)getK)*getv()setX)setY()eqgQrR的)equals。re呢e()2详细设计Go和Cancel两个登陆2.1 Login 类Login属性:用户名Go (进入游戏)Cancel密码(取消)操

10、作:Enter ()Close()Login类,登陆界面要求输入登陆者输入用户名和密码,分别设选项。 SnakeFrame 类创建游戏窗口主界面。采用图形界面设计,有窗体,菜单栏和游戏操作界面。2.3 SnakeModel 类此类为蛇的初始化状态及模型,所有的游戏的开始都通过此类初始化及对蛇的操作SnakeModel属性:rows,cols , snakeHead,runingDiriction , locRO, snake,playBlocks snakeFood , gameScore, AddScore操作:LocationRO getSnakeHead() , Loca

11、tionRO getSnakeTail(),Location getRuningDiriction(), LinkedList getSnake() ,LinkedList getOthers() , getScore() , getAddScore(), setSnakeHead(Location snakeHead) , LocationRO getSnakeFood(), setSnakeFood() , moveTo(Object a,LinkedList fromlist,LinkedList tolist) , init() , SnakeModel(int rows1,int c

12、ols1) , 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(SnakeFrame parent,int row,int col) , newGame(long speed) sto

13、pGame(), returnGame() , getGameScore(), updateTextFiled(String str)updateC010rs() , run() , keyPressed(KeyEvent event) keyReleased(KeyEvent event) , keyTyped(KeyEvent event) change(SnakeFrame parent,int row2, int col2)2.5 LocationRO 类随机生成的食物位置。用来随机生成食物。引导蛇的移动方向。2.6 Location 类对蛇的位置的描述类Location属性:x y操

14、作:Location(int x,int y) , getX() , getY() , setX(int x), setY(int y) , equalOrRev(Location e), equals(Location e), reverse(Location e)I.Login 类/登陆界面public class LoginprivateTextFieldprivateTextFieldprivateJButtonprivateJButtonpublicLogin() 3编码实现extends JFrame f1 ; /创建文本框f2 ;b1 ; /创建按钮b2;/登陆界面Contain

15、er cp=getContentPane();/获取容器cp.setLayout(new GridLayout(4,1);/设置布局管理为网格四行一列Label l1 =newLabel("用户名");/创建标签了 l1 , l2Label l2=newLabel("密 码");Panel p1 =newPanel();/创建面板,p1,p2,p3, p4Panel p2=newPanel();Panel p3=newPanel();MyPanel1 p4= new MyPanel1(); / 创建插入图片平面 p4f1 =new TextField(1

16、0);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); /面板p4p1 , p2 , p3分别加入容器cp_cp.add(p1);cp.add(p2);cp.add(p3);b1 .addAc

17、tionListener(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);/ 设置窗体位置frame.setTitle("疯狂贪吃

18、蛇");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 stati

19、c 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" ); / 添加图

20、片 public void paint(Graphics g) g.drawImage( img ,0,0, this );2.SnakeFrame 类public class SnakeFrame extends JFrame implements ActionListener introw =30;intcol =45;SnakePanelp = new SnakePanel( this , row , col );JMenuBar menubar =new JMenuBar(); / 菜单条JMenu fileMenu =new JMenu("文件");/ 菜单&qu

21、ot;开始");/菜单条目JMenuItem newgameitem =new JMenuItem(JMenuItemstopitem=new JMenuItem(" 暂停 " );JMenuItem runitem =new JMenuItem( " 继续 " );JMenuItemexititem=new JMenuItem(" 退出 " );/" 设置 " 菜单JMenu optionMenu =new JMenu( " 设置 " );/* 等级选项* ButtonGroup创建

22、一组按钮选项* JRadioButtonMenuItem是属于一组菜单项中的一个菜单项,该组中只能选择一个项。* 被选择的项显示其选择状态。选择此项的同时,其他任何以前被选择的项都切换到未选择状态。* Panel 是最简单的容器类。应用程序可以将其他组件放在面板提供的空间内,这些组件包括其他面板。*/JMenu degreeMenu =new JMenu( " 等级 " );ButtonGroupgroupDegree = new ButtonGroup();JRadioButtonMenuItemoneItem = new JRadioButtonMenuItem(&qu

23、ot; 初级 " );JRadioButtonMenuItemtwoItem = new JRadioButtonMenuItem(" 中级 " );JRadioButtonMenuItemthreeItem = new JRadioButtonMenuItem(" 高级 "/ 设置“窗口大小” 菜单JMenuwindowsMenu =new JMenu( " 窗口大小" );JMenuwindowsMenu1 =new JMenu( " 视图 " );ButtonGroupgroupDegree1 =

24、new ButtonGroup();JRadioButtonMenuItemminItem = new JRadioButtonMenuItem("小");JRadioButtonMenuItemmidItem = new JRadioButtonMenuItem("中");JRadioButtonMenuItemmaxItem = new JRadioButtonMenuItem("大");/ 设置 “作者信息 ” 菜单JMenu XinXi =new JMenu( " 关于开发者" );JMenuItem Xi

25、nXiItem =new JMenuItem( " 软件相关 " );/ 设置 “帮助 ” 菜单JMenu helpMenu =new JMenu( " 帮助 " );JMenuItem helpItem =new JMenuItem( " 操作指南 " );/ 可以被选定或取消选定的菜单项.final JCheckBoxMenuItem showGridItem = new JCheckBoxMenuItem( " 显示网格 " );JLabel scorelabel ; / 为分数创建标签public JTex

26、tField scoreField ; / 显示分数的文本框private long speedtime =200;private String helpstr = " 游戏说明: n1 :方向键控制蛇移动的方向 ." +"n2:单击菜单' 文件-> 开始' 开始游戏."+"n3 :单击菜单' 文件 -> 暂停 ' 或者单击键盘空格键暂停游戏." +"n4:单击菜单' 文件-> 继续' 继续游戏."+"n5 :单击菜单' 设置 -&

27、gt; 等级 ' 可以设置难度等级." +"n6 :单击菜单' 设置 -> 显示网格 ' 可以设置是否显示网格 ." +"n7 :红色为食物, 吃一个得 30 分同时蛇身加长." +"n8 :蛇不可以出界或自身相交,否则结束游戏." ;SnakeFrame() scoreField .setHorizontalAlignment(0);/ 设置图标和文本的水平对齐方式JPanel toolPanel= new JPanel();toolPanel.add(scorelabel);toolPane

28、l.add(scoreField);contentpane.add(toolPanel);/ 事件监听 使得按钮可以响应showGridItem .addActionListener(this );public void actionPerformed(ActionEvent e)/ 事件响应从接口 ActionListener 复制的描述 ,发生操作时调用。try / 异常捕获if (e.getSource()= helpItem )JOptionPane. showConfirmDialog ( p, helpstr , " 操纵说明" ,JOptionPane. PL

29、AIN_MESSAGE );else if (e.getSource()= exititem )JOptionPane. showConfirmDialog ( null ," 你确定退出游戏吗? " , " " ,JOptionPane.showMessageDialog ( this , " 疯狂贪吃蛇nn 武昌首义学院n 信息科学与工程学院 n 计算机科学与技术 " + "n 学号: 20131101057"+ "n 姓名: 毛慧剑 n 指导老师:苏莹n2015 年9月 " ,"

30、 软件相关 " ,JOptionPane. INFORMATION_MESSAGE );else if (e.getSource()= midItem )row =40; col =60;p.change( this , row , col );this .setSize( 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 (Exc

31、eption ee)ee.printStackTrace();/ 异常处理3.SnakeModelimport java.util.LinkedList;import javax.swing.JOptionPane;public class SnakeModel private int rows,cols;/行列数运行方向类数组蛇及其它区域块目标食物分数加分private Location snakeHead,runingDiriction;/private LocationRO locRO;/LocationROprivate LinkedList snake,playBlocks;/pri

32、vate LocationRO snakeFood;/private int gameScore=0; /private boolean AddScore=false;/ 获得蛇头public LocationRO getSnakeHead()return (LocationRO)(snake.getLast();/ 蛇尾public LocationRO getSnakeTail()return (LocationRO)(snake.getFirst();/ 运行路线public Location getRuningDiriction()return runingDiriction;/ 获得

33、蛇实体区域public LinkedList getSnake()return snake;private void setSnakeHead(Location snakeHead) this.snakeHead=snakeHead;获得目标食物public LocationRO getSnakeFood()return snakeFood;随机设置目标食物private void moveTo(Object a,LinkedList fromlist,LinkedList tolist) fromlist.remove(a);tolist.add(a);public void init()p

34、layBlocks.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+)moveTo(locRO4i,playBlocks,snake);蛇头位置snakeHead=new Location(4,6);设置随机块snakeFood=new LocationRO(0,0);setSnakeFood();初始化运动方向init();false* 定义布尔型move 方法,如果运行

35、成功则返回 true, 否则返回* 参数 direction 是 Location 类型,* direction 的值 :(-1,0) 表示向上; (1,0) 表示向下;* (0,-1) 表示向左; (0,1) 表示向右;* *public boolean move(Location direction)判断设定的方向跟运行方向是不是相反if (direction.reverse(runingDiriction)snakeHead.setX(snakeHead.getX()+runingDiriction.getX();snakeHead.setY(snakeHead.getY()+runin

36、gDiriction.getY();elsesnakeHead.setX(snakeHead.getX()+direction.getX();snakeHead.setY(snakeHead.getY()+direction.getY();/ 如果蛇吃到了目标食物tryif (snakeHead.getX()=snakeFood.getX()&&(snakeHead.getY()=snakeFood.getY()moveTo(locROsnakeHead.getX()snakeHead.getY(),playBlocks,snake);setSnakeFood();gameSc

37、ore+=30;AddScore=true;elseAddScore=false;/ 是否出界if(snakeHead.getX()<rows)&&(snakeHead.getY()<cols)&&(snakeHead.getX()>=0&&(snakeHead.getY()>=0)/ 如果不出界,判断是否与自身相交if(snake.contains(locROsnakeHead.getX()snakeHead.getY()/ 如果相交 , 结束游戏JOptionPane.showMessageDialog(null, &

38、quot;Game Over!", "游戏结束 ", JOptionPane.INFORMATION_MESSAGE);return false;else/ 如果不相交,就把snakeHead 加到 snake 里面,并且把尾巴移出moveTo(locROsnakeHead.getX()snakeHead.getY(),playBlocks,snake);moveTo(snake.getFirst(),snake,playBlocks);elsereturn true;4. SnakePanel 类public class SnakePanel extends J

39、Panel implements Runnable,KeyListenerJFrame parent=new JFrame();网格行数列数private int row; /private int col; /private JPanel gridsPanel; /private Location direction;/private SnakeModel snake; /private LinkedList snakeBody; / private LinkedList otherBlocks; /private LocationRO snakeHead; / private Locati

40、onRO snakeFood; / private Color bodyColor=Color.blue;/ private Color headColor=Color.red; / private Color foodColor=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 b

41、oolean notExit;/ 构造器,初始化操作30-341 60-671 40-451面板网格方向定位贪吃蛇蛇的身体其他区域蛇的头部目标食物蛇的身体颜色蛇的头部颜色目标食物颜色其他区域颜色总分速度(难度设置)/ 加分线程暂停public SnakePanel(SnakeFrame parent,int row,int col) change(parent,row,col);/开始游戏public void newGame(long speed)this.speed=speed;if (notExit) snake.init();/初始化elserequestFocus();directi

42、on.setX(0);direction.setY(1);gameScore=0;updateTextFiled(""+gameScore);isEnd=false;/暂停游戏public void stopGame()requestFocus();isEnd=true;/ 继续public void returnGame()requestFocus();isEnd=false;/ 获得总分public int getGameScore()return gameScore;/ 更新总分private void updateTextFiled(String str)(Snak

43、eFrame)parent).scoreField.setText(str);/ 更新各相关单元颜色private void updateColors()/ 设定蛇身颜色snakeBody=snake.getSnake();Iterator i =snakeBody.iterator();while(i.hasNext()LocationRO t=(LocationRO)(i.next();gridsPanelt.getX()t.getY().setBackground(bodyColor);/ 设定蛇头颜色snakeHead=snake.getSnakeHead();gridsPanelsn

44、akeHead.getX()snakeHead.getY().setBackground(headColor);/ 设定背景颜色otherBlocks=snake.getOthers();i =otherBlocks.iterator();while(i.hasNext()LocationRO t=(LocationRO)(i.next();gridsPanelt.getX()t.getY().setBackground(othersColor);/ 设定临时块的颜色/ 实现 Runnable 接口public void run()while(true) tryThread.sleep(spe

45、ed);catch (InterruptedException e)if(!isEnd)isEnd=!snake.move(direction);updateColors();if(snake.getAddScore()gameScore+=10;updateTextFiled(""+gameScore);/ 实现 KeyListener 接口public void keyPressed(KeyEvent event)int keyCode = event.getKeyCode();if(notExit)if (keyCode = KeyEvent.VK_LEFT) /向左

46、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);direction.setY(0);else if (keyCode = KeyEvent.VK_DOWN) / 向下 direction.setX(1);direction.setY(0);else if (keyCode = KeyEvent.VK_

47、SPACE) / 空格键 isEnd=!isEnd;public void keyReleased(KeyEvent event)public void keyTyped(KeyEvent event)public void change(SnakeFrame parent,int row2, int col2) this.row=row2;this.col=col2;this.parent=parent;gridsPanel=new JPanelrowcol;5. LocationRO 类public class LocationRO privateintx ;privateinty ;Lo

48、cationRO( 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(Locatio

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论