黑马程序员技术交流社区

标题: 分享游戏心得——贪吃蛇的java代码分析(三) [打印本页]

作者: EnterEn_RllVn    时间: 2016-6-9 18:39
标题: 分享游戏心得——贪吃蛇的java代码分析(三)
本帖最后由 EnterEn_RllVn 于 2016-6-9 18:46 编辑

在上一篇文章中,我们完成了贪吃蛇部分代码的构造。回头审视我们写的代码与思路,会发现我们遗漏了一个重要的地方,那就是:贪吃蛇的自身移动。想必大家都知道,贪吃蛇自身是会自己移动的,并且会跟随你的方向来不断移动。我们需要在代码中来体现这个功能,那么如何体现呢?查阅API,我们发现了一个TIMER类。API中的描述是:在指定时间间隔触发一个或多个ActionEvent,一个实例用法就是动画对象,它将Timer用作绘制其帧 的触发器。Timer的构造方法是Timer(int delay, ActionListner listener)通俗的说就是创建一个每 delay秒触发一次动作的计时器,每隔特定的时间就会触发特定的事件。可以使用start方法启动计时器。

这个Timer类可以完全满足我们的需要。我们只要定义一个Timer类,设置好间隔时间与触发事件就可以了。这里要注意,我们要定义的触发事件是蛇自身的移动,那么肯定要使用到Move类(在第二篇分析中实现),也就是说们还需要传递一个direction,传递一个方向。那么这个方向该如何传递呢?

贪吃蛇自身的移动有规律可循:一开始,朝固定的某个方向移动;随着我们的操控,贪吃蛇的移动也随之发生改变。也就是说,他有一个自有的固定的DIRECTION,之后随着我们的操控Direction也不断发生改变,借此来改变它自身不断移动的方向。用代码来体现,就是在成员变量处定义一个Direction,我们将其初始化为1,这样在Timer的事件触发后,Move()的参数为1,就会不断的向上移动。在键盘的监听事件中,将direction的值赋值给Direction,那么随着我们上下左右的控制,Direction的值也不断发生改变,贪吃蛇的自身移动方向就会发生变化。用代码体现:


  1. public class mainMap extends JPanel {//在成员变量中定义一个Direction
  2.     private final int width = 20;
  3.     private final int length = 30;
  4.     private final int unit = 20;
  5.     private ArrayList<snakeNode> snake = new ArrayList<>();
  6.     private snakeNode newNode = new snakeNode(0,0,Color.WHITE);
  7.     private int Length;
  8.     private int Direction = 1;
  9.     Timer time = new Timer(1000, new ThingsListener());//定义一个定时器对象,这里我们还要创建一个ThingsListener事件
  10.     }
  11. ```

  12. ```
  13. this.addKeyListener(new KeyAdaper() {
  14.         public void KeyPressed(KeyEvent e) {
  15.             int direction = 0;
  16.             switch(e.getKeyCode()) {
  17.                 case KeyEvent.VK_UP:
  18.                     direction = 1;
  19.                     break;
  20.                 case KeyEvent.VK_DOWN:
  21.                     direction = -1;
  22.                     break;
  23.                 case KeyEvent.VK_LEFT:
  24.                     direction = 2;
  25.                     break;
  26.                 case KeyEvent.VK_RIGHT:
  27.                     direction = -2;
  28.                     break;
  29.                 default:
  30.                     break;
  31.                 }
  32.                 if(Direction + direction !=0) {//此处的意义是Direction的方向不能与你的方向相反,你不能掉头
  33.                 Direction = direction;//将键盘监控的值传递给Direction,这样贪吃蛇定时向玩家操控的方向移动
  34.             Move(direction);
  35.             }
  36.             }
  37.         });
  38.     }
  39. ```

  40. ```
  41. public class ThingsListener implements ActionListener {
  42.         public void actionPerformed(ActionEvent e) {
  43.                 Move(Direction);
  44.                 }
  45.         }//这里是自己新建一个事件处理,每隔Timer的时间间隔,就开始移动Directon的位置,由因为Direction的位置是构造方法中定义好的,所以就会自动地移动方向。而每当玩家使用键盘时,Direction的值变化,之后每次自动移动的方向也随之变化。
复制代码

目前为止我们已经完成了绝大多数的代码编写,我们还要再完成一个步骤:贪吃蛇吃东西的功能。贪吃蛇要想吃东西,首先它的第一个元素就必须触碰到随机点,也就是说当贪吃蛇的第一个点与随机点的坐标相同时,就启动吃东西的功能。代码体现:


  1. public void Move(int direction) {//这是移动蛇身的方法
  2.         int firstX = snake.get(0).getX();
  3.         int firstY = snake.get(0).getY();
  4.         switch(direction) {
  5.             case 1:
  6.                 firstY--;
  7.                 break;
  8.             case -1:
  9.                 firstY++;
  10.                 break;
  11.             case 2:
  12.                 firstX--;
  13.                 break;
  14.             case -2:
  15.                 firstX++;
  16.                 break;
  17.             default:
  18.                 break;
  19.             }

  20.                 if(firstX == newNode.getX()&&firstY == newNode.getY()) {//当第一个元素的坐标与随机点的坐标相同时,就启动eat()方法,并且退出Move()方法
  21.                 eat();
  22.                 return;
  23.                 }

  24.         for(int x = 0; x < Length; x++) {
  25.                             if(snake.get(x).getX()==firstX&&snake.get(x).getY()==firstY) {
  26.             Dead("不好意思,您碰到自己啦~~~~!!!!");
  27.             }
  28.         }

  29.         if(firstX < 0 || firstX > width - 1 || firstY < 0 || firstY > length -1) {
  30.         Dead("不好意思,您撞墙啦");
  31.         }
  32.         for(int x = Length - 1; x >0; x--) {
  33.             snake.get(x).setX(snake.get(x-1).getX());
  34.             snake.get(x).setY(snake.get(x-1).getY());
  35.         }
  36.         snake.get(0).setX(firstX);
  37.         snake.get(0).setY(firstY);
  38.         }
复制代码









欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2