字符游戏-智能蛇(下)

字符游戏-智能蛇(下)


上周的作业是写出字符游戏-贪吃蛇的小程序。在完成这个项目之后,我将理清思路,记录一下我的学习过程。

  • 让蛇动起来
  • 放置奖励的食物
  • 在蛇吃到食物时延长蛇的身体
  • 设置游戏结束的机制

在蛇吃到食物时延长蛇的身体

如何实现这一步呢?我的基本思路是:当蛇头接收的指令是向食物挪动一步并即将要覆盖食物时,蛇的身体先是会完成挪动的动作,随后再接收一次指令,蛇头挪动,蛇头与身体之间的部分填充身体的字符,即蛇身延长。
以下是实现该功能的代码:

 
 
  1. void snakeMove(char control) {
  2. if (map[snakeHeadX][snakeHeadY] != BLANK_CHAR && map[snakeHeadX][snakeHeadY] != FOOD_CHAR) {
  3. // DIED
  4. gameOver();
  5. }
  6. map[snakeHeadX][snakeHeadY] = SNAKE_HEAD_CHAR;
  7. int moved = 0;
  8. // If willBeLonger, then make it longer
  9. if (willBeLonger) {
  10. willBeLonger = 0;
  11. moved = 1;
  12. int i;
  13. // make space
  14. for (i = snakeBodyLen - 1; i > snakeTailIndex; --i) {
  15. snakeBodyX[i + 1] = snakeBodyX[i];
  16. snakeBodyY[i + 1] = snakeBodyY[i];
  17. }
  18. snakeBodyX[snakeTailIndex + 1] = prevSnakeHeadX;
  19. snakeBodyY[snakeTailIndex + 1] = prevSnakeHeadY;
  20. if (snakeTailIndex < 0) snakeTailIndex = 0;
  21. map[prevSnakeHeadX][prevSnakeHeadY] = SNAKE_BODY_CHAR;
  22. snakeBodyLen++;
  23. }
  24. // Check if ate food
  25. if (snakeHeadX == foodX && snakeHeadY == foodY) {
  26. willBeLonger = 1;
  27. spawnFood();
  28. }// Head has already moved, **Move the body**
  29. // if "no body" here or added tail just now, then it needn't move
  30. if (snakeBodyLen <= 0 || moved) return;
  31. map[snakeBodyX[snakeTailIndex]][snakeBodyY[snakeTailIndex]] = BLANK_CHAR;
  32. snakeBodyX[snakeTailIndex] = prevSnakeHeadX;
  33. snakeBodyY[snakeTailIndex] = prevSnakeHeadY;
  34. map[prevSnakeHeadX][prevSnakeHeadY] = SNAKE_BODY_CHAR;
  35. // Move tail index
  36. snakeTailIndex = (snakeTailIndex - 1 + snakeBodyLen) % snakeBodyLen;
  37. }

设置游戏结束的机制

当蛇头撞到蛇的身体,游戏结束;当蛇头撞到墙体,游戏结束。

  
  
  1. if (map[snakeHeadX][snakeHeadY] != BLANK_CHAR && map[snakeHeadX][snakeHeadY] != FOOD_CHAR) {
  2. // DIED
  3. gameOver();
  4. }

当游戏结束时,应显示提示,表示游戏结束。

  
  
  1. void gameOver() {
  2. printf("GAME OVER!!\n");
  3. gameRunning = 0;
  4. }
以上就是贪吃蛇游戏的制作过程。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值