C语言实现贪吃蛇游戏演示

本文实例为大家分享了C语言实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下

IDE用的是 VS2019

先看效果

代码全览

game.h

#pragma once
#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>

#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;
  }
 }

}

相关思路有空再写。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言实现简单的贪吃蛇游戏

    本文实例为大家分享了C语言实现简单贪吃蛇游戏的具体代码,供大家参考,具体内容如下 用指针数组来表示蛇,p[0]表示蛇头 控制方向:w,s,a,d-->上下左右 j,k-->加速.减速 键盘控制需要用到线程 编译时需要在后面加     -lpthread 代码: #include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <time.h> #include <uni

  • Linux下C语言实现贪吃蛇小游戏

    本文实例为大家分享了C语言实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 此次贪吃蛇小游戏的目的是使得我在Linux底下使用vi进行编写的 心得: 1.自己对linux中如何使用vi更加熟悉 如::wq yy pp dd u 等等 2.对c语言的指针,结构体,链表等更加的牢固 3.借此小项目也运用到多线程作为进入linux的深入学习打下坚实的基础 代码展示 #include<curses.h> #include<stdlib.h> #define UP 1 //1与-1的目的

  • 用纯C语言实现贪吃蛇游戏

    本文实例为大家分享了C语言实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 在读大学生一枚,五一期间用四天时间写一个小游戏. 本贪吃蛇游戏代码共计531行,开发环境是VS,游戏分为两种模式,标准模式和超大地图模式,详细看以下源代码,并进入游戏体验具体内容. //贪吃蛇 #include<stdio.h> #include<windows.h> #include<time.h> #include<conio.h> //游戏窗口 #define FrameX

  • C语言实现控制台版贪吃蛇游戏

    用c语言写的期末作业:C语言实现控制台版贪吃蛇游戏的具体代码,供大家参考,具体内容如下 /* { conio.h 阻塞式: getch(): 从无回显的控制台获取字符.无缓冲区,只有当按下一个键才会执行后面的程序. 非阻塞式: kbhit() 检测缓冲区中是否有字符:执行该函数后程序不会停下,而是继续执行下面的代码 由于getch()和kbhit()已弃用, 在编译时会产生警告, 可以用_getch()和_kbhit()替换它们, 或者在包含头文件前加上#pragma warning(disab

  • C语言贪吃蛇经典小游戏

    一.贪吃蛇小游戏简介: 用上下左右控制蛇的方向,寻找吃的东西,每吃一口就能得到一定的积分,而且蛇的身子会越吃越长,身子越长玩的难度就越大,不能碰墙,也不能咬到自己的身体,等到了一定的分数,就能过关. 二.函数框架 三.数据结构 typedef struct Snake { size_t x; //行 size_t y; //列 struct Snake* next; }Snake, *pSnake; 定义蛇的结构体,利用单链表来表示蛇,每个结点为蛇身体的一部分. 四.代码实现(vs2010  c

  • C语言实现贪吃蛇游戏

    最近整理下电脑,看到了自己在上个学期打的贪吃蛇游戏的c代码,觉得真的是略微有点冗长,但是实现起来应该也算是比较好理解,于是把自己的代码搬上来,网络上写贪吃蛇的c语言的文章很多,我这篇也仅是给大家作为一个参考而已. 我的代码是在Windows下运行的,因为需要用到windows.h这个库. 然后也做了一个简单的ai模式,这在没有障碍物的情况下前期还是蛮不错的,但是到了后期蛇变长了之后就会有bug了. 好了,直接上代码吧: 1)头文件和宏定义 #include<stdio.h> #include&

  • 贪吃蛇C语言代码实现(难度可选)

    本文实例为大家分享了C语言实现贪吃蛇的具体代码,供大家参考,具体内容如下 /********************************************************* ********************贪吃蛇(难度可选)******************** **************制作者:Xu Lizi 日期:2012/12/31******** ********************部分函数有借鉴************************ ****

  • C语言实现简单的贪吃蛇小游戏

    本文实例为大家分享了C语言实现简单贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 #温馨提示:以下设计在VS2019下完美运行,完整代码附在末尾,供大家学习参考 (1)游戏进入界面(动态读取以及温馨提示) void loading()//动态加载图 { int j; gotoxy(43, 11); printf("Loading..."); gotoxy(39, 13); printf("□□□□□□□□"); gotoxy(39, 13); for (j = 8

  • C语言代码链表实现贪吃蛇游戏

    本文实例为大家分享了C语言链表实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 贪吃蛇设计思路: 屏幕坐标: 拓展功能: 1.F1,F2控制加速减速  空格暂停游戏  Esc退出 2.加速每个食物得分更高 先打印出游戏界面,还有初始化蛇,蛇的节点用字符串★表示,游戏背景用■表示,因为这些字符串占两个字节的宽度,所以每次x,y坐标的对应关系是x=y*2.在相应位置打印出蛇,初始化蛇为五个节点 初始化蛇头的移动方向为右,根据按键来确定蛇的移动状态,要是吃到食物,就让食物为蛇头,然后随机生成食物.

  • 基于C语言实现的贪吃蛇游戏完整实例代码

    本文以实例的形式讲述了基于C语言实现的贪吃蛇游戏代码,这是一个比较常见的游戏,代码备有比较详细的注释,对于读者理解有一定的帮助. 贪吃蛇完整实现代码如下: #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <dos.h> #define NULL 0 #define UP 18432 #define DOWN 20480 #define LEFT 19200 #defi

随机推荐