1、java贪吃蛇武汉理工大学华夏学院课程设计报告书课程名称: Java 课程设计 题 目: Java贪吃蛇 系 名: 信息工程系 专业班级: 软件2111 姓 名: 郭和朋 学 号: 10225611102 指导教师: 2013年 01 月 18 日课程设计任务书学生姓名: 郭和朋 专业班级: 软件2111 指导教师: 詹春华 工作单位: 信息系 设计题目: 贪吃蛇游戏的设计与实现初始条件:掌握基本的Java程序设计基础。要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)主要任务:1 完成一个贪吃蛇游戏;2 该游戏具备:计分、暂停、加速、减速等功能;设计报告撰写格式
2、要求:1、 写出游戏中用到的主要数据结构的设计;2、 写出游戏界面用到的主要技术;3、 写出贪吃蛇模型类的设计思想;4、 其他程序中用到的主要技术;5、 本次课程设计的感受。时间安排:2013-1-14-2013-1-192013-1-19 系统验收;2013-1-192013-1-22 提交课程设计报告;指 导 教 师 签 字: 2013 年 1 月 14 日系 主 任 签 字: 年 月 日1.设计任务与要求1.1设计任务设计一个贪吃蛇的游戏 功能要求:能够显示贪吃蛇的运动,能通过键盘控制贪吃蛇的运行,能够处理蛇在运行中个各种情况,以及其它的辅助功能;要提供主要的设计思路、数据结构的设计。
3、设计任务要完成设计、编码、测试等过程,给出设计思路、设计说明书、主要代码的 说明、使用说明书。源代码以及可运行的贪吃蛇游戏。1.2具体要求具体内容如下: 设计任务与要求 总体方案与说明 面向对象的设计(主要类的设计) 源程序清单与注释 软件主要模块流程图 问题分析与解决方案(包括调式记录、调式报告,即在调式过程中遇到的主要问题、解决方法及改进设想); 小结与体会 附录: 源程序(必须有简单注释) 使用说明 参考资料 2.总体方案与说明2.1总体方案我设计的贪吃蛇主要利用键盘控制蛇的前进移动方向,是否吃到食物,是否撞墙以及是否暂停、开始游戏等。当吃到食物的时候,蛇就自动长大一格,在游戏中可进行暂
4、停和开始操作。中途若是撞到墙或是撞到自己,同样也结束。背景和蛇的颜色可随时更换。2.2系统模块根据总体方案,我把贪吃蛇游戏分为:游戏界面设置(即绘图)、贪吃蛇蛇身及运动设置和游戏龙之设置三大模块来设计。 2.2.1游戏界面设置游戏界面设置包括:游戏区设置、游戏帮助信息设置、游戏分数查看区。游戏界面使用简单和直观的布局设计,游戏区放置在界面的主题位置上,在游戏区上部放置分数,在游戏区下部放置使用说明帮助,具体设计效果如图2-1所示。图2.1游戏主题界面设计效果2.2.2贪吃蛇蛇身及运动设置贪吃蛇的蛇身设置是整个游戏设计的关键。它的基本思路是:去掉蛇尾,显示并移动出蛇头外蛇身,根据蛇身的运动方向,
5、决定蛇头的位置,完成蛇头吃食物的处理操作,显示蛇头。图2.2 贪吃蛇撞墙后效果而蛇运动的四个方向,则通过按键来控制。蛇吃到一个食物,就加分。每次食物出现的位置不能在蛇身上,如果蛇在运动的过程中撞到自己或者撞墙,则游戏结束,具体效果如图2.2所示,图2.2就是蛇撞到墙之后,提示游戏结束。2.2.3游戏控制设置 游戏控制设置就是控制游戏的暂停与开始。设置PageUp(加速), PageDown(减速)按键来控制速度,设置空格或着p按键来暂停进行中的游戏,设置ENTER或着R或者S按键来开始暂停的游戏。3.面向对象的设计贪吃蛇游戏各模块及程序流程有若干类实现,下面阐述各个类的设计与实现。3.1 Gr
6、eedSnake类该类包含六个主要的功能方法,分别是: (1)构造函数public GreedSnake(),主要用来设置用户控制界面。 (2)public void keyPressed()方法,主要用来对游戏的按键操作进行处理。 (3)void repaint()主要用来绘制游戏界面包括蛇和食物。 (4)private void drawNode()主要用来绘制某一结点。 (5)public void updateScore()方法主要用来改变积分器。 (6)void begin()方法用来控制游戏的开始界面。3.2.SnakeModel类该类包含多个功能方法,分别是: (1)构造函数pu
7、blic SnakeModel(),该方法主要用来初始化游戏界。其中matrix用来存储地图上面的信息,如果什么也没有设置为false,如果有食物或蛇,设置为true;nodeArray,一个LinkedList,用来保存蛇的每 一节;food用来保存食物的位置;而Node类是保存每个位置的信息。 (2)public void changeDirection()方法主要用来改变蛇的运动方向,changeDirection(int newDirection) ,用来改变蛇前进的方向,而且只是 保存头部的前进方向,因为其他的前进方向已经用位置来指明了。其中newDirection必须和原来的dir
8、ection不是相反方向,所以相反方向的值用了同样的奇偶性。在测试的时候使用了direction%2!=newDirection%2 进行判断。 (3)public boolean moveOn()方法使实现蛇运动的函数,其中moveOn()用来更新蛇的位置,对于当前方向,把头部位置进行相应改变。如果越界,结束;否则,检测是否遇到食物(加头部)或身体(结束);如果什么都没有,加上头部,去掉尾部。由于用了LinkedList数据结构,省去了相当多的麻烦。 (4)public void run()方法主要用来完成游戏主体运行流程控制功能。 (5)private Node createFood()方
9、法用来生成食物及放置地点。 (6)public void speedUp()和()两个方法对蛇运行的速度进行控制。 (7)public void changePauseState() 方法用来改变游戏的状态,是“暂停”还是“继续”。3.3.Node类 该类只有一个方法Node(),该方法用来定义蛇的结点部分。4.软件主要模块流程图软件的主要模块流程如下图4.1所示。 图4.1 软件主要模块流程图5.源程序清单与注释 5.1 GreedSnake.java package snake;import java.awt.BorderLayout;import java.awt.Canvas;impo
10、rt java.awt.Color;import java.awt.Container;import java.awt.Graphics;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.util.Iterator;import java.util.LinkedList;import javax.swing.*;public class GreedSnake implements KeyListener JFrame mainFrame; Canvas paintCanvas; JLabel
11、 labelScore; SnakeModel snakeModel = new SnakeModel(this, canvasWidth / nodeWidth, canvasHeigth / nodeHeigth); public static final int canvasWidth = 300; public static final int canvasHeigth = 300; public static final int nodeWidth = 10; public static final int nodeHeigth = 10;public GreedSnake() ma
12、inFrame = new JFrame(GreedSnake); Container cp = mainFrame.getContentPane(); labelScore = new JLabel(Score: ); cp.add(labelScore, BorderLayout.NORTH); / paintCanvas = new Canvas(); paintCanvas.setSize(canvasWidth + 1, canvasHeigth + 1); paintCanvas.addKeyListener(this); cp.add(paintCanvas, BorderLay
13、out.CENTER); / JPanel panelButtom = new JPanel(); panelButtom.setLayout(new BorderLayout(); JLabel labelHelp; labelHelp = new JLabel(PageUp,PageDown for speed:, JLabel.CENTER); panelButtom.add(labelHelp, BorderLayout.NORTH); labelHelp = new JLabel(Enter or R or S for start:, JLabel.CENTER); panelBut
14、tom.add(labelHelp, BorderLayout.CENTER); labelHelp = new JLabel(SPACE or P for pause, JLabel.CENTER); panelButtom.add(labelHelp, BorderLayout.SOUTH); cp.add(panelButtom, BorderLayout.SOUTH); mainFrame.addKeyListener(this); mainFrame.pack(); mainFrame.setResizable(false); mainFrame.setDefaultCloseOpe
15、ration(JFrame.EXIT_ON_CLOSE); mainFrame.setVisible(true); begin(); public void keyTyped(KeyEvent e) public void keyPressed(KeyEvent e) int keyCode = e.getKeyCode(); if (snakeModel.running) switch (keyCode) case KeyEvent.VK_UP: snakeModel.changeDirection(snakeModel.UP); break; case KeyEvent.VK_DOWN:
16、snakeModel.changeDirection(snakeModel.DOWN); break; case KeyEvent.VK_LEFT: snakeModel.changeDirection(snakeModel.LEFT); break; case KeyEvent.VK_RIGHT: snakeModel.changeDirection(snakeModel.RIGHT); break; case KeyEvent.VK_PAGE_UP: snakeModel.speedUP(); break; case KeyEvent.VK_PAGE_DOWN: snakeModel.sp
17、eedDOWN(); break; case KeyEvent.VK_P: snakeModel.changePauseState(); break; else if (keyCode = KeyEvent.VK_ENTER | keyCode = KeyEvent.VK_R | keyCode = KeyEvent.VK_S) /snakeModel.running=false; begin(); public void keyReleased(KeyEvent e) void repaint() Graphics g = paintCanvas.getGraphics(); /绘制背景 g
18、.setColor(Color.WHITE); g.fillRect(0, 0, canvasWidth, canvasHeigth); /画蛇 g.setColor(Color.BLACK); LinkedList na = snakeModel.nodeArray; Iterator it = na.iterator(); while (it.hasNext() Node n = (Node) it.next(); drawNode(g, n); getScore(); / g.setColor(Color.RED); Node n = snakeModel.food; drawNode(
19、g, n); void begin() if (!snakeModel.running) snakeModel = new SnakeModel(this, canvasWidth / nodeWidth, canvasHeigth / nodeHeigth); (new Thread(snakeModel).start();/ JOptionPane.showMessageDialog(ip,游戏结束,lost,JOptionPane.INFORMATION_MESSAGE);/ / (new Thread(snakeModel).start(); void drawNode(Graphic
20、s g, Node n) g.fillRect(n.x * nodeWidth, n.y * nodeHeigth, nodeWidth - 1, nodeHeigth - 1); String getScore() String s = Score: + snakeModel.score; labelScore.setText(s); return s; public static void main(String args) GreedSnake gs = new GreedSnake(); 5.2 SnakeModel.javapackage snake;import java.util
21、.*;import java.util.logging.Level;import java.util.logging.Logger;import javax.swing.JOptionPane;public class SnakeModel implements Runnable private static class JOptionpane private static int INFORMAIION_MESSAGE; public JOptionpane() GreedSnake gs; boolean matrix; /界面数据保存在此数组 LinkedList nodeArray =
22、 new LinkedList(); Node food; int maxX; int maxY; int score = 0; boolean running = false; int timeInterval = 200; int direction = 2; double speedChangeRate = 0.2; boolean paused = false;/游戏状态 public static final int UP = 2; public static final int DOWN = 4; public static final int LEFT = 1; public s
23、tatic final int RIGHT = 3; public SnakeModel(GreedSnake gs, int maxX, int maxY) this.gs = gs; this.maxX = maxX; this.maxY = maxY; matrix = new booleanmaxX; for (int i = 0; i 20 ? 10 : maxX / 2; for (int i = 0; i = 0 & x = 0 & y maxY) if (matrixxy) if (x = food.x & y = food.y) score = score + 1; node
24、Array.addFirst(food); food = createFood(); matrixfood.xfood.y = true; return true; else / score=score+0; return false; else nodeArray.addFirst(new Node(x, y); matrixxy = true; n = (Node) nodeArray.removeLast(); matrixn.xn.y = false; return true; running = false; return false; int getScore() Node n =
25、 (Node) nodeArray.getFirst(); int x = n.x; int y = n.y; if (x = food.x) & (y = food.y) score = score + 1; return score; public void speedUP() timeInterval = (int) (timeInterval * (1 - speedChangeRate); public void speedDOWN() timeInterval = (int) (timeInterval * (1 + speedChangeRate); public void ch
26、angeDirection(int newDirection) if (direction % 2 != newDirection % 2) direction = newDirection; public void changePauseState() paused = !paused; public void run() running = true; while (running) try Thread.sleep(timeInterval); catch (InterruptedException ex) Logger.getLogger(SnakeModel.class.getNam
27、e().log(Level.SEVERE, null, ex); if (!paused) if (moveOn() / gs.repaint(); else running = false; break; JOptionPane.showMessageDialog(null, GAME END, Game End, JOptionpane.INFORMAIION_MESSAGE); 5.3 Node.javapackage snake;public class Node int x; int y; public Node(int x,int y) this.x=x; this.y=y; 参考文献:1 耿祥义、张跃平.Java2实用教程.北京:清华大学出版社.2006 2黄明 梁旭、周绍斌.Java课程设计北京:电子工业出版社.2006 3谢希仁.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1