武汉理工大学课程设计课程名称JAVA课程设计_题目贪吃蛇程序设计专业电子商务班级****学号*******姓名***成绩__________________指导教师__________________20**年**月**日课程设计任务书设计题目:设计目的:1.巩固和加深课堂所学知识;2.学习掌握一般的软件的设计方法和查阅、运用资料的能力;3.掌握JAVA程序设计语言,面向对象的软件设计思想、方法。设计任务:(在规定的时间内完成下列任务)1、任务:设计一个贪吃蛇的游戏功能要求:能够显示贪吃蛇的运动,能通过键盘控制贪吃蛇的运行,能够处理蛇在运行中个各种情况,以及其它的辅助功能;要提供主要的设计思路、数据结构的设计。2、设计任务要完成设计、编码、测试等过程,给出设计思路、设计说明书、主要的代码的说明、使用说明书。源代码以及可运行的贪吃蛇游戏。时间安排:12月28日布置题目,确定任务、查找相关资料12月28日~1月7日功能分析,系统设计,编写程序,调试程序、运行系统;1月8日答辩后撰写设计报告。具体要求:设计报告撰写格式要求(按提供的设计报告统一格式撰写)具体内容如下:①设计任务与要求②总体方案与说明③面向对象的设计(主要类的设计)④源程序清单与注释⑤软件主要模块流程图⑥问题分析与解决方案(包括调式记录、调式报告,即在调式过程中遇到的主要问题、解决方法及改进设想);⑦小结与体会附录:①源程序(必须有简单注释)②使用说明③参考资料指导教师签名:年月日教研室主任(或责任教师)签名:年月日1.设计任务与要求1.1设计任务设计一个贪吃蛇的游戏功能要求:能够显示贪吃蛇的运动,能通过键盘控制贪吃蛇的运行,能够处理蛇在运行中个各种情况,以及其它的辅助功能;要提供主要的设计思路、数据结构的设计。设计任务要完成设计、编码、测试等过程,给出设计思路、设计说明书、主要代码的说明、使用说明书。源代码以及可运行的贪吃蛇游戏。1.2具体要求:具体内容如下:①设计任务与要求②总体方案与说明③面向对象的设计(主要类的设计)④源程序清单与注释⑤软件主要模块流程图⑥问题分析与解决方案(包括调式记录、调式报告,即在调式过程中遇到的主要问题、解决方法及改进设想);⑦小结与体会附录:①源程序(必须有简单注释)②使用说明③参考资料2.总体方案与说明2.1总体方案我设计的贪吃蛇主要利用键盘控制蛇的前进移动方向,是否吃到食物,是否撞墙以及是否暂停、开始游戏等。当吃到食物的时候,蛇就自动长大一格,在游戏中可进行暂停和开始操作。中途若是撞到墙或是撞到自己,同样也结束。背景和蛇的颜色可随时更换。2.2系统模块根据总体方案,我把贪吃蛇游戏分为:游戏界面设置(即绘图)、贪吃蛇蛇身及运动设置和游戏龙之设置三大模块来设计。2.2.1游戏界面设置游戏界面设置包括:游戏区设置、游戏帮助信息设置、游戏分数查看区。游戏界面使用简单和直观的布局设计,游戏区放置在界面的主题位置上,在游戏区上部放置分数,在游戏区下部放置使用说明帮助,具体设计效果如图2-1所示。图2-1游戏主题界面设计效果2.2.2贪吃蛇蛇身及运动设置贪吃蛇的蛇身设置是整个游戏设计的关键。它的基本思路是:去掉蛇尾,显示并移动出蛇头外蛇身,根据蛇身的运动方向,决定蛇头的位置,完成蛇头吃食物的处理操作,显示蛇头。而蛇运动的四个方向,则通过按键来控制。蛇吃到一个食物,就加分。每次食物出现的位置不能在蛇身上,如果蛇在运动的过程中撞到自己或者撞墙,则游戏结束,具体效果如图2-2所示,图2-2就是蛇撞到墙之后,提示游戏结束。图2-2贪吃蛇撞墙后效果2.2.3游戏控制设置游戏控制设置就是控制游戏的暂停与开始。设置PageUp(加速),PageDown(减速)按键来控制速度,设置空格或着p按键来暂停进行中的游戏,设置ENTER或着R或者S按键来开始暂停的游戏。3.面向对象的设计贪吃蛇游戏各模块及程序流程有若干类实现,下面阐述各个类的设计与实现。3.1GreedSnake类该类包含六个主要的功能方法,分别是:(1)构造函数publicGreedSnake(),主要用来设置用户控制界面。(2)publicvoidkeyPressed()方法,主要用来对游戏的按键操作进行处理。(3)voidrepaint()主要用来绘制游戏界面包括蛇和食物。(4)privatevoiddrawNode()主要用来绘制某一结点。(5)publicvoidupdateScore()方法主要用来改变积分器。(6)voidbegin()方法用来控制游戏的开始界面。3.2.SnakeModel类该类包含多个功能方法,分别是:(1)构造函数publicSnakeModel(),该方法主要用来初始化游戏界。其中matrix[][]用来存储地图上面的信息,如果什么也没有设置为false,如果有食物或蛇,设置为true;nodeArray,一个LinkedList,用来保存蛇的每一节;food用来保存食物的位置;而Node类是保存每个位置的信息。(2)publicvoidchangeDirection()方法主要用来改变蛇的运动方向,changeDirection(intnewDirection),用来改变蛇前进的方向,而且只是保存头部的前进方向,因为其他的前进方向已经用位置来指明了。其中newDirection必须和原来的direction不是相反方向,所以相反方向的值用了同样的奇偶性。在测试的时候使用了direction%2!=newDirection%2进行判断。(3)publicbooleanmoveOn()方法使实现蛇运动的函数,其中moveOn()用来更新蛇的位置,对于当前方向,把头部位置进行相应改变。如果越界,结束;否则,检测是否遇到食物(加头部)或身体(结束);如果什么都没有,加上头部,去掉尾部。由于用了LinkedList数据结构,省去了相当多的麻烦。(4)publicvoidrun()方法主要用来完成游戏主体运行流程控制功能。(5)privateNodecreateFood()方法用来生成食物及放置地点。(6)publicvoidspeedUp()和()两个方法对蛇运行的速度进行控制。(7)publicvoidchangePauseState()方法用来改变游戏的状态,是“暂停”还是“继续”。3.3.Node类该类只有一个方法Node(),该方法用来定义蛇的结点部分4.源程序清单与注释GreedSnake.javapackageGreedSnake;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjava.util.*;//MainClasspublicclassGreedSnakeimplementsKeyListener{JFramemainFrame;CanvaspaintCanvas;JLabellabelScore;//计分牌SnakeModelsnakeModel=null;//蛇publicstaticfinalintcanvasWidth=300;publicstaticfinalintcanvasHeight=400;publicstaticfinalintnodeWidth=10;publicstaticfinalintnodeHeight=10;//GreedSnake():初始化游戏界面publicGreedSnake(){//设置界面元素mainFrame=newJFrame(GreedSnake);Containercp=mainFrame.getContentPane();labelScore=newJLabel(分数:);cp.add(labelScore,BorderLayout.NORTH);paintCanvas=newCanvas();paintCanvas.setSize(canvasWidth+1,canvasHeight+1);paintCanvas.addKeyListener(this);cp.add(paintCanvas,BorderLayout.CENTER);JPanelpanelButtom=newJPanel();panelButtom.setLayout(newBorderLayout());JLabellabelHelp;//帮助信息labelHelp=newJLabel(按PageUp(加速),PageDown(减速)来控制速度,JLabel.CENTER);panelButtom.add(labelHelp,BorderLayout.NORTH);labelHelp=newJLabel(按ENTER或者R或者S开始,JLabel.CENTER);panelButtom.add(labelHelp,BorderLayout.CENTER);labelHelp=newJLabel(按空格或p暂停,JLabel.CENTER);panelButtom.add(labelHelp,BorderLayout.SOUTH);cp.add(panelButtom,BorderLayout.SOUTH);mainFrame.addKeyListener(this);mainFrame.pack();mainFrame.setResizable(false);mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);mainFrame.setVisible(true);begin();}//keyPressed():按键检测publicvoidkeyPressed(KeyEvente){intkeyCode=e.getKeyCode();if(snakeModel.running){switch(keyCode){caseKeyEvent.VK_UP:snakeModel.changeDirection(SnakeModel.UP);break;caseKeyEvent.VK_DOWN:snakeModel.changeDirection(SnakeModel.DOWN);break;caseKeyEvent.VK_LEFT:snakeModel.changeDirection(SnakeModel.LEFT);break;caseKeyEvent.VK_RIGHT:snakeModel.changeDirection(SnakeModel.RIGHT);break;caseKeyEvent.VK_ADD:caseKeyEvent.VK_PAGE_UP:snakeModel.speedUp();//加速break;caseKeyEvent.VK_SUBTRACT:caseKeyEvent.VK_PAGE_DOWN:snakeModel.speedDown();//减速break;caseKeyEvent.VK_SPACE:caseKeyEvent.VK_P:snakeModel.changePauseState();//暂停或继续break;default:}}//重新开始if(keyCode==KeyEvent.VK_R||keyCode==KeyEvent.VK_S||keyCode==KeyEvent.VK_ENTER){snakeModel.running=false;begin();}}//keyReleased():空函数publicvoidkeyReleased(KeyEvente){}//keyTyped():空函数publicvoidkeyTyped(KeyEvente){}//repaint():绘制游戏界面(包括蛇和食物)voidrepaint(){Graphicsg=paintCanvas.getGraphics();//drawbackgroundg.setColor(Color.PINK);g.fillRect(0,0,canvasWidth,