栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言-实现贪吃蛇游戏

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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("得分:%dn", score);
		//printf("food:%d %dn", 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("33c");
}

//输入处理
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;
			}
					
			default:
				break;
			}
		}

		if ((int)time(NULL) - t == 1) {
			//printf("%cn", *pinput);
			//一秒一帧

			break;
		}
		

	}

}

//初始化墙
//'#'墙
//' '空
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;
		}
	}


}

相关思路有空再写......

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/311817.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号