在《 面向对象方法编一个简易的控制台版贪吃蛇(一)》中,我们已经让食物、地图蛇等可以在控制台上显示出来。下面我们应该考虑的问题是:如何通过键盘操作让蛇动起来。只有先把这个问题解决了,你在以后实现诸如吃到食物、碰到墙壁等功能的时候才可以直接拿过来测试。
首先,需要明确的一个问题是。这个操控蛇的方法应该写在哪里?由于我们是对蛇进行操作,因此,我们可以将这个方法写在蛇类(Snake)里面。那么,如何捕获按键?我们首先需要一个char类型的变量(char c)。专门用来捕获你所按下的按键。
那么,按什么按键能够实现蛇的上下左右移动呢?我们可以专门定义一个函数(setKey)用来设置你想要的按键,如果你想用WASD来控制的话,你就可以直接调用这个函数来设置。相应的,在蛇类里面也要增加四个变量(keyUp, keyDown, keyLeft, keyRight),代表四个按键,便于在setKey函数里面进行传值操作。
setKey函数声明:
void setKey(int up,int down,int left,int right);
setKey函数定义:
void Snake::setKey(int up, int down, int left, int right)
{
keyUp = up;
keyDown = down;
keyLeft = left;
keyRight = right;
}
设置按键完成之后,如何捕获按键并让蛇在屏幕上动起来?我们需要在蛇类里面专门定义一个函数来实现控制蛇的功能,这个函数我命名为controlSnake;其对应的函数声明和函数定义如下所示:
controlSnake函数声明:
void controlSnake();
controlSnake函数定义:
void Snake::controlSnake()
{
int stateU = (GetAsyncKeyState(keyUp) & 0x8000);
int stateD = (GetAsyncKeyState(keyDown) & 0x8000);
int stateL = (GetAsyncKeyState(keyLeft) & 0x8000);
int stateR = (GetAsyncKeyState(keyRight) & 0x8000);
//当按下指定按键的时候,我们就把char c设置成如下变量。
if (stateU != 0)
{
c = 'u';
}
if (stateD != 0)
{
c = 'd';
}
if (stateL != 0)
{
c = 'l';
}
if (stateR != 0)
{
c = 'r';
}
if (c == 'u' || c == 'd' || c == 'l' || c == 'r') //如果捕获了按键
{
for (int i = m_snake.size() - 1; i > 0; i--)//蛇除去头部的结点依次向前覆盖,以达到走动的效果
{
m_snake.at(i)->x = m_snake.at(i - 1)->x;
m_snake.at(i)->y = m_snake.at(i - 1)->y;
}
switch (c) //对蛇的头部进行操作
{
case 'u'://捕获到向上键的话,蛇头y值减去1,以达到向上走的目的
m_snake.front()->y--;
break;
case 'd':
m