字符游戏-智能蛇(下)
上周的作业是写出字符游戏-贪吃蛇的小程序。在完成这个项目之后,我将理清思路,记录一下我的学习过程。
- 让蛇动起来
- 放置奖励的食物
- 在蛇吃到食物时延长蛇的身体
- 设置游戏结束的机制
在蛇吃到食物时延长蛇的身体
如何实现这一步呢?我的基本思路是:当蛇头接收的指令是向食物挪动一步并即将要覆盖食物时,蛇的身体先是会完成挪动的动作,随后再接收一次指令,蛇头挪动,蛇头与身体之间的部分填充身体的字符,即蛇身延长。
以下是实现该功能的代码:
void snakeMove(char control) {
if (map[snakeHeadX][snakeHeadY] != BLANK_CHAR && map[snakeHeadX][snakeHeadY] != FOOD_CHAR) {
// DIED
gameOver();
}
map[snakeHeadX][snakeHeadY] = SNAKE_HEAD_CHAR;
int moved = 0;
// If willBeLonger, then make it longer
if (willBeLonger) {
willBeLonger = 0;
moved = 1;
int i;
// make space
for (i = snakeBodyLen - 1; i > snakeTailIndex; --i) {
snakeBodyX[i + 1] = snakeBodyX[i];
snakeBodyY[i + 1] = snakeBodyY[i];
}
snakeBodyX[snakeTailIndex + 1] = prevSnakeHeadX;
snakeBodyY[snakeTailIndex + 1] = prevSnakeHeadY;
if (snakeTailIndex < 0) snakeTailIndex = 0;
map[prevSnakeHeadX][prevSnakeHeadY] = SNAKE_BODY_CHAR;
snakeBodyLen++;
}
// Check if ate food
if (snakeHeadX == foodX && snakeHeadY == foodY) {
willBeLonger = 1;
spawnFood();
}// Head has already moved, **Move the body**
// if "no body" here or added tail just now, then it needn't move
if (snakeBodyLen <= 0 || moved) return;
map[snakeBodyX[snakeTailIndex]][snakeBodyY[snakeTailIndex]] = BLANK_CHAR;
snakeBodyX[snakeTailIndex] = prevSnakeHeadX;
snakeBodyY[snakeTailIndex] = prevSnakeHeadY;
map[prevSnakeHeadX][prevSnakeHeadY] = SNAKE_BODY_CHAR;
// Move tail index
snakeTailIndex = (snakeTailIndex - 1 + snakeBodyLen) % snakeBodyLen;
}
设置游戏结束的机制
当蛇头撞到蛇的身体,游戏结束;当蛇头撞到墙体,游戏结束。
if (map[snakeHeadX][snakeHeadY] != BLANK_CHAR && map[snakeHeadX][snakeHeadY] != FOOD_CHAR) {
// DIED
gameOver();
}
当游戏结束时,应显示提示,表示游戏结束。
void gameOver() {
printf("GAME OVER!!\n");
gameRunning = 0;
}
以上就是贪吃蛇游戏的制作过程。