千家信息网

如何用C语言实现贪吃蛇游戏

发表于:2024-10-06 作者:千家信息网编辑
千家信息网最后更新 2024年10月06日,这篇文章主要介绍"如何用C语言实现贪吃蛇游戏",在日常操作中,相信很多人在如何用C语言实现贪吃蛇游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"如何用C语言实现贪吃蛇
千家信息网最后更新 2024年10月06日如何用C语言实现贪吃蛇游戏

这篇文章主要介绍"如何用C语言实现贪吃蛇游戏",在日常操作中,相信很多人在如何用C语言实现贪吃蛇游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"如何用C语言实现贪吃蛇游戏"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

代码全览

game.h

#pragma once#define  _CRT_SECURE_NO_WARNINGS 1#include #include #include #include #define PLATFORM 1 //运行的系统 1为win 0为linux #define MAPWIDTH 15 //地图宽度,包括墙#define MAPHEIGHT 15  //地图高度,包括墙#define SNAKELENGTH (MAPHEIGHT - 2) * (MAPWIDTH - 2) //结构体声明struct Body{ int isExist; int x; int y;};  struct Food { int x; int y;};  void game(); void initWall(char wall[MAPHEIGHT][MAPWIDTH], int mapWidth, int mapHeight);void displayMap(int mapWidth, int mapHeight, struct Body snake[], int snakelength, struct Food food);void clearScreen();void inputProcess(char* pinput);void initSnake(struct Body snake[SNAKELENGTH], int length);void generateFood(struct Food* food, struct Body snake[]);int isWall(int x, int y);int isSnake(int x, int y, struct Body snake[], int lengh);void control(char input, struct Body snake[]);void generateFood(struct Food* food, struct Body snake[]);int isFood(int x, int y, struct Food* food);int isEat(struct Body snake[], struct Food* pfood);void bodyMove(struct Body snake[], int* bodyLength);int isInBody(struct Body snake[], int lengh);

GameStart.c

#include "game.h" void displayMenu() {  printf("########################\n"); printf("###### 贪吃蛇游戏 #######\n"); printf("########################\n"); printf("------------------------\n"); printf("       1.开始游戏        \n"); printf("       0.退出游戏        \n"); printf("------------------------\n"); printf("请输入选项:>");  char ch; scanf("%c", &ch); getchar(); switch (ch) { case '1': {  game();  break; } case '0': {  exit(0);  break; } default:  printf("输入错误,请重新输入:>");  break; }   } int main(void) { while (1) {  clearScreen();  displayMenu();   clearScreen();   }  return 0;}

game.c

