贪吃蛇游戏开发设计_第1页
贪吃蛇游戏开发设计_第2页
贪吃蛇游戏开发设计_第3页
贪吃蛇游戏开发设计_第4页
贪吃蛇游戏开发设计_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

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

文档简介

1、中山大学南方学院 12级计算机专业软件工程设计报告 1 课程设计报告 贪吃蛇系统的 设计与实现 系 名:电子通信与软件工程系 专 业:计算机科学与技术 学号姓名任务 122011124肖宝函 122011031髙嘉豪 122011042洪淑洲 指导教师: 薄 宏 二一四 年 十二 月 装 订 线 中山大学南方学院 中山大学南方学院 12级计算机专业软件工程设计报告 2 摘要:摘要: 近年来,近年来,Java 作作为一种新的为一种新的编程语言,以其简单性编程语言,以其简单性、可、可 移植性和移植性和平台无关性平台无关性等优点,得到了广泛等优点,得到了广泛地应用,它以其地应用,它以其 友好友好的开

2、发界面的开发界面、强大的组件、强大的组件支持等优点支持等优点,得到广大程,得到广大程序序 员的接受员的接受和认可。和认可。 “贪吃蛇贪吃蛇”游戏是一个游戏是一个经典的游戏经典的游戏,它因操作简,它因操作简单、娱单、娱 乐性强而乐性强而广受欢迎。本文基于广受欢迎。本文基于 Java 技术技术,开发了一个,开发了一个操作操作 简单、界面美观、功能较齐全简单、界面美观、功能较齐全的的“贪吃蛇贪吃蛇”游戏。整个游游戏。整个游 戏程戏程序分为二个序分为二个功能模块,四个类模块功能模块,四个类模块,实现了游戏,实现了游戏的开的开 始、暂停、结束。通过本游戏始、暂停、结束。通过本游戏的开发,达到学习的开发,

3、达到学习 Java 技术技术 和熟悉软件和熟悉软件开发流程的开发流程的目的。目的。 关键词:贪吃蛇,Java,游戏游戏 目录目录 第第 1 章章 可行性分析可行性分析.5 1.1 经济可行性经济可行性.5 1.2 技术可行性技术可行性.5 第第 2 章章 需求分析需求分析 .6 2.1 游戏的介游戏的介绍绍.6 中山大学南方学院 12级计算机专业软件工程设计报告 3 2.2 游戏开发游戏开发的可行性的可行性.6 2.3 设计目的设计目的.6 2.4 游戏需求游戏需求.7 2.4.1 游戏界面需求.7 2.4.2 游戏形状需求.7 2.4.3 键盘事件处理.7 2.4.4 显示需求.7 2.4.

4、5 接口控制.7 2.4.6 环境介绍.8 第第 3 章章 功能设计功能设计 .9 3.1 游戏的流程游戏的流程图图.9 3.2 游戏主界游戏主界面的开发面的开发.9 3.3 绘制蛇身绘制蛇身.10 3.4 创建初始创建初始“蛇蛇”及及“蛇蛇”的移动的移动.11 3.5 吃掉食物,蛇身增长吃掉食物,蛇身增长.11 3.6 随机产生随机产生食物食物.12 3.7 键盘事件键盘事件处理处理.12 3.8 判断游戏结判断游戏结束束.14 第第 4 章章 游戏测试与游戏测试与发布发布 .16 4.1 游戏运行游戏运行的效果图的效果图.16 中山大学南方学院 12级计算机专业软件工程设计报告 4 4.2

5、 测试结果测试结果.17 第第 5 章章 自我评价和自我评价和总结总结 .18 5.1 遇到的问遇到的问题及解决办题及解决办法法.18 5.2 总结总结.18 参考资料参考资料.19 附加源代码附加源代码 .19 第第 1 1 章章 可行性分析可行性分析 1.1 经济可行经济可行性性 游戏开发至今已经有 30 多年,在这个短暂的时期里,随着 硬件的水平的提高。游戏开发新技术层出不穷,经典游戏比比皆 是,游戏这个名称一直存在于每个人的日常生活中。因此,游戏 对于现代人的成长历程,绝对是一个不可或缺的重要角色.而从技 术方面来看,现在的 java 技术也融入了手机中。这些都为开发的 这款贪吃蛇游戏

