字符游戏-智能蛇(上)

字符游戏-智能蛇(上)


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

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

让蛇动起来

先设置一下相应的字符表示:

 
 
  1. char BLANK_CHAR = ' ';
  2. char WALL_CHAR = '*';
  3. char SNAKE_HEAD_CHAR = 'H';
  4. char SNAKE_BODY_CHAR = 'X';
  5. char FOOD_CHAR = '$';

在这里,我们用 * 来围成墙体,用 $ 来表示食物,用 H 来表示蛇头,用 X 来表示蛇的身体。

绘出一个方形区域,这是蛇身活动的范围。

 
 
  1. char map[12][13] = {
  2. "************",
  3. "* *",
  4. "* *",
  5. "* *",
  6. "* *",
  7. "* *",
  8. "* *",
  9. "* *",
  10. "* *",
  11. "* *",
  12. "* *",
  13. "************",
  14. };

初始化变量:

 
 
  1. int snakeHeadX = 1, snakeHeadY = 1;
  2. int snakeBodyX[100] = {0}, snakeBodyY[100] = {0};
  3. int snakeBodyLen = 0;
  4. int snakeTailIndex = -1;
  5. int willBeLonger = 0;
  6. int foodX = 0, foodY = 0;
  7. int gameRunning = 1;

编写一个让蛇动起来的函数:

  1. void snakeMove(char control){
  2.  map[snakeHeadX][snakeHeadY]= BLANK_CHAR;
  3.  // record the previous snake head position
  4.  int prevSnakeHeadX= snakeHeadX;
  5.  int prevSnakeHeadY= snakeHeadY;
  6.  switch(control){
  7.   case'w':
  8.     snakeHeadX--;
  9.    break;
  10.   case'a':
  11.     snakeHeadY--;
  12.    break;
  13.   case's':
  14.     snakeHeadX++;
  15.    break;
  16.   case'd':
  17.     snakeHeadY++;
  18.    break;
  19.   default:
  20.    return;
  21.  }
  22.  if(map[snakeHeadX][snakeHeadY]!= BLANK_CHAR&&map[snakeHeadX][snakeHeadY]!= FOOD_CHAR)
  23.  {
  24.     gameOver();
  25.  }


就是说,当输入W时蛇会向上挪动一格,输入A时蛇会向左挪动一格,输入S时蛇会向下挪动一格,输入D时蛇会向右挪动一格。这样,我们就实现了对贪吃蛇行进方向的控制。


放置奖励的食物


因为每次放置食物的地方随机,程序里应当包含stdlib.h头文件。而为了不用每次都设置不同seed,我们可以给程序中添加time.h头文件。
注意,放置食物的地方不可以事蛇的身体,更不能是墙体。
下面是实现该功能的代码:

  
  
  1. void spawnFood() {
  2. // Random food position
  3. foodX = rand() % 10 + 1;
  4. foodY = rand() % 10 + 1;
  5. while (map[foodX][foodY] != BLANK_CHAR) {
  6. foodX = rand() % 10 + 1;
  7. foodY = rand() % 10 + 1;
  8. }
  9. map[foodX][foodY] = FOOD_CHAR;
  10. }
至此,贪吃蛇的前两项功能已经完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值