没有合适的资源?快使用搜索试试~ 我知道了~
Java代码实现移方块游戏设计
资源推荐
资源详情
资源评论
Java OOP Day04
1. 贪吃虫游戏——实现Worm方向改变
2. 贪吃虫游戏——实现Food抓取
3. DMS2.0——完成DMSFrame窗体的设计和布局
4. DMS2.0——完成DMSFrame监听方法的实现
1 贪吃虫游戏——实现Worm方向改变
1.1 问题
如何利用键盘的方向键驱动贪吃虫的运行方向.
1.2 方案
利用Swing的监听键盘事件的方法监听键盘事件, 根据获取的按键值驱动贪吃虫向不同的方向
运行:
01. public void action() {
02. worm = new Worm();
03. food = randomFood();
04. timer.schedule(new CreepTask(this), 0, 200);
05. requestFocus();//请求当前绘图面板获取输入焦点
06. //添加键盘事件监听器
07. addKeyListener(new KeyAdapter() {
08. //在有按键按下时候执行
09. public void keyPressed(KeyEvent e) {
10. int keyCode = e.getKeyCode();//获取按下的按键值
11. switch (keyCode) {//检查按键值
12. case KeyEvent.VK_DOWN://方向键 下
13. worm.changeDirection(Worm.DIRECTION_DOWN);
14. creepForFood();
15. break;
16. case KeyEvent.VK_UP:
17. worm.changeDirection(Worm.DIRECTION_UP);
18. creepForFood();
19. break;
20. case KeyEvent.VK_LEFT:
21. worm.changeDirection(Worm.DIRECTION_LEFT);
22. creepForFood();
23. break;
1.3 实现
重构Worm类, 增加改变运行方向的方法:
重构WormStage类的action方法, 增加对键盘事件的监听
24. case KeyEvent.VK_RIGHT:
25. worm.changeDirection(Worm.DIRECTION_RIGHT);
26. creepForFood();
27. break;
28. }
29. }
30. });
31. }
01. /** 改变方向 */
02. public boolean changeDirection(int direction) {
03. if (direction + currentDirection != 0) {
04. currentDirection = direction;
05. return true;
06. }
07. return false;
08. }
01. public void action() {
02. worm = new Worm();
03. food = randomFood();
04. timer.schedule(new CreepTask(this), 0, 200);
05. requestFocus();//请求当前绘图面板获取输入焦点
06. //添加键盘事件监听器
07. addKeyListener(new KeyAdapter() {
08. //在有按键按下时候执行
09. public void keyPressed(KeyEvent e) {
10. int keyCode = e.getKeyCode();//获取按下的按键值
11. switch (keyCode) {//检查按键值
12. case KeyEvent.VK_DOWN://方向键 下
13. worm.changeDirection(Worm.DIRECTION_DOWN);
完整代码参考(不包含Cell类型, Cell类型代码参考以前章节):
14. creepForFood();
15. break;
16. case KeyEvent.VK_UP:
17. worm.changeDirection(Worm.DIRECTION_UP);
18. creepForFood();
19. break;
20. case KeyEvent.VK_LEFT:
21. worm.changeDirection(Worm.DIRECTION_LEFT);
22. creepForFood();
23. break;
24. case KeyEvent.VK_RIGHT:
25. worm.changeDirection(Worm.DIRECTION_RIGHT);
26. creepForFood();
27. break;
28. }
29. }
30. });
31. }
01. /**
02. * 定时器任务, 用于驱动舞台上的贪吃虫自动运行
03. */
04. public class CreepTask extends TimerTask {
05. /** 舞台对象的引用 */
06. private WormStage wormStage;
07. /** 创建定时器任务时需要舞台对象的引用 */
08. public CreepTask(WormStage wormStage) {
09. this.wormStage = wormStage;
10. }
11. /** 实现定时任务的执行方法run(), 驱动贪吃虫的运行 */
12. public void run() {
13. wormStage.creepForFood();
14. }
15. }
16.
17. /**
18. * 贪吃虫类型
19. */
20. public class Worm {
21. /** 方向 上 */
22. public static final int DIRECTION_UP = 1;
23. /** 方向 下 */
24. public static final int DIRECTION_DOWN = -1;
25. /** 方向 左 */
26. public static final int DIRECTION_LEFT = 2;
27. /** 方向 右 */
28. public static final int DIRECTION_RIGHT = -2;
29.
30. /** 虫的当前运行方向 */
31. private int currentDirection = DIRECTION_DOWN;
32.
33. /** 节点数组 */
34. private Cell[] cells;
35.
36. public Worm() {
37. //WormStage.WORM_LEN 默认贪吃虫的长度
38. cells = new Cell[WormStage.WORM_LEN];
39. for (int i = 0; i < cells.length; i++) {
40. cells[i] = new Cell(i, 0);
41. }
42. }
43. /**
44. * 检查是否将要撞击头部, 只是检查下一步的情况, 不执行爬行动作
45. * 包括: 撞击边缘, 吃到自己
46. * @param direction 将要运行的方向
47. * @return 如果发生撞击就返回true, 否则返回false
48. */
49. public boolean hit(int direction){
50. // 增加边界判断
51. Cell nextHead = newHead(direction);//临时创建下一个头节点
52. if (nextHead.getX() < 0 || nextHead.getY() < 0
53. || nextHead.getX() >= WormStage.CELL_COLS
54. || nextHead.getY() >= WormStage.CELL_ROWS) {
55. return true;
56. }
57. //扩展部分 判断是否吃到自己
58. if(this.contains(nextHead.getX(), nextHead.getY())){
59. return true;
60. }
61. return false;
62. }
63. /**
64. * 检查当前方向上是否会撞头
65. * @return 如果发生撞击就返回true, 否则返回false
66. */
67. public boolean hit(){
68. return hit(currentDirection);
69. }
70.
71. /** 改变方向 */
72. public boolean changeDirection(int direction) {
73. if (direction + currentDirection != 0) {
74. currentDirection = direction;
75. return true;
76. }
77. return false;
78. }
79.
80. /**
81. * 爬行(creep)方法, 爬行方法: 移除末尾节点, 增加头节点
82. * @param direction 爬行方向
83. */
84. public void creep(int direction) {
85. if (direction + currentDirection != 0) {//方向不能相反
86. //更换方向
87. currentDirection = direction;
88. Cell newHead = newHead(direction);
89. if (newHead != null) {
90. //移除末尾节点
91. for (int i = cells.length - 1; i >= 1; i--) {
92. cells[i] = cells[i - 1];
93. }
94. //插入新头节点
剩余48页未读,继续阅读
资源评论
java界的小趴菜
- 粉丝: 45
- 资源: 19
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功