C语言实现贪吃蛇游戏演示
本文实例为大家分享了C语言实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下
IDE用的是 VS2019
先看效果
代码全览
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语言实现贪吃蛇游戏演示】相关思路有空再写
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- 孩子不是实现父母欲望的工具——林哈夫
- 一起来学习C语言的字符串转换函数
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- opencv|opencv C++模板匹配的简单实现
- C语言浮点函数中的modf和fmod详解
- Node.js中readline模块实现终端输入