本帖最后由 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的值也不断发生改变,贪吃蛇的自身移动方向就会发生变化。用代码体现:
- public class mainMap extends JPanel {//在成员变量中定义一个Direction
- private final int width = 20;
- private final int length = 30;
- private final int unit = 20;
- private ArrayList<snakeNode> snake = new ArrayList<>();
- private snakeNode newNode = new snakeNode(0,0,Color.WHITE);
- private int Length;
- private int Direction = 1;
- Timer time = new Timer(1000, new ThingsListener());//定义一个定时器对象,这里我们还要创建一个ThingsListener事件
- }
- ```
- ```
- this.addKeyListener(new KeyAdaper() {
- public void KeyPressed(KeyEvent e) {
- int direction = 0;
- switch(e.getKeyCode()) {
- case KeyEvent.VK_UP:
- direction = 1;
- break;
- case KeyEvent.VK_DOWN:
- direction = -1;
- break;
- case KeyEvent.VK_LEFT:
- direction = 2;
- break;
- case KeyEvent.VK_RIGHT:
- direction = -2;
- break;
- default:
- break;
- }
- if(Direction + direction !=0) {//此处的意义是Direction的方向不能与你的方向相反,你不能掉头
- Direction = direction;//将键盘监控的值传递给Direction,这样贪吃蛇定时向玩家操控的方向移动
- Move(direction);
- }
- }
- });
- }
- ```
- ```
- public class ThingsListener implements ActionListener {
- public void actionPerformed(ActionEvent e) {
- Move(Direction);
- }
- }//这里是自己新建一个事件处理,每隔Timer的时间间隔,就开始移动Directon的位置,由因为Direction的位置是构造方法中定义好的,所以就会自动地移动方向。而每当玩家使用键盘时,Direction的值变化,之后每次自动移动的方向也随之变化。
复制代码
目前为止我们已经完成了绝大多数的代码编写,我们还要再完成一个步骤:贪吃蛇吃东西的功能。贪吃蛇要想吃东西,首先它的第一个元素就必须触碰到随机点,也就是说当贪吃蛇的第一个点与随机点的坐标相同时,就启动吃东西的功能。代码体现:
- public void Move(int direction) {//这是移动蛇身的方法
- int firstX = snake.get(0).getX();
- int firstY = snake.get(0).getY();
- switch(direction) {
- case 1:
- firstY--;
- break;
- case -1:
- firstY++;
- break;
- case 2:
- firstX--;
- break;
- case -2:
- firstX++;
- break;
- default:
- break;
- }
- if(firstX == newNode.getX()&&firstY == newNode.getY()) {//当第一个元素的坐标与随机点的坐标相同时,就启动eat()方法,并且退出Move()方法
- eat();
- return;
- }
- for(int x = 0; x < Length; x++) {
- if(snake.get(x).getX()==firstX&&snake.get(x).getY()==firstY) {
- Dead("不好意思,您碰到自己啦~~~~!!!!");
- }
- }
- if(firstX < 0 || firstX > width - 1 || firstY < 0 || firstY > length -1) {
- Dead("不好意思,您撞墙啦");
- }
- for(int x = Length - 1; x >0; x--) {
- snake.get(x).setX(snake.get(x-1).getX());
- snake.get(x).setY(snake.get(x-1).getY());
- }
- snake.get(0).setX(firstX);
- snake.get(0).setY(firstY);
- }
复制代码
|