贪吃蛇-java课程设计_第1页
贪吃蛇-java课程设计_第2页
贪吃蛇-java课程设计_第3页
贪吃蛇-java课程设计_第4页
贪吃蛇-java课程设计_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

武汉理工大学课程设计课程名称JAVA课程设计_题目贪吃蛇程序设计专业电子商务班级****学号*******姓名***成绩__________________指导教师__________________20**年**月**日课程设计任务书设计题目:设计目的:1.巩固和加深课堂所学知识;2.学习掌握一般的软件的设计方法和查阅、运用资料的能力;3.掌握JAVA程序设计语言,面向对象的软件设计思想、方法。设计任务:(在规定的时间内完成下列任务)1、任务:设计一个贪吃蛇的游戏功能要求:能够显示贪吃蛇的运动,能通过键盘控制贪吃蛇的运行,能够处理蛇在运行中个各种情况,以及其它的辅助功能;要提供主要的设计思路、数据结构的设计。2、设计任务要完成设计、编码、测试等过程,给出设计思路、设计说明书、主要的代码的说明、使用说明书。源代码以及可运行的贪吃蛇游戏。时间安排:12月28日布置题目,确定任务、查找相关资料12月28日~1月7日功能分析,系统设计,编写程序,调试程序、运行系统;1月8日答辩后撰写设计报告。具体要求:设计报告撰写格式要求(按提供的设计报告统一格式撰写)具体内容如下:①设计任务与要求②总体方案与说明③面向对象的设计(主要类的设计)④源程序清单与注释⑤软件主要模块流程图⑥问题分析与解决方案(包括调式记录、调式报告,即在调式过程中遇到的主要问题、解决方法及改进设想);⑦小结与体会附录:①源程序(必须有简单注释)②使用说明③参考资料指导教师签名:年月日教研室主任(或责任教师)签名:年月日设计任务与要求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,canvasHeight);//drawthesnakeg.setColor(Color.BLACK);LinkedListna=snakeModel.nodeArray;Iteratorit=na.iterator();while(it.hasNext()){Noden=(Node)it.next();drawNode(g,n);}//drawthefoodg.setColor(Color.RED);Noden=snakeModel.food;drawNode(g,n);updateScore();}//drawNode():绘画某一结点(蛇身或食物)privatevoiddrawNode(Graphicsg,Noden){g.fillRect(n.x*nodeWidth,n.y*nodeHeight,nodeWidth-1,nodeHeight-1);}//updateScore():改变计分牌publicvoidupdateScore(){Strings="Score:"+snakeModel.score;labelScore.setText(s);}//begin():游戏开始,放置贪吃蛇voidbegin(){if(snakeModel==null||!snakeModel.running){snakeModel=newSnakeModel(this,canvasWidth/nodeWidth,this.canvasHeight/nodeHeight);(newThread(snakeModel)).start();}}//main():主函数publicstaticvoidmain(String[]args){GreedSnakegs=newGreedSnake();}}SnakeModel.Javaimportjava.util.*;importjavax.swing.*;//SnakeModel:贪吃蛇模型classSnakeModelimplementsRunnable{GreedSnakegs;boolean[][]matrix;//界面数据保存在数组里LinkedListnodeArray=newLinkedList();Nodefood;intmaxX;//最大宽度intmaxY;//最大长度intdirection=2;//方向booleanrunning=false;inttimeInterval=300;//间隔时间(速度)doublespeedChangeRate=0.85;//速度改变程度booleanpaused=false;//游戏状态intscore=0;intcountMove=0;//UP和DOWN是偶数,RIGHT和LEFT是奇数publicstaticfinalintUP=2;publicstaticfinalintDOWN=4;publicstaticfinalintLEFT=1;publicstaticfinalintRIGHT=3;//GreedModel():初始化界面publicSnakeModel(GreedSnakegs,intmaxX,intmaxY){this.gs=gs;this.maxX=maxX;this.maxY=maxY;matrix=newboolean[maxX][];for(inti=0;i<maxX;++i){matrix[i]=newboolean[maxY];Arrays.fill(matrix[i],false);//没有蛇和食物的地区置false}//初始化贪吃蛇intinitArrayLength=maxX>20?10:maxX/2;for(inti=0;i<initArrayLength;++i){intx=maxX/2+i;inty=maxY/2;nodeArray.addLast(newNode(x,y));matrix[x][y]=true;//蛇身处置true}food=createFood();matrix[food.x][food.y]=true;//食物处置true}//changeDirection():改变运动方向publicvoidchangeDirection(intnewDirection){if(direction%2!=newDirection%2)//避免冲突{direction=newDirection;}}//moveOn():贪吃蛇运动函数publicbooleanmoveOn(){Noden=(Node)nodeArray.getFirst();intx=n.x;inty=n.y;switch(direction){caseUP:y--;break;caseDOWN:y++;break;caseLEFT:x--;break;caseRIGHT:x++;break;}if((0<=x&&x<maxX)&&(0<=y&&y<maxY)){if(matrix[x][y])//吃到食物或者撞到身体{if(x==food.x&&y==food.y)//吃到食物{nodeArray.addFirst(food);//在头部加上一结点//计分规则与移动长度和速度有关intscoreGet=(10000-200*countMove)/timeInterval;score+=scoreGet>0?scoreGet:10;countMove=0;food=createFood();matrix[food.x][food.y]=true;returntrue;}else{returnfalse;//撞到身体}}else//什么都没有碰到{nodeArray.addFirst(newNode(x,y));//加上头部matrix[x][y]=true;n=(Node)nodeArray.removeLast();//去掉尾部matrix[n.x][n.y]=false;countMove++;returntrue;}}returnfalse;//越界(撞到墙壁)}//run():贪吃蛇运动线程publicvoidrun(){running=true;while(running){try{Thread.sleep(timeInterval);}catch(Exceptione){break;}if(!paused){if(moveOn())//未结束{gs.repaint();}else//游戏结束{JOptionPane.showMessageDialog(null,"游戏结束","游戏结束",JOptionPane.INFORMATION_MESSAGE);break;}}}running=false;}//createFood()

温馨提示

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

评论

0/150

提交评论