#define  _CRT_SECURE_NO_WARNINGS 1#include "game.h"//游戏逻辑void game() {  //分数 int score = 0;  //游戏状态 0为胜利 1为咬到蛇身 2为撞到墙上  int gameState = 0;  //输入状态 char input = 0; //墙 char wall[MAPHEIGHT][MAPWIDTH]; //创建蛇结构体数组 struct Body snake[SNAKELENGTH];  //创建食物结构体 struct Food food = { 5,5 };   //初始化蛇 initSnake(snake, SNAKELENGTH);  //初始化墙 initWall(wall, MAPWIDTH, MAPHEIGHT);  //生成食物 generateFood(&food, snake);  while (1) {   //清屏  clearScreen();    control(input, snake);  //显示地图  displayMap(MAPWIDTH, MAPHEIGHT, snake, SNAKELENGTH, food);  printf("得分:%d\n", score);  //printf("food:%d %d\n", food.x, food.y);  //printf("snake:%d %d", snake[0].x, snake[0].y);  //处理输入  inputProcess(&input);   //撞到蛇身,游戏失败  if (isInBody(snake, SNAKELENGTH)) {   gameState = 1;   break;  }  //撞到墙上,游戏失败  if (isWall(snake[0].x, snake[0].y)) {   gameState = 2;   break;  }   //吃到食物加分,蛇身加一  if (isEat(snake, &food)) {   score++;   snake[score].isExist = 1;   snake[score].x = snake[score - 1].x;   snake[score].y = snake[score - 1].y;    if (score == SNAKELENGTH - 1) {    //游戏胜利    gameState = 0;    break;   }    generateFood(&food, snake);  }   //蛇身移动  bodyMove(snake, &score);  }  //胜负显示 switch (gameState) {  case 1: {  printf("咬到蛇身,游戏结束!\n");   break; } case 2: {  printf("撞到墙上,游戏结束!\n");  break; } case 0: {  printf("游戏胜利!\n");  break; } default:   break; } printf("按回车键退出"); getchar(); } //清除屏幕void clearScreen() { if (PLATFORM) {  system("cls"); } else {  system("clear"); }   printf("\033c");} //输入处理void inputProcess(char* pinput) { int t = (int)time(NULL); while (1) {  if (_kbhit()) {   switch (getch())   {   case 'w': {    if (*pinput != 's') {     *pinput = 'w';    }     break;   }   case 's':   {    if (*pinput != 'w') {     *pinput = 's';     }     break;   }   case 'a': {    if (*pinput != 'd') {     *pinput = 'a';    }     break;   }   case 'd': {    if (*pinput != 'a') {     *pinput = 'd';    }    break;   }     /* case ' ': {       *pinput = ' ';       break;      }*/   default:    break;   }  }   if ((int)time(NULL) - t == 1) {   //printf("%c\n", *pinput);   //一秒一帧    break;  }  /*if (*pinput == ' ') {   continue;  }*/  } } //初始化墙//'#'墙//' '空void initWall(char wall[MAPHEIGHT][MAPWIDTH], int mapWidth, int mapHeight) {   for (int i = 0; i < mapHeight; i++) {   for (int j = 0; j < mapWidth; j++) {   if (i == 0 || i == mapHeight - 1) {    wall[i][j] = '#';   }   else if (j == 0 || j == MAPWIDTH - 1) {    wall[i][j] = '#';   }   else {    wall[i][j] = ' ';   }   } }}  //初始化蛇状态,位置void initSnake(struct Body snake[SNAKELENGTH], int length) {  for (int i = 0; i < length; i++) {   if (i == 0)  {    snake[i].x = MAPWIDTH / 2;   snake[i].y = MAPHEIGHT / 2;//蛇出生位置,即蛇头初始位置   snake[i].isExist = 1;   }  else {   snake[i].isExist = 0;   snake[i].x = 0;   snake[i].y = 0;  }   }  } //生成食物void generateFood(struct Food* food, struct Body snake[]) { int x; int y; srand((unsigned int)time(NULL)); do {   x = (rand() % MAPHEIGHT) + 1;  y = (rand() % MAPWIDTH) + 1; } while (isSnake(x, y, snake, SNAKELENGTH) || isWall(x, y));  (*food).y = y; (*food).x = x;} //判断是否是墙int isWall(int x, int y) { if (y <= 1 || y >= MAPHEIGHT || x <= 1 || x >= MAPWIDTH) {  return 1; } return 0;}  //判断是否是蛇int isSnake(int x, int y, struct Body snake[], int lengh) { for (int i = 0; i < lengh; i++) {  if (snake[i].isExist == 1 && snake[i].x == x && snake[i].y == y) {   return 1;  }  } return 0;} //判断是否撞到蛇身int isInBody(struct Body snake[], int lengh) { for (int i = 1; i < lengh; i++) {  if (snake[i].isExist == 1 && snake[i].x == snake[0].x && snake[i].y == snake[0].y) {   return 1;  } } return 0;} //判断是否是食物int isFood(int x, int y, struct Food* food) { if ((*food).x == x && (*food).y == y) {  return 1; } return 0;} //显示游戏地图void displayMap(int mapWidth, int mapHeight, struct Body snake[], int snakelength, struct Food food) { int x; int y;   for (int i = 0; i < mapHeight; i++) {  y = i + 1;  for (int j = 0; j < mapWidth; j++) {   x = j + 1;   if (isWall(x, y)) {    printf("# ");   }   else if (isSnake(x, y, snake, snakelength)) {    if (snake[0].x == x && snake[0].y == y) {     printf("@ ");//蛇头    }    else {     printf("* ");//蛇身    }    }   else if (isFood(x, y, &food)) {    printf("+ ");   }   else {    printf("  ");   }    }  printf("\n"); }  } //方向控制void control(char input, struct Body snake[]) { switch (input) { case 'w': {  snake[0].y -= 1;  break; } case 'a': {  snake[0].x -= 1;  break; } case 's': {  snake[0].y += 1;  break; } case 'd': {  snake[0].x += 1;  break; } }} //判断是否吃到食物int isEat(struct Body snake[], struct Food* pfood) { if (isFood(snake[0].x, snake[0].y, pfood)) {  return 1; } return 0;} //移动蛇身void bodyMove(struct Body snake[], int* bodyLength) { if (*bodyLength) {   for (int i = *bodyLength; i >= 1; i--) {    snake[i].x = snake[i - 1].x;   snake[i].y = snake[i - 1].y;  } }  }

到此,关于"如何用C语言实现贪吃蛇游戏"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0