字符游戏-智能蛇(下)
上周的作业是写出字符游戏-贪吃蛇的小程序。在完成这个项目之后,我将理清思路,记录一下我的学习过程。
- 让蛇动起来
- 放置奖励的食物
- 在蛇吃到食物时延长蛇的身体
- 设置游戏结束的机制
在蛇吃到食物时延长蛇的身体
如何实现这一步呢?我的基本思路是:当蛇头接收的指令是向食物挪动一步并即将要覆盖食物时,蛇的身体先是会完成挪动的动作,随后再接收一次指令,蛇头挪动,蛇头与身体之间的部分填充身体的字符,即蛇身延长。
以下是实现该功能的代码:
void snakeMove(char control) {if (map[snakeHeadX][snakeHeadY] != BLANK_CHAR && map[snakeHeadX][snakeHeadY] != FOOD_CHAR) {// DIEDgameOver();}map[snakeHeadX][snakeHeadY] = SNAKE_HEAD_CHAR;int moved = 0;// If willBeLonger, then make it longerif (willBeLonger) {willBeLonger = 0;moved = 1;int i;// make spacefor (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 foodif (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 moveif (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 indexsnakeTailIndex = (snakeTailIndex - 1 + snakeBodyLen) % snakeBodyLen;}
设置游戏结束的机制
当蛇头撞到蛇的身体,游戏结束;当蛇头撞到墙体,游戏结束。
if (map[snakeHeadX][snakeHeadY] != BLANK_CHAR && map[snakeHeadX][snakeHeadY] != FOOD_CHAR) {// DIEDgameOver();}
当游戏结束时,应显示提示,表示游戏结束。
void gameOver() {printf("GAME OVER!!\n");gameRunning = 0;}
以上就是贪吃蛇游戏的制作过程。
762

被折叠的 条评论
为什么被折叠?



