面向对象方法编一个简易的控制台版贪吃蛇(二)

在《 面向对象方法编一个简易的控制台版贪吃蛇(一)》中,我们已经让食物、地图蛇等可以在控制台上显示出来。下面我们应该考虑的问题是:如何通过键盘操作让蛇动起来。只有先把这个问题解决了,你在以后实现诸如吃到食物、碰到墙壁等功能的时候才可以直接拿过来测试。

首先,需要明确的一个问题是。这个操控蛇的方法应该写在哪里?由于我们是对蛇进行操作,因此,我们可以将这个方法写在蛇类(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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值