6、提供了条件。 1.2 技术可行技术可行性性 本次设计我将主要运用java 语言来完成。Java 语言是一种跨 中山大学南方学院 12级计算机专业软件工程设计报告 5 平台,适合于分布式计算环境的面向对象编程语言,用 Java写的 应用程序不用修改就可在不同的软硬件平台上运行。 由于 Java 主要用于网络应用程序开发,因此对安全性有较 高的要求。如果没有安全保证,用户从网络下载程序执行就非常 危险。Java 通过自己的安全机制防止了病毒程序的产生和下载程 序对本地系统的威胁破坏。 第第 2 2 章章 需求分析需求分析 2.1 游戏的介游戏的介绍绍 游戏的名称叫“贪吃蛇” ,节:一条蛇可以看成有

7、许多正方 形的“小格子”拼凑成,我把它称作节。节是蛇身上最小的单位。 段:当许多节连成一条直线,我称它为段。贪吃蛇只有一 段,如果它拐弯就变成两段。 链表:用来保存每一段的状态,链表的元素单位是段。且 链表的最后一个元素表示蛇的头部段。 坐标系:MIDP 中的坐标以左上角那点为(0,0),向右则 x 递增,向下则 y 递增。 中山大学南方学院 12级计算机专业软件工程设计报告 6 2.2 游戏开发游戏开发的可行性的可行性 游戏开发至今已经有 30 多年,在这个短暂的时期里,随着 硬件的水平的提高。游戏开发新技术层出不穷,经典游戏比比皆 是,游戏这个名称一直存在于每个人的日常生活中。因此,游戏

8、对于现代人的成长历程,绝对是一个不可或缺的重要角色.而从技 术方面来看,现在的 java 技术也融入了手机中。这些都为开发的 这款贪吃蛇游戏提供了条件。 2.3 设计目的设计目的 综合运用在校所学的知识和技能,设计开发贪吃蛇游戏,使自 己熟悉应用系统的开发的过程,培养独立思考的能力,校验学习 效果和动手能力,提高工程实践能力。 2.4 游戏需求游戏需求 给出一条小蛇和随机出现一个食物,当小蛇吃到食物时就加 分。 2.4.1 游戏界面游戏界面需求需求 良好的用户界面,有分数显示和暂停。 2.4.2 游戏形状游戏形状需求需求 良好的方块形状设计,绘制小蛇和食物,小蛇由几个方块组成, 中山大学南方学

9、院 12级计算机专业软件工程设计报告 7 食物由一个方块组成。 2.4.3 键盘事件键盘事件处理处理 小蛇可以通过键盘方向键(上,下,左,右)进行方向的移动。 2.4.4 显示需求显示需求 当小蛇吃掉几个食物后会变长,平且吃完食物时食物会消失, 并立即产生一个 1 个新的事物。 2.4.5 接口控制接口控制 本软件通过键盘进行操作,在 windows 操作系统下,利用键 盘的上下左右键进行操作,要使用键盘的接口事件。 2.4.6 环境介绍环境介绍 操作系统:Microsoft Windows XP 程序语言:Java 2 开 发 包:Java(TM) 2 Standard Edition (5

10、.0) Sun Micro. J2ME Wireless Tool Kit 2.2 IDE: Eclipse 3.01 中山大学南方学院 12级计算机专业软件工程设计报告 8 第第 3 章章 功能设计功能设计 3.1 游戏的流程游戏的流程图图 进入游戏界面 点击开始按钮,游 戏开始,蛇随机产 生 / _|_| O| / / _/ _|_/ _ | | / / / / / / / / / / _-_ / / _- -_ | | ( ( _- _-_ -_ _/ | -_- _- -_ -_- / -_ _- -_ _- -_- -_- 操作: 右移、 下移、 左移、 上移 没有吃到食物, 且碰到

11、边界 游戏中途欲中 断,稍候进行 游戏 中山大学南方学院 12级计算机专业软件工程设计报告 9 3.2 游戏主界游戏主界面的开发面的开发 屏幕的背景用白色,由于屏幕高比宽长,所以取以宽为边长 的矩形区域作为游戏区域,下面的部分作为分数、信息区域。 单击退出游戏单击暂停游戏 单击开始游戏,游 戏恢复正常。 中山大学南方学院 12级计算机专业软件工程设计报告 10 图一(游戏的主界面) 3.3 绘制蛇身绘制蛇身 public void drawMe(Graphics g) for (Point p : body) /* 画蛇身体 */ g.setColor(bodyColor); drawBody

12、(g, p.x * Global.CELL_WIDTH, p.y * Global.CELL_HEIGHT, Global.CELL_WIDTH, Global.CELL_HEIGHT); /* 画蛇头 */ g.setColor(headColor); drawHead(g, getHead().x * Global.CELL_WIDTH, getHead().y * Global.CELL_HEIGHT, Global.CELL_WIDTH, Global.CELL_HEIGHT); /* * 画蛇头, 可以覆盖这个方法改变蛇头的显示 * * param g * param x * 像素坐

13、标 x * param y * 像素坐标 y * param width * 宽度(单位:像素) * param height * 高度(单位:像素) */ public void drawHead(Graphics g, int x, int y, int width, int height) g.fill3DRect(x, y, width, height, true); /* * 画蛇的一节身体, 可以覆盖这个方法改变蛇的身体节点的显示 * * param g * param x * 像素坐标 x * param y * 像素坐标 y * param width 中山大学南方学院 12级

14、计算机专业软件工程设计报告 11 * 宽度(单位:像素) * param height * 高度(单位:像素) */ public void drawBody(Graphics g, int x, int y, int width, int height) g.fill3DRect(x, y, width, height, true); /* * 得到蛇头的颜色 * * return */ public Color getHeadColor() return headColor; /* * 设置蛇头的颜色 * * param headColor */ public void setHeadCo

15、lor(Color headColor) this.headColor = headColor; /* * 得到蛇身体的颜色 * * return */ public Color getBodyColor() return bodyColor; /* * 设置蛇身体的颜色 * * param bodyColor */ public void setBodyColor(Color bodyColor) this.bodyColor = bodyColor; 中山大学南方学院 12级计算机专业软件工程设计报告 12 3.4 创建初始创建初始“蛇蛇”及及“蛇蛇”的移动的移动 蛇的初始长度为 5,边长

16、为 10个像素(背景为黄色) ,蛇头初 始位于屏幕(100,30) ,方向向左,用向量表来记录每个蛇的位 置以及方向。 部分参考代部分参考代码如下:码如下: if (e.getKeyCode() != KeyEvent.VK_Y / TODO Auto-generated method stub /* 根据按键不同, 让蛇改变不同的方向 */ switch (e.getKeyCode() /* 方向键 上 */ case KeyEvent.VK_UP: if (snake.isPause() snake.changePause(); for (GameListener l : listener

17、s) 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.changePau

18、se(); for (GameListener l : listeners) l.gameContinue(); snake.changeDirection(Snake.LEFT); break; 中山大学南方学院 12级计算机专业软件工程设计报告 13 /* 方向键 右 */ case KeyEvent.VK_RIGHT: if (snake.isPause() snake.changePause(); for (GameListener l : listeners) l.gameContinue(); snake.changeDirection(Snake.RIGHT); break; 3

19、.5 吃掉食物,蛇身增长吃掉食物,蛇身增长 当小蛇吃掉食物后,会增长, 部分代码: public void snakeMoved() /* 判断是否吃到食物 */ if (food != null food.setLocation(ground = null ? food.getNew() : ground .getFreePoint(); /* 如果吃到食物, 就肯定不会吃到石头 */ else if (ground != null if (snake.isEatBody() stopGame(); if (gamePanel != null) gamePanel.redisplay(gro

20、und, snake, food); /* 更新提示 */ if (gameInfoLabel != null) gameInfoLabel.setText(getNewInfo(); 中山大学南方学院 12级计算机专业软件工程设计报告 14 3.6 随机产生随机产生食物食物 部分代码: * 产生食物 * 说明:食物的坐标必须位于屏幕内,且不能和蛇身重合 if (food != null food.setLocation(ground = null ? food.getNew() : ground .getFreePoint(); public Point getNew() Point p =

21、 new Point(); p.x = random.nextInt(Global.WIDTH); p.y = random.nextInt(Global.HEIGHT); return p; 3.7 键盘事件键盘事件处理处理 可以通过键盘控制蛇的移动方向 /* 方向键 上 */ case KeyEvent.VK_UP: if (snake.isPause() snake.changePause(); for (GameListener l : listeners) l.gameContinue(); snake.changeDirection(Snake.UP); break; /* 方向键

22、 下 */ case KeyEvent.VK_DOWN: if (snake.isPause() snake.changePause(); for (GameListener l : listeners) l.gameContinue(); snake.changeDirection(Snake.DOWN); break; /* 方向键 左 */ case KeyEvent.VK_LEFT: 中山大学南方学院 12级计算机专业软件工程设计报告 15 if (snake.isPause() snake.changePause(); for (GameListener l : listeners)

23、 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; 3.8 判断游戏结判断游戏结束束 只有两种游戏结束的方式,蛇头碰到蛇身和撞墙游戏结束。 参考代码:参考代码: public void s

24、nakeMoved() /* 判断是否吃到食物 */ if (food != null food.setLocation(ground = null ? food.getNew() : ground .getFreePoint(); /* 如果吃到食物, 就肯定不会吃到石头 */ else if (ground != null if (snake.isEatBody() stopGame(); if (gamePanel != null) gamePanel.redisplay(ground, snake, food); 中山大学南方学院 12级计算机专业软件工程设计报告 16 /* 更新提示

25、 */ if (gameInfoLabel != null) gameInfoLabel.setText(getNewInfo(); 第第 4 章章 游戏测试与游戏测试与发布发布 4.1 游戏运行游戏运行的效果图的效果图 图一表示小图一表示小蛇正在移动蛇正在移动 中山大学南方学院 12级计算机专业软件工程设计报告 17 图二表示,随机产生一图二表示,随机产生一个食物个食物 中山大学南方学院 12级计算机专业软件工程设计报告 18 图三表示小图三表示小蛇吃掉食物蛇吃掉食物增长后继续增长后继续移动移动 4.2 测试结果测试结果 程序运行良好,未出现 bug. 中山大学南方学院 12级计算机专业软件

26、工程设计报告 19 第第 5 章章 自我评价和自我评价和总结总结 5.1 遇到的问遇到的问题及解决办题及解决办法法 先是图形化界面的设计,一直想不出好的办法,最后翻看了教程 才解决了这个问题,后来在蛇的移动上也遇到了些问题。上网查了 一下,才知道蛇身是由一连串的基本图形组成的,每过 1 秒检查前 面是什么,如果是空的,就把图画成普通身子的样子。再在前方在 画一个头,并将其左标记入数组,数组要足够大,在把尾巴画成背 景色,如果前面是食物,尾巴就不删除。这个里面的难点就是数组 里面的操作和坐标的表示。把头添在最后一个元素,把第一个元素 提起。 5.2 总结总结 这款游戏的优点,就是简单的画面和容易

27、的操作很容易使玩家就 上手,适合不通年龄段的玩家娱乐。当然这款游戏也存在有不足的 地方,有些功能还是没有实现。通过这次设计过程中,我查阅了大 量的资料,对 java有了更深刻的认识,通过这次的设计,更提高了 我在程序设计和调试方面的技巧,更重要的是我认识了自己的不足, 在编程方面我还需要努力学习来充实自己,来获取更大的收获。 中山大学南方学院 12级计算机专业软件工程设计报告 20 参考资料 【1】Java2实用教程(第三版) 清华大学出版社。 【2】java 编程思想(第四版) 机械工业出版社。 【3】J2ME 游戏开发实例大全 清华大学出版社出版。 附加源代码 1. Controller

28、package cn.itcast.snake.controller; import java.awt.Font; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.HashSet; import java.util.Set; import javax.swing.JLabel; import cn.itcast.snake.entities.Food; import cn.itcast.snake.entities.Ground; import cn.itcast.snake.

29、entities.Snake; import cn.itcast.snake.listener.GameListener; import cn.itcast.snake.listener.SnakeListener; import cn.itcast.snake.util.Global; import cn.itcast.snake.view.GamePanel; /* * 控制器 * 控制 Ground, Snake, Food * 负责游戏的逻辑 * 处理按键事件 * 中山大学南方学院 12级计算机专业软件工程设计报告 21 * 实现了 SnakeListener 接口, 可以处理 Sna

30、ke 触发的事件 * 方法 snakeEatFood() 处理蛇吃到食物后触发的 snakeEatFood 事件 但什么也没做 * * * */ public class Controller extends KeyAdapter implements SnakeListener /* 地形 */ private Ground ground; /* 蛇 */ private Snake snake; /* 食物 */ private Food food; /* 显示 */ private GamePanel gamePanel; /* 提示信息 */ private JLabel gameIn

31、foLabel; private boolean playing; private int map; /* 控制器监听器 */ private Set listeners = new HashSet(); /* * 处理按键事件 * 接受按键, 根据按键不同, 发出不同的指令 * UP: 改变蛇的移动方向为向上 * DOWN: 改变蛇的移动方向为向下 * LEFT: 改变蛇的移动方向为向左 * RIGHT: 改变蛇的移动方向为向右 * SPACE: 暂停/继续 * PAGE UP: 加快蛇的移动速度 * PAGE DOWN: 减慢蛇的移动速度 * Y: 重新开始游戏 */ public voi

32、d keyPressed(KeyEvent e) if (e.getKeyCode() != KeyEvent.VK_Y / TODO Auto-generated method stub /* 根据按键不同, 让蛇改变不同的方向 */ switch (e.getKeyCode() /* 方向键 上 */ case KeyEvent.VK_UP: if (snake.isPause() snake.changePause(); for (GameListener l : listeners) l.gameContinue(); snake.changeDirection(Snake.UP);

33、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(

34、); 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: 中山大学南方学院 12级计算机专业软件

35、工程设计报告 23 snake.changePause(); /* = */ for (GameListener l : listeners) if (snake.isPause() l.gamePause(); else l.gameContinue(); break; /* PAGE_UP 加速 */ case KeyEvent.VK_PAGE_UP: snake.speedUp(); break; /* PAGE_DOWN 减速 */ case KeyEvent.VK_PAGE_DOWN: snake.speedDown(); break; /* 字母键 Y (重新开始游戏) */ ca

36、se KeyEvent.VK_Y: if (!isPlaying() newGame(); break; /* 重新显示 */ if (gamePanel != null) gamePanel.redisplay(ground, snake, food); /* 更新提示 */ if (gameInfoLabel != null) gameInfoLabel.setText(getNewInfo(); /* * 处理 Snake 触发的 snakeMoved 事件 */ public void snakeMoved() /* 判断是否吃到食物 */ if (food != null food.

37、setLocation(ground = null ? food.getNew() : ground .getFreePoint(); /* 如果吃到食物, 就肯定不会吃到石头 */ 中山大学南方学院 12级计算机专业软件工程设计报告 24 else if (ground != null if (snake.isEatBody() stopGame(); if (gamePanel != null) gamePanel.redisplay(ground, snake, food); /* 更新提示 */ if (gameInfoLabel != null) gameInfoLabel.setT

38、ext(getNewInfo(); /* * 开始一个新游戏 */ public void newGame() if (ground != null) switch (map) case 2: ground.clear(); ground.generateRocks2(); break; default: ground.init(); break; playing = true; snake.reNew(); for (GameListener l : listeners) l.gameStart(); /* * 结束游戏 */ public void stopGame() if (playi

39、ng) playing = false; snake.dead(); for (GameListener l : listeners) 中山大学南方学院 12级计算机专业软件工程设计报告 25 l.gameOver(); /* * 暂停游戏 */ public void pauseGame() snake.setPause(true); for (GameListener l : listeners) l.gamePause(); /* * 继续游戏 */ public void continueGame() snake.setPause(false); for (GameListener l

40、 : listeners) l.gameContinue(); /* * 接受 Snake,Food,Ground 的构造器 * * param snake * param food * param 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

41、!= null /* 注册监听器 */ this.snake.addSnakeListener(this); /* * 多接受一个显示提示信息的 JLabel * 中山大学南方学院 12级计算机专业软件工程设计报告 26 * param snake * param food * param ground * param gameInfoLabel */ public Controller(Snake snake, Food food, Ground ground, GamePanel gamePanel, JLabel gameInfoLabel) this(snake, food, grou

42、nd, gamePanel); this.setGameInfoLabel(gameInfoLabel); if (gameInfoLabel != null) gameInfoLabel.setText(getNewInfo(); /* * 得到最新的提示信息 * * return 蛇的最新信息 */ public String getNewInfo() if (!snake.isLive() return ;/ 提示: 按 Y 开始新游戏; else return new StringBuffer().append(提示: ).append(速度 ).append( snake.getSp

43、eed().toString() + 毫秒/格; /* * 添加监听器 * * param l */ public synchronized void addGameListener(GameListener l) if (l != null) this.listeners.add(l); /* * 移除监听器 * * param l */ 中山大学南方学院 12级计算机专业软件工程设计报告 27 public synchronized void removeGameListener(GameListener l) if (l != null) this.listeners.remove(l)

44、; /* * 得到蛇的引用 * * return */ public Snake getSnake() return this.snake; /* * 得到食物的引用 * * return */ public Food getFood() return this.food; /* * 得到地形的引用 * * return */ public Ground getGround() return this.ground; /* * 处理蛇吃到食物后触发的 snakeEatFood 事件, 但什么也没做 * 可以覆盖这个方法增加功能, 例如, 增加记分功能 */ public void snakeE

45、atFood() / TODO Auto-generated method stub System.out.println(吃到食物!); public GamePanel getGamePanel() return gamePanel; 中山大学南方学院 12级计算机专业软件工程设计报告 28 /* * 设置 GamePanel * * param gamePanel */ public void setGamePanel(GamePanel gamePanel) this.gamePanel = gamePanel; public JLabel getGameInfoLabel() ret

46、urn 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 g

47、round) 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; 中山大学南方学院 12级计算机专业软件工程设计报告 29 public void setPlayi

48、ng(boolean playing) this.playing = playing; public boolean isPausingGame() / TODO Auto-generated method stub return snake.isPause(); 2. Food package cn.itcast.snake.entities; import java.awt.Color; import java.awt.Graphics; import java.awt.Point; import java.util.Random; import cn.itcast.snake.util.

49、Global; /* * * 食物, 有 x , y 坐标 和 颜色等属性 * 可以用 setColor() 改变食物的颜色 * 也可以通过覆盖 drawFood(Graphics, int, int, int, int) 方法 改变食物的显示方式 * * */ public class Food extends Point /* * */ private static final long serialVersionUID = 1L; /* 食物的颜色 */ private Color color = new Color(0 xcc0033); private Random random =

50、 new Random(); /* 中山大学南方学院 12级计算机专业软件工程设计报告 30 * 默认的构造器, 产生(0,0)的坐标 */ public Food() super(); public Point getNew() Point p = new Point(); p.x = random.nextInt(Global.WIDTH); p.y = random.nextInt(Global.HEIGHT); return p; /* * 初始化坐标和指定坐标相同的构造器 * * param x * param y */ public Food(Point p) super(p);

51、/* * 蛇是否吃到了食物 * * param p * return */ public boolean isSnakeEatFood(Snake snake) return this.equals(snake.getHead(); /* * 画自己, 将调用 drawFood(Graphics, int, int, int, int) 方法 * * param g */ public void drawMe(Graphics g) g.setColor(color); drawFood(g, x * Global.CELL_WIDTH, y * Global.CELL_HEIGHT, Glo

52、bal.CELL_WIDTH, Global.CELL_HEIGHT); 中山大学南方学院 12级计算机专业软件工程设计报告 31 /* * 画食物, 可以覆盖这个方法改变食物的显示 * * param g * param x * 像素坐标 x * param y * 像素坐标 y * param width * 宽度(单位:像素) * param height * 高度(单位:像素) */ public void drawFood(Graphics g, int x, int y, int width, int height) g.fill3DRect(x, y, width, height

53、, true); /* * 得到食物的颜色 * * return */ public Color getColor() return color; /* * 设置食物的颜色 * * param color */ public void setColor(Color color) this.color = color; 3. Ground package cn.itcast.snake.entities; import java.awt.Color; import java.awt.Graphics; import java.awt.Point; 中山大学南方学院 12级计算机专业软件工程设计报

54、告 32 import java.util.Random; import cn.itcast.snake.util.Global; /* * 可以叫做地形, 或地面 * * 可以通过 setRockColor(), setGriddingColor()方法更改石头或网格的颜色 * 通过 setDrawGridding() 方法设置是否画网格 * * 可以覆盖 drawRock(Graphics, int, int, int, int) 方法以改变石头的显示方式 * * 可以通过覆盖 genernateRocks() 方法改变石头产生的布局 * 覆盖此方法时, 请使用 addRock(int,i

55、nt) 方法在指定的坐标添加石头 * * 这个类提供了两种石头的布局 * 默认是使用第一种, 即一圈石头 * 如果想使用第二种, 则应该使用如下代码: * Ground ground = new Ground(); / 清空石头 ground.init(); / 使用提供的第二种石头的布局 ground.generateRocks2(); * * */ public class Ground /* 存放石头的二维数组 */ private boolean rocks = new booleanGlobal.WIDTHGlobal.HEIGHT; /* 存放 getFreePoint()方法生成

56、的不是石头的随机的坐标 */ private Point freePoint = new Point(); public static final Color DEFAULT_ROCK_COLOR = new Color(0 x666666); /* 石头的颜色 */ private Color rockColor = DEFAULT_ROCK_COLOR; public static final Color DEFAULT_GRIDDING_COLOR = Color.LIGHT_GRAY; /* 网格的颜色 */ private Color griddingColor = DEFAULT_

57、GRIDDING_COLOR; 中山大学南方学院 12级计算机专业软件工程设计报告 33 private Random random = new Random(); /* 是否画网格的开关 */ private boolean drawGridding = false; /* * 默认的构造器, 将调用 init()方法和 generateRocks() 方法 */ public Ground() init(); /* * 初始化地面(清空石头) */ public void clear() for (int x = 0; x Global.WIDTH; x+) for (int y = 0;

58、 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

59、; /* * 提供的第二种默认的石头布局 * 用这个可以测试蛇从另一边出现 * 使用时先调用 init()方法清空石头, 再调用这个方法产生石头布局 * 详细使用请参见类介绍 */ public void generateRocks2() 中山大学南方学院 12级计算机专业软件工程设计报告 34 for (int y = 0; y 6; y+) rocks0y = true; rocksGlobal.WIDTH - 1y = true; rocks0Global.HEIGHT - 1 - y = true; rocksGlobal.WIDTH - 1Global.HEIGHT - 1 - y = true; for (int y = 6; y Global.HEIGHT - 6; y+) rocks6y = true; rocksGlobal.WIDTH - 7y = true; /* * 添加一块石头到指定格子坐标 * * param x * 格子坐标 x * param y * 格子坐标 y */ public void addRock(int x, int y) rocksxy = true; /* * 蛇是否吃到了石头 * * param p * return */ public boolean isSnakeEatRoc

温馨提示

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

评论

0/150

提交评论