思路:
1.利用整型二维数组保存显示数据,小蛇每移动一次清屏并便利数组做到动态效果。每次移动(清屏)的间隔时间控制了游戏难度,这个时间应不断缩减,直到游戏结束。
2.需要保存小蛇移动的方向,然后写一个函数通过小蛇的移动方向去处理二维数组中的数据,达到移动小蛇的目的。
3.小蛇的移动可分解为两个过程:头部像前方生长一格然后尾部消去一格。如果蛇头吃到食物,尾部无需消去,此时应立即随机生成一个新的食物。
4.游戏开始时小蛇应随机生成在地图某一位置,此时小蛇的默认移动方向也应该是随机的。
5每次移动前应接收玩家由键盘输入的移动方向,如果接收到后,判断合法后将其设为小蛇的默认移动方向,如果玩家未进行任何输入,小蛇应按照默认方向移动。
个人难点:
1.小蛇移动
该函数需要拿到蛇头当时所在的位置坐标和小蛇的移动方向。随后可由蛇头位置往移动方向往前生长一格,即将二维数组中目标移动位置的数据设置为小蛇的数据。消去蛇尾另写一个函数,调用前需先判断是否吃到食物,是否撞到墙壁或者是自身,然后决定是否削去尾部。消去蛇尾需获得蛇尾的位置,所以我们在该函数内加入递归搜索蛇尾的算法:进入函数后先判断此时的位置是否为蛇尾,若不是就将自身位置往后移动一格(将蛇身往后一格的坐标输入给DeleteTail函数,然后继续此过程),直到遇到蛇尾,然后将其消去(置零)。
具体代码实现如下:
int MoveSnake(int trend, int* px, int* py, int data[ROW][COL], int* t)
{
int ret = 1;//默认前进成功
//printf("trend=%d\n", trend);
switch (trend) {
case 1:*py -= 1; break;//向上
case 2:*px -= 1; break;//向左
case 3:*py += 1; break;//向下
case 4:*px += 1; break;//向右
}//找到即将前进的坐标
if (data[*py][*px] == 6) {
data[*py][*px] = trend;
CreatFood(data);
*t *= 0.9;
}//如果蛇头要前进的格子是食物,向前长一格,尾部不变;
else if (data[*py][*px] == 0) {
data[*py][*px] = trend;//向前长一格
DeleteTail(*px, *py, data);//消去最后的尾巴
}
else {
ret = 0;
printf("前进失败\n");
}//前进失败
return ret;
}
int DeleteTail(int x, int y, int data[ROW][COL])
{
//PrintTest(data);
if (data[y][x] <= 4 && data[y][x] >= 1) {
switch (data[y][x]) {
case 1:
if (DeleteTail(x, y + 1, data) == 0) {
data[y][x] = 0;
}
break;
case 2:
if (DeleteTail(x + 1, y, data) == 0) {
data[y][x] = 0;
}
break;
case 3:
if (DeleteTail(x, y - 1, data) == 0) {
data[y][x] = 0;
}
break;
case 4:
if (DeleteTail(x - 1, y, data) == 0) {
data[y][x] = 0;
}
break;
}
return 1;
}
else {
return 0;
}