java设计报告.doc_第1页
java设计报告.doc_第2页
java设计报告.doc_第3页
java设计报告.doc_第4页
java设计报告.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

贵州师范大学职业技术学院Java课程设计报告题 目: 贪吃蛇游戏 姓 名: 杨茂科 杨胜文 王明 班 级: 08计应 指导老师: 徐凯老师 实习地点: 实验楼一机房 实习时间: 2010年11月29日2010年12月17日 前 言Java语言虽然发展历史比较短,却是人们公认的一种优秀的面向对象编程语言。 它以CC+语言为基础,同时对CC+语言进行了成功改造。 由于Java语言不仅具有强大功能,使得它成为基于Internet网络应用开发的首选语言。Java是当前最流行的程序设计语言之一,它的出现大大地促进了软件产业和互联网的发展。Java之所以如此地流行是因为它是一种简单易学易用的、纯面向对象的、可移植的、安全的、高效的、健壮的、分布式的、多线程的、结构中立的、可解释执行的和动态的语言。Java拥有包括Sun、IBM在内的世界各大软件厂商的支持,因而发展迅速。经过10多年的发展,Java语言已从最初的Oak发展到了Java SE6。本游戏以Java SE6.0为基础,融合了程序设计人员必备的基础理论知识,如面向对象思想理论、面向对象软件分析。本游戏由我们组的三个人员共同完成,其中有三部分组成:第一章 游戏的简介部分:包括游戏的功能、规则、以面向对象思想所涉及到的类、各个类之间的关系、游戏整体运行的情况。使每一个不了解该游戏的同学都能很好的读懂。第二章 代码部分:包括本游戏在设计过程中所涉及到所有类的代码。第三章 总结:不管我们以后是做什么事,都要善于总结自己的得失,时刻的让自己进步。本游戏编写的形式是对书本上知识的巩固,如果读者在这之中有什么不懂的地方,可以问我们或者查阅其他图书,进而成为一名基础理论扎实、实践经验丰富的Java高级程序设计人才。目录第一章游戏简介1一、功能及规则1二、游戏中涉及的类1三、类之间的关系1四、游戏界面2五、任务书2第二章 代码部分3一、控制层(Controller)3二、实体层71、蛇(Snack)72、食物(Food)93、地形或地面(Ground)10三、游戏界面设置111、主Frame(MainFrame)112、游戏设置面板(GameOptionPanel)143、游戏显示面板(GamePanel)15四、监听器161、蛇的监听器162、游戏监听器16五、工具类16第三章 总结18附 录19 Java课程设计 贪吃蛇游戏 游戏简介第一章 游戏简介一、功能及规则本次java课程设计采用面向对象的思想编写一个贪吃蛇的小游戏,该游戏的功能及规则如下:1、蛇具有吃食物的功能2、当蛇吃到食物后自己的身体就会加长一节3、当蛇吃到自己的身体或者是石头自己就会死掉4、该游戏具有暂停、开始新游戏、停止游戏的功能5、方向键控制蛇移动的方向、回车键或空格键暂停/开始游戏、pageup pagedown 使蛇加速或减速移动二、游戏中涉及的类1、控制器(Controller):控制Ground、Snake、Food,负责游戏的逻辑,处理按键事件,实现了SnakeListener接口,可以处理Snake触发的事件等。2、食物(Food):有x、y坐标和颜色等属性。3、地形或地面(Ground):在游戏开始的时候画一个地图。4、蛇(Snack):其中包括蛇移动的方法、画自己身体等方法。5、游戏设置面板(GameOptionPanel):其中包括游戏开始、暂停、停止按钮及图片等的添加。6、主界面(MainFrame):实现GameListener接口、让主界面居中显示等操作。7、游戏监听器(GameListener):包括游戏开始、暂停、停止、继续事件。8、蛇的监听器(SnakeListener):包括蛇移动事件、蛇吃到食物事件。9、工具类(Global):此类中存放了其他类中用到的一些常量。10、游戏的显示界面(GamePanel):设置游戏面板的大小和颜色等。三、类之间的关系第1页 共19页四、游戏界面五、任务书设计题目设计内容小组成员分工贪吃蛇小游戏用java语言编写一个贪吃蛇的游戏,并运行所实现的功能组长:杨茂科控制器 游戏的设置和显示面板设计杨胜文食物、石头设计王明主frame 监听程序的工具类设计第 19页 共 19 页 Java课程设计 贪吃蛇游戏 控制层第二章 代码部分一、控制层(Controller)import java.awt.event.*; import java.awt.*;import java.util.*; import javax.swing.*;public class Controller extends KeyAdapter implements SnakeListener private Ground ground;/ 地形 private Snake snake;/ 蛇private Food food;/食物private GamePanel gamePanel;/ 显示 private JLabel gameInfoLabel;/提示信息private boolean playing;private int map;/控制器监听器 private Set listeners = new HashSet();public void keyPressed(KeyEvent e) if (e.getKeyCode() != KeyEvent.VK_Y & !playing)return;switch (e.getKeyCode() / 方向键 上case KeyEvent.VK_UP:if (snake.isPause() snake.changePause();for (GameListener l : listeners)l.gameContinue();snake.changeDirection(Snake.UP);break;case KeyEvent.VK_DOWN:/ 方向键 下if (snake.isPause() snake.changePause();for (GameListener l : listeners)l.gameContinue();snake.changeDirection(Snake.DOWN);break;case KeyEvent.VK_LEFT:/ 方向键 左if (snake.isPause() snake.changePause();for (GameListener l : listeners)l.gameContinue();snake.changeDirection(Snake.LEFT);break;case KeyEvent.VK_RIGHT:/ 方向键 右if (snake.isPause() snake.changePause();for (GameListener l : listeners)l.gameContinue();snake.changeDirection(Snake.RIGHT); break;case KeyEvent.VK_ENTER:case KeyEvent.VK_SPACE:/ 回车或空格 (暂停) snake.changePause();for (GameListener l : listeners)if (snake.isPause()l.gamePause();elsel.gameContinue();break;case KeyEvent.VK_PAGE_UP:/ PAGE_UP 加速snake.speedUp();break;case KeyEvent.VK_PAGE_DOWN:/ PAGE_DOWN 减速snake.speedDown();break; if (gamePanel != null)/ 重新显示/gamePanel.redisplay(ground, snake, food);if (gameInfoLabel != null)/ 更新提示 /gameInfoLabel.setText(getNewInfo();/处理Snake 触发的 snakeMoved 事件public void snakeMoved() / 判断是否吃到食物if (food != null & food.isSnakeEatFood(snake) / 吃到食物后, 蛇增加身体, 再重新丢一个食物snake.eatFood();food.setLocation(ground = null ? food.getNew() : ground.getFreePoint();/ 如果吃到食物, 就肯定不会吃到石头else if (ground != null & ground.isSnakeEatRock(snake) / 如果吃到的是石头, 或吃到自己的身体, 就让蛇死掉stopGame();if (snake.isEatBody()stopGame();if (gamePanel != null)/ 更新提示if (gameInfoLabel != null)gameInfoLabel.setText(getNewInfo();/ 开始一个新游戏public void newGame() if (ground != null) switch (map) default:ground.init();break; playing = true;snake.reNew();for (GameListener l : listeners)l.gameStart();/ 结束游戏public void stopGame() if (playing) playing = false;snake.dead();for (GameListener l : listeners)l.gameOver(); / 暂停游戏public void pauseGame() snake.setPause(true);for (GameListener l : listeners)l.gamePause(); /继续游戏public void continueGame() snake.setPause(false);for (GameListener l : listeners)l.gameContinue();/接受Snake,Food,Ground 的构造器public Controller(Snake snake, Food food, Ground ground, GamePanel gamePanel) this.snake = snake;this.food = food;this.ground = ground;this.gamePanel = gamePanel;/ 先丢一个食物if (ground != null & food != null)food.setLocation(ground.getFreePoint();this.snake.addSnakeListener(this); / 注册监听器/多接受一个显示提示信息的JLabelpublic Controller(Snake snake, Food food, Ground ground,GamePanel gamePanel, JLabel gameInfoLabel) this(snake, food, ground, gamePanel);this.setGameInfoLabel(gameInfoLabel);if (gameInfoLabel != null)gameInfoLabel.setText(getNewInfo();/ 得到最新的提示信息 return 蛇的最新信息public String getNewInfo() if (!snake.isLive()return ;/ 提示: 按 Y 开始新游戏;elsereturn new StringBuffer().append(提示: ).append(速度 ).append(snake.getSpeed().toString()+ 毫秒/格; / 添加监听器 param lpublic synchronized void addGameListener(GameListener l) if (l != null)this.listeners.add(l); / 移除监听器public synchronized void removeGameListener(GameListener l) if (l != null)this.listeners.remove(l); public Snake getSnake() return this.snake;public Food getFood() return this.food;public Ground getGround() return this.ground;/处理蛇吃到食物后触发的 snakeEatFood事件public void snakeEatFood() System.out.println(吃到食物!); public GamePanel getGamePanel() return gamePanel; / 设置GamePanelpublic void setGamePanel(GamePanel gamePanel) this.gamePanel = gamePanel;public JLabel getGameInfoLabel() return gameInfoLabel;public void setGameInfoLabel(JLabel gameInfoLabel) this.gameInfoLabel = gameInfoLabel;this.gameInfoLabel.setSize(Global.WIDTH * Global.CELL_WIDTH, 20);this.gameInfoLabel.setFont(new Font(宋体, Font.PLAIN, 12);gameInfoLabel.setText(this.getNewInfo();public void setGround(Ground ground) this.ground = ground;public void setSnake(Snake snake) this.snake = snake;public void setFood(Food food) this.food = food;public int getMap() return map;public void setMap(int map) this.map = map;public boolean isPlaying() return playing;public void setPlaying(boolean playing) this.playing = playing;public boolean isPausingGame() return snake.isPause(); Java课程设计 贪吃蛇游戏 实体层二、实体层1、蛇(Snack)import java.awt.*;import java.util.*;public class Snake public static final int UP = 1;/ 方向上public static final int DOWN = -1;/ 方向下public static final int LEFT = 2;/ 方向左public static final int RIGHT = -2;/ 方向右 private LinkedList body = new LinkedList();/蛇(多个节点)private int oldDirection;/ 上一次的移动方向private int newDirection;/ 下一步的方向(有效方向)private Point head;/ 临时存放蛇头的坐标private Point tail;/ 临时存放蛇尾巴的坐标private int speed;/ 移动速度private boolean live;/ 生命, 是否活着private boolean pause;/ 是否暂停private Set listeners = new HashSet();public static final Color DEFAULT_HEAD_COLOR = new Color(0xcc0033);private Color headColor = DEFAULT_HEAD_COLOR;/ 蛇头的颜色public static final Color DEFAULT_BODY_COLOR = new Color(0xcc0033);private Color bodyColor = DEFAULT_BODY_COLOR;/ 蛇身体的颜色public void move() /忽略相反方向 if (oldDirection + newDirection != 0)oldDirection = newDirection;/把蛇尾巴拿出来重新设置坐标作为新蛇头,etLocation 将返回一个新的Point,tail把尾巴坐标保存下来, 吃到食物时再加上tail = (head = takeTail().getLocation();head.setLocation(getHead();/根据蛇头的坐标再 上下左右switch (oldDirection) /根据方向让蛇移动case UP: head.y-;break;case DOWN: head.y+; break;case LEFT: head.x-; break;case RIGHT: head.x+; break; body.addFirst(head); / 添加到头上去/一个内部类, 驱动蛇定时移动private class SnakeDriver implements Runnable public void run() while (live) if (!pause) move();/ ControllerListener 的状态改变事件for (SnakeListener l : listeners)l.snakeMoved();try Thread.sleep(speed); catch (InterruptedException e) /在尾巴上增加一个节点public void eatFood() /把上一次移动拿掉的节点再加上body.addLast(tail.getLocation();/触发SnakeListener 的 snakeEatFood 事件for (SnakeListener l : listeners) l.snakeEatFood();public void changeDirection(int direction) this.newDirection = direction; /改变方向public Point getHead() return body.getFirst();/得到蛇头节点public Point takeTail() return body.removeLast();/去掉蛇尾巴public int getLength() return body.size();/得到蛇的长度public void begin() new Thread(new SnakeDriver().start();/让蛇开始运动public void reNew() init();begin();/让蛇复活, 并开始运动/初始化蛇的信息、长度, 位置, 方向, 速度, 生命和暂停状态public void init() body.clear();/初始化位置在中间int x = Global.WIDTH / 2 - Global.INIT_LENGTH / 2;int y = Global.HEIGHT / 2;for (int i = 0; i Global.INIT_LENGTH; i+)this.body.addFirst(new Point(x+, y);oldDirection = newDirection = RIGHT; /设置默认方向为向右speed = Global.SPEED; /初始化速度live = true; pause = false; /初始化生命和暂停状态/是否吃到自己的身体、return 蛇头的坐标是否和自己的身体的某一个坐标重合public boolean isEatBody() / 要把蛇头排除, body.get(0) 是蛇头for (int i = 1; i Global.SPEED_STEP)speed -= Global.SPEED_STEP; /减速, 幅度为 Global 中设置的 SPEED_STEP public void speedDown() speed += Global.SPEED_STEP; public int getSpeed() return speed; public void setSpeed(int speed) this.speed = speed; public boolean isLive() return live; public void setLive(boolean live) this.live = live; public void dead() this.live = false; public boolean isPause() return pausepublic void setPause(boolean pause) this.pause = pause; public void changePause() pause = !pause; 2、食物(Food)import java.awt.*;import java.util.*;public class Food extends Point private Color color = new Color(0xcc0033);/ 食物的颜色private Random random = new Random();public Food() super();/ 默认的构造器, 产生(0,0)的坐标public Point getNew() Point p = new Point();p.x = random.nextInt(Global.WIDTH);p.y = random.nextInt(Global.HEIGHT);return p; public Food(Point p) super(p);/初始化坐标和指定坐标相同的构造器 / 蛇是否吃到了食物public boolean isSnakeEatFood(Snake snake) return this.equals(snake.getHead();/ 画自己, 将调用 drawFood(Graphics, int, int, int, int) 方法 public void drawMe(Graphics g) g.setColor(color);drawFood(g, x * Global.CELL_WIDTH, y * Global.CELL_HEIGHT,Global.CELL_WIDTH, Global.CELL_HEIGHT); /画食物, 可以覆盖这个方法改变食物的显示public void drawFood(Graphics g, int x, int y, int width, int height) g.fill3DRect(x, y, width, height, true); public Color getColor() return color; public void setColor(Color color) this.color = color; 3、地形或地面(Ground)import java.awt.*;import java.util.*;public class Ground /存放石头的二维数组private boolean rocks = new booleanGlobal.WIDTHGlobal.HEIGHT;/存放getFreePoint()方法生成的不是石头的随机的坐标private Point freePoint = new Point();public static final Color DEFAULT_ROCK_COLOR = new Color(0x666666);private Color rockColor = DEFAULT_ROCK_COLOR;/ 石头的颜色public Ground() init();/默认的构造器, 将调用 init()方法和 generateRocks() 方法private Random random = new Random();/初始化地面(清空石头)public void clear() for (int x = 0; x Global.WIDTH; x+)for (int y = 0; y Global.HEIGHT; y+)rocksxy = false; public void init() clear();generateRocks();/产生石头, 可以覆盖这个方法改变石头在地面上的布局public void generateRocks() for (int x = 0; x Global.WIDTH; x+)rocksx0 = rocksxGlobal.HEIGHT - 1 = true;for (int y = 0; y Global.HEIGHT; y+)rocks0y = rocksGlobal.WIDTH - 1y = true; public void addRock(int x, int y) rocksxy = true; /添加一块石头到指定格子坐标/蛇是否吃到了石头public boolean isSnakeEatRock(Snake snake) return rockssnake.getHead().xsnake.getHead().y; /随机生成一个不是石

温馨提示

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

评论

0/150

提交评论