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; } } }
相关思路有空再写。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持海外IDC网。
【文章出处:国内服务器】