C语言实现贪吃蛇游戏演示
作者:Lucinhu 发布时间:2023-07-03 14:16:43
标签: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;
}
}
}
相关思路有空再写。
来源:https://blog.csdn.net/weixin_44684288/article/details/120588218


猜你喜欢
- 前言偶然逛国外博客,看到了一个介绍文字动画的库,进入 pub 一看,立马就爱上这个动画库了,几乎你能想到的文字动画效果它都有!现在正式给大家
- 单链表:insertFirst:在表头插入一个新的链接点,时间复杂度为O(1)deleteFirst:删除表头的链接点,时间复杂度为O(1)
- 反射反射定义对象可以通过反射获取他的类,类可以通过反射拿到所有⽅法(包括私有) 通过java语言中的反射机制可以操作字节码文件,可以读和修改
- 双保险线程,每次启动2个相同的线程,互相检测,避免线程死锁造成影响。两个线程都运行,但只有一个线程执行业务,但都会检测对方的时间戳 如果时间
- Windows系统启动Java程序会弹出黑窗口。黑窗口有几点不好。首先它不美观;其次容易误点导致程序关闭;但最让我匪夷所思的是:将鼠标光标选
- 本文实例汇总了C#常用GDI+文字操作,包含了文字的投影、倒影、旋转等常见的效果,在进行C#应用程序开发中有不错的实用价值。分享给大家供大家
- DataSet 对象是支持 ADO.NET的断开式、分布式数据方案的核心对象 ,用途非常广泛.我们很多时候需要使用其中的数据,比如取得一个D
- 本文实例讲述了android开发之listView组件用法。分享给大家供大家参考,具体如下:关于Android ListView组件中and
- 上篇文章给大家介绍了浅析C# 中的类型系统(值类型和引用类型),接下来通过本文给大家介绍下c# 泛型类型,说下C#中的泛型,熟练地使用泛型能
- 本文实例讲述了Java实现的Base64加密算法。分享给大家供大家参考,具体如下:一 算法实现1、JDK2、Commonc Codec3、B
- 一、TestNG介绍TestNG是Java中的一个测试框架, 类似于JUnit 和NUnit, 功能都差不多, 只是功能更加强大,使用也更方
- import java.io.BufferedReader;import java.io.InputStreamReader;import
- 1. 函数式接口的理解根据重构的思想,需要把容易变化的模块进行抽象并封装起来,从这个点来看,Java8新引入的函数式接口就是基于这个思想进行
- 1.定义字符串字符串常见的构造方式如下:String s1 = "with";String s2 = new Strin
- 这里给大家带来的是动态webservice调用接口并读取解析返回结果的具体示例,非常的简单,注释也很详细,小伙伴们可以参考下。using S
- 本文实例为大家分享了java实现简单的图书管理系统的具体代码,供大家参考,具体内容如下一、项目分布Book类: 定义了书的一些属性(书名,作
- PrintStream 介绍PrintStream 是打印输出流,它继承于FilterOutputStream。PrintStream 是用
- MyBatisMyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC
- Feign的作用是将Http请求抽象化为一个Interface客户端,可以调用接口的形式来执行Http请求,以达到简化Http调用的目的。F
- 在很多场景中我们需要验证时间日期的是否属于正确的格式,验证时间是否符合常规的。1、验证 yyyy-MM-dd HH:mm:dd 格式的日期S