选择方向;
如果方向向上,数组的点集的位置整体前移一位;
/*蛇身第一个节点,它的位置是蛇头的位置,应该单独赋值;*/
利用convertPos(&head,head.xx,head.yy-1)函数对蛇头赋值;
……
}
convertPos()函数实现了坐标的转换。由于是引用传值,会改变对象。这个函数传入的参数是二文表坐标信息,在函数中会根据二文表信息,对相应屏幕坐标信息赋值并保存,这样的好处在于,在游戏代码中可以直接对二文表坐标进行操作,移动只需要加一或者减一,不用考虑实际的图片位置的移动,函数已经把两个坐标对应,不需要在进行其他计算。
void CSnake::convertPos(struct dataSnake *data, int x_pos, int y_pos)
{
二文表坐标的赋值;
将二文表坐标转化为相应的屏幕坐标;
}
(3)蛇的增长:蛇的增长根据蛇的存储方式不同,也有不同的方法。动态分配空间方式可以按照需求分配实际大小空间,可以节约空间。但是在蛇身增长的时候需要对增长的部分重新分配,增加了实现的复杂度。如果用静态分配空间的方式,在程序的实现上要简单的多。不足之处在于分配的空间是固定的,也就是说的蛇的长度有一个限制。蛇的增长需要特别对蛇身的第一个节点进行处理,蛇在增长过程中蛇身第一个节点的位置是蛇头前一时刻的位置,因此要对其单独处理,而其他节点可以通过对蛇身数组的整体移动进行赋值。
(4)游戏结束判定:当蛇头触及墙壁或者蛇身的时候游戏结束,游戏的结束于蛇头的位置先关,所以把游戏结束的判定作为CSnake对象的一个方法。对于游戏结束的判定,要借助于BackGround类中Table结构体。BackGround类把整个屏幕绘制成一张大表格,存储了所有游戏中相关的信息,包括蛇本身。游戏输赢判定,即蛇头下一时刻的位置判定。如果蛇头下一时刻的位置在墙上或者在蛇身上,游戏结束。对于位置的判定,首先要把蛇头的实际坐标转化为表格坐标(表格是一个二位数组,在BackGround类中在详细介绍)。坐标转化过后,检测蛇头下个位置的状态,如果该位置为虫子或者墙就判定游戏结束,结束游戏,并返回一个游戏结束的值。通知应用程序游戏结束,等待其他操作。
在游戏判断时,经过坐标转化,蛇的位置信息和桌面二文表下标一一对应,判断蛇是否触及墙壁只需要判断蛇头所对应下标是否在二文表下标之外。在程序设计中之所以判断蛇头坐标是因为蛇身下一时刻位置是当前蛇头的位置,当且仅当蛇头触及墙壁的时候,游戏才会结束。只需要判断蛇头的位置所对应的下标在不在二文表所对应下标范围内,如果在则游戏没结束,不在则游戏结束。
算法总体流程如下。
bool CSnake::GameOver() //如果蛇头触碰墙壁则游戏结束
{
如果蛇头坐标在在二文表坐标范围内,函数返回真;
否则返回假;
}
bool CSnake::headTouchBody()//如果蛇头触碰蛇身则游戏结束
{
循环比较蛇头的位置和蛇身每个点的位置,一旦有位置相同函数返回真;
否则返回假;
}
(5)蛇的显示:游戏中蛇的显示是把位图打印到屏幕上。在显示位图的时候如果直接打印到屏幕,会在蛇的周围产生一个白色框架。这是需要进行透明处理。 VC++贪食蛇游戏的实现(3):http://www.751com.cn/jisuanji/lunwen_1708.html