初级贪吃蛇

1.实现蛇的移动。

#include <stdio.h> 
#include <stdlib.h>
#include <time.h>

#define SNAKE_MAX_LENGTH 20
#define SNAKE_HEAD 'H'
#define SNAKE_BODY 'X'
#define VLANK_CELL ' '
#define SNAKE_FOOD '$'
#define WALL_SELL '*'
char map[12][12] = {
  "************",
  "*XXXXH     *",
  "*          *",
  "*          *",
  "*          *",
  "*          *",
  "*          *",
  "*          *",
  "*          *",
  "*          *",
  "************",
};

int snakeX[SNAKE_MAX_LENGTH]={1,2,3,4,5};
int snakeY[SNAKE_MAX_LENGTH]={1,1,1,1,1};
int snakeLength = 5;
int gameRunning=1;

void snakeMove(int snakeX[], int snakeY[]){
int headX= snakeX[snakeLength-1];
    int headY= snakeY[snakeLength-1];
char control=_getch();
    switch (control) {
    case 'w':
        snakeY[snakeLength-1]--;
    break;
            case 'a':
    snakeX[snakeLength-1]--;
        break;
    case 's':
            snakeY[snakeLength-1]++;
        break;
    case 'd':
        snakeX[snakeLength-1]++;
    break;
        default:
        return;
    }
    if (map[snakeY[snakeLength-1]][snakeX[snakeLength-1]] != VLANK_CELL && map[snakeY[snakeLength-1]][snakeX[snakeLength-1]] != SNAKE_FOOD) {
gameOver();}
map[snakeY[snakeLength-1]][snakeX[snakeLength-1]]='H';
map[headY][headX]='X';
map[snakeY[0]][snakeX[0]]=' ';
int i;
for(i=0;i<snakeLength-1;i++){
    snakeY[i]=snakeY[i+1];
    snakeX[i]=snakeX[i+1];
}
snakeY[snakeLength-2]=headY;
snakeX[snakeLength-2]=headX;
output();
} 
void put_money(void);

void output(){
    system("cls");
  int i = 0 ;
  for (i = 0; i < 12; ++i) {
int k;
for(k = 0;k<12;++k){
    printf("%c", map[i][k]);
  }
  printf("\n");

}
}

void gameOver() {
printf("GAME OVER!!\n");
gameRunning = 0;
}

int main()
{
output();
while (gameRunning) {
    snakeMove(snakeX,snakeY);
}
printf("GAME OVER!!\n");
}

这样就基本实现了蛇的移动。

2.吃食物和增长蛇身。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

char BLANK_CHAR      = ' ';
char WALL_CHAR       = '*';
char SNAKE_HEAD_CHAR = 'H';
char SNAKE_BODY_CHAR = 'X';
char FOOD_CHAR       = '$';

char map[12][13] = {
  "************",
  "*          *",
  "*          *",
"*          *",
"*          *",
  "*          *",
  "*          *",
  "*          *",
  "*          *",
  "*          *",
  "*          *",
  "************",
};

int snakeHeadX = 1, snakeHeadY = 1;
int snakeBodyX[100] = {0}, snakeBodyY[100] = {0};
int snakeBodyLen = 0;
int snakeTailIndex = -1;
int willBeLonger = 0;

int foodX = 0, foodY = 0;

int gameRunning = 1;

void printMap() {
  system("cls");
  int i = 0 ;
  for (i = 0; i < 12; ++i) {
    printf("%s\n", map[i]);
      }
}

void spawnFood() {
  // Random food position
          foodX = rand() % 10 + 1;
  foodY = rand() % 10 + 1;
  while (map[foodX][foodY] != BLANK_CHAR) {
    foodX = rand() % 10 + 1;
foodY = rand() % 10 + 1;
  }
      map[foodX][foodY] = FOOD_CHAR;
}

void initGame() {
  // Initialize snake
      snakeHeadX = snakeHeadY = 1;
  map[snakeHeadX][snakeHeadY] = SNAKE_HEAD_CHAR;
  snakeBodyLen = 0;
      gameRunning = 1;
  snakeTailIndex = -1;
  willBeLonger = 0;
  // Initialize food
  spawnFood();
  // Initialize game
  gameRunning = 1;

  printMap();
}

void gameOver() {
system("cls");
printf("GAME OVER!!\n");
gameRunning = 0;
}

void snakeMove(char control) {
      map[snakeHeadX][snakeHeadY] = BLANK_CHAR;
  // record the previous snake head position
  int prevSnakeHeadX = snakeHeadX;
  int prevSnakeHeadY = snakeHeadY;
  switch (control) {
   case 'w':
snakeHeadX--;
break;
   case 'a':
snakeHeadY--;
break;
   case 's':
snakeHeadX++;
break;
   case 'd':
snakeHeadY++;
break;
   default:
return;
  }
          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;
// make space
int i;
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;
}

int main() {
  // Initialize random seed
  srand(time(NULL));

  initGame();

  char control = 0;
  while (gameRunning) {
control=_getch(); // " %c": the space is used to skip blank character, like '\n'
snakeMove(control);
printMap();
}

这样就完成了基本的通过wasd来控制的贪吃蛇游戏了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值