欢迎关注公众号:
在分论(一)讨论了贪吃蛇和随机点的设计,挡在窗体中定义好贪吃蛇和随机点,那么,最关键的问题是如何定义贪吃蛇的移动,以及当碰到随机点以后会发生什么?
贪吃蛇的移动说白了是坐标的变化,如何控制坐标变化呢?有两个关键点需要考虑,方向和速度。第一,移动的控制,即外界通过什么方式来控制贪吃蛇的移动方向,常用的是键盘或者鼠标。第二,贪吃蛇移动的速度,贪吃蛇在键盘控制下,以怎么样的速度来移动。 通过鼠标控制或者键盘控制贪吃蛇的移动,移动方式的时间监听也有两种方式,通过Timer类或者线程类监听,在总论二中介绍两种移动方式,由Timer()类控制速度键盘控制方向的移动方式和多线程控制速度和鼠标控制方向的移动方式.在源代码中我利用的是多线程控制速度和鼠标控制方向的移动方式,不过可以在窗体中加入按钮,用于选择键盘操作或者鼠标操作,这算一个彩蛋吧,后面介绍华容道小游戏就有这个功能,即通过鼠标或者键盘操作的选择,可以参考。
(一)Timer()类控制速度键盘控制方向的移动方式
蛇的移动进行控制 ,键盘上的“上下左右”来控制蛇身的移动变化。 对于整个面板加入监听器事件,对整个面板增加一个键盘监听器,用来监听自己在键盘上的动作。这里我们统一一下,用”↑↓←→”来控制方向。当我们使用键盘捕捉到相应的动作后,该如何继续呢?该如何编写事件的处理?
我们来翻阅一下API。查看API中的KeyListener,我们可以查到KeyEvent,他有静态的常量用来表示键盘上相应的点触。VK_UP代表上箭头,VK_DOWN代表下箭头,VK_LEFT代表左箭头,VK_RIGHT代表右箭头。我们马上可以联想到:通过getKeyCode方法获取到键盘事件,和四个常量进行比较,如果符合,就可以按照对应的方向调用方法,来移动蛇身。我们可以定义一个Move()方法,并且定义一个变量direction代表方向,通过对direction不同的赋值传递给Move(),来对蛇身产生不同的移动效果。接下来贴代码:
采用键盘控制的控制模式,利用键盘的上下左右键,来实现让·direction的变化,从而使贪吃蛇能够按照键盘的控制来实现移动
this.addKeyListener(new KeyAdapter() {//捕捉键盘的按键事件 设置监听器
public void keyPressed(KeyEvent e) {
switch(e.getKeyCode()) {
case KeyEvent.VK_UP://按下向上,返回1
direction = 1;
break;
case KeyEvent.VK_DOWN://按下向下,返回-1
direction = -1;
break;
case KeyEvent.VK_LEFT://按下相左,返回2
direction = 2;
break;
case KeyEvent.VK_RIGHT://按下向右,返回-2
direction = -2;
break;
default:
break;
}
if(direction + Direction !=0) {//不能反向运动
Direction = direction;
Move(direction);
repaint();
}
}
});
在键盘上按钮上下左右键以后,通过键盘监听器获得传入的方向,然后将不同的方向定义为不同的Diretion值,不同的Direction值反映不同的坐标值的变化,按照不同的方向移动的过程中,需要考虑的问题有:撞到随机点,撞到墙,撞到自己,贪吃蛇不断移动的定义方式 。
当输入不同的方向时,需要贪吃蛇蛇头的坐标,蛇头方向的变化就是贪吃蛇移动方向的变化,向上,向下,向左,向右,每一个方向的移动过程中x y值坐标的变化不同,
int FirstX = snake.get(0).getX(); //获取蛇第一个点的横坐标
int FirstY = snake.get(0).getY(); //获取蛇第一个点的纵坐标
if(!startFlag)
return ;
//方向控制
switch(direction) {