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

作者:Lucinhu 时间:2023-07-03 14:16:43 

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

IDE用的是 VS2019

先看效果

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

代码全览

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

}

相关思路有空再写。

来源:https://blog.csdn.net/weixin_44684288/article/details/120588218

标签:C语言,贪吃蛇
0
投稿

猜你喜欢

  • 从dubbo zookeeper注册地址提取出zookeeper地址的方法

    2023-04-29 18:51:16
  • Java中LocalDateTime的具体用法

    2023-11-23 14:00:05
  • Java的设计模式编程中迪米特法则的应用示例

    2022-10-29 01:34:35
  • unity实现摄像头跟随

    2021-07-26 12:50:10
  • Spring Cloud Stream消息驱动组件使用方法介绍

    2022-05-30 04:30:52
  • 详解MyBatis多数据源配置(读写分离)

    2023-11-21 20:35:44
  • Javaweb开发环境Myeclipse6.5 JDK1.6 Tomcat6.0 SVN1.8配置教程

    2023-11-15 21:47:05
  • 解决spring mvc 多数据源切换,不支持事务控制的问题

    2022-09-30 03:39:56
  • Java实现多用户注册登录的幸运抽奖

    2023-07-30 11:57:44
  • Java实现选择排序

    2021-06-30 16:53:55
  • Java ArrayDeque使用方法详解

    2022-02-09 08:00:23
  • WPF+SkiaSharp实现自绘投篮小游戏

    2023-09-06 22:59:51
  • Android获取app应用程序大小的方法

    2023-09-18 15:02:18
  • springboot 整合fluent mybatis的过程,看这篇够了

    2022-09-14 01:16:53
  • Android开发实现跟随手指的小球效果示例

    2022-05-31 08:58:10
  • Java 改造ayui表格组件实现多重排序

    2022-05-15 07:34:15
  • Java 高并发的三种实现案例详解

    2023-12-16 10:57:30
  • Spring自动装配Bean实现过程详解

    2023-10-31 18:35:21
  • 详解SpringBoot定时任务说明

    2022-08-11 05:03:11
  • C#数据结构之单链表(LinkList)实例详解

    2021-09-15 21:40:14
  • asp之家 软件编程 m.aspxhome.com