C语言控制台贪吃蛇

有一些bug没有解决,后续跟新

背景图片和全局变量放在头文件里

#pragma once
#define DEF_SNAKE_LONG 20
char g_strGameBack[20][48] = {"▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n",
							  "▇                                          ▇\n",
							  "▇                                          ▇\n",
							  "▇                                          ▇\n",
							  "▇                                          ▇\n",
							  "▇                                          ▇\n",
							  "▇                                          ▇\n",
							  "▇                                          ▇\n",
							  "▇                                          ▇\n",
							  "▇                                          ▇\n",
							  "▇                                          ▇\n",
							  "▇                                          ▇\n",
							  "▇                                          ▇\n",
							  "▇                                          ▇\n",
							  "▇                                          ▇\n",
							  "▇                                          ▇\n",
							  "▇                                          ▇\n",
							  "▇                                          ▇\n",
							  "▇                                          ▇\n",
							  "▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n" };

// 蛇的方向
enum {to_east = 2, to_west = -2, to_north = -1, to_south = 1};

// 蛇数组
int g_arrSnake[DEF_SNAKE_LONG][3] = { 0 };

// 蛇的方向
int g_nSnakeDir = 1;

// 食物标记
bool g_bIsProFood = true;

// 蛇的长度
int g_nSnakeLen = 2;

// 食物的随机坐标
int g_nrow = 0;
int g_ncol = 0;
int g_nScore = 0;
#include "head.h"
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<Windows.h>
#include<mmstream.h>
#pragma comment(lib,"winmm.lib")


// 显示首页
void FirstPage();
// 播放音乐
void MyPlaySound();
// 停止播放音乐
void MyStopSound();
// 画背景图片
void ShowBackground();
// 为蛇产生一个随机的位置
void SetSnakeRandPos();
// 画蛇
void DrawSnake();
// 蛇移动
void SnakeMove();
// 销毁蛇
void DropSnake();
// 改变蛇方向
void ChangeDir();
// 蛇的死亡判断
bool IsSnakeDie();
// 产生新的食物
void ProduceFood();
// 蛇变长
void SnakeGrowUp();
// 计分
void Score();

int main()
{
	char chInput;
	// 播放音乐
	MyPlaySound();
	// 显示首页
	FirstPage();
	// 为蛇产生一个随机的位置
	SetSnakeRandPos();
	 
	while (1)
	{
		chInput = _getch();
		if (chInput == ' ')
		{
			break;
		}

	}
	// 停止播放
	MyStopSound();
	// 清理屏幕
	system("cls");
	// 为蛇产生一个随机位置
	SetSnakeRandPos();
	ShowBackground();
	// 游戏界面
	while (1)
	{
		system("cls");
		
		// 产生食物
		ProduceFood();
		// 判断蛇与食物关系
		SnakeGrowUp();

		
		// 监听键盘状态
		ChangeDir();
		

		
		// 检测蛇与背景的碰撞
		if (!IsSnakeDie())
		{
			printf("snake die\n");
			break;
		}
		// 蛇动
		SnakeMove();
		// 显示背景
		ShowBackground();
		Score();
		Sleep(1000);	

	}

	

	
	
    return 0;
}

// 显示首页
void FirstPage()
{
	printf("\n\n\n\n");
	printf("\t\t\t  《欢迎进入贪吃蛇世界》\n\n");
	printf("\t\t\t    《按空格键开始游戏》\n");
	printf("\t\t\t《w a s d 控制蛇的方向》\n");
}

// 播放音乐
void MyPlaySound()
{
	PlaySound(L"1.wav", NULL, SND_FILENAME | SND_ASYNC);

}

// 停止播放音乐
void MyStopSound()
{
	PlaySound(NULL, 0, 0);
}

// 显示背景
void ShowBackground()
{
	system("cls");
	for (int i = 0; i < 20; i++)
		printf(g_strGameBack[i]);

}

// 随机产生蛇的初始位置
void SetSnakeRandPos()
{
	int nX = -1;
	int nY = -1;

	// 产生随机数
	srand((unsigned int)time(NULL));  //种种子

	nX = rand() % 19 + 1;
	nY = rand() % 18 + 1;

	g_arrSnake[0][0] = nY;
	g_arrSnake[0][1] = nX*2;
	g_arrSnake[0][2] = to_east;

	g_arrSnake[1][0] = nY;
	g_arrSnake[1][1] = nX*2+ 2;
	g_arrSnake[1][2] = to_east;

	g_arrSnake[2][0] = nY;
	g_arrSnake[2][1] = nX*2 + 4;
	g_arrSnake[2][2] = to_east;

}

// 画蛇
void DrawSnake()
{
	for (int i = 0; g_arrSnake[i][0] != 0; i++)
	{
		// 只复制两个字符(去掉结尾\0)
		strncpy(&g_strGameBack[g_arrSnake[i][0]][g_arrSnake[i][1]],"▇", 2);
		
	}
}

// 蛇移动
void SnakeMove()
{
	// 销毁原来蛇背景
	DropSnake();
	for (int i = DEF_SNAKE_LONG - 1; i >= 1; i--)
	{
		// 过滤掉没有的蛇身
		if (g_arrSnake[i][1] == 0)
			continue;
		g_arrSnake[i][0] = g_arrSnake[i - 1][0];
		g_arrSnake[i][1] = g_arrSnake[i - 1][1];
		g_arrSnake[i][2] = g_arrSnake[i - 1][2];
	}
	// 处理蛇头
	 g_arrSnake[0][2] = g_nSnakeDir;
	// 东西移动
	if (to_west == g_arrSnake[0][2] || to_east == g_arrSnake[0][2])
		g_arrSnake[0][1] += g_arrSnake[0][2];
	// 南北移动
	else
		g_arrSnake[0][0] += g_arrSnake[0][2];
	
	// 画蛇
	DrawSnake();
}

// 销毁蛇
void DropSnake()
{
	for (int i = 0; g_arrSnake[i][0] != 0; i++)
	{
		// 只复制两个字符(去掉结尾\0)
		strncpy(&g_strGameBack[g_arrSnake[i][0]][g_arrSnake[i][1]], "  ", 2);

	}
}

void ChangeDir()
{
	// 监听键盘输入
	if (GetAsyncKeyState('W') && g_arrSnake[0][2]!=to_south)
	{
		g_nSnakeDir = to_north;
	}
	else if (GetAsyncKeyState('S') && g_arrSnake[0][2]!= to_north)
	{
		g_nSnakeDir = to_south;
	}
	else if (GetAsyncKeyState('A') && g_arrSnake[0][2]!=to_east)
	{
		g_nSnakeDir = to_west;
	}
	else if (GetAsyncKeyState('D') && g_arrSnake[0][2]!=to_west)
	{
		g_nSnakeDir = to_east;
	}
}

bool IsSnakeDie()
{
	// 判断蛇头下一个位置是否为方块
	if (to_west == g_arrSnake[0][2] || to_east == g_arrSnake[0][2])
	{
		if (strncmp(&g_strGameBack[g_arrSnake[0][0]][g_arrSnake[0][1] + g_arrSnake[0][2]], "▇", 2) == 0)
			return false;
	}
	else
	{
		if (strncmp(&g_strGameBack[g_arrSnake[0][0] + g_arrSnake[0][2]][g_arrSnake[0][1]], "▇", 2) == 0)
			return false;
	}
	return true;
}

// 产生新的食物
void ProduceFood()
{
	
	srand((unsigned)time(NULL));
	if (!g_bIsProFood)
		return;
	while (1)
	{
		g_nrow = rand() % 18 + 1;
		g_ncol = rand() % 20 + 1;
		bool flag = true;
		for (int i = 0; g_arrSnake[i][0] != 0; i++)
		{
			if (g_nrow == g_arrSnake[i][0] && g_ncol == g_arrSnake[i][1])
			{
				flag = false;
			}
		}
		if (flag)
			break;
	}
	strncpy(&g_strGameBack[g_nrow][g_ncol], "★", 2);
	g_bIsProFood = false;
	
}

void SnakeGrowUp()
{
	// 蛇头坐标跟食物坐标是否相等
	if (g_nrow == g_arrSnake[0][0] &&  g_ncol*2 == g_arrSnake[0][1])
	{
		
		// 判断尾巴的方向
		if (to_east == g_arrSnake[g_nSnakeLen][2])
		{
			g_arrSnake[g_nSnakeLen + 1][0] = g_arrSnake[g_nSnakeLen][0];
			g_arrSnake[g_nSnakeLen + 1][1] = g_arrSnake[g_nSnakeLen][1] - 2;
			g_arrSnake[g_nSnakeLen + 1][2] = g_arrSnake[g_nSnakeLen][2];
		}
		if (to_west == g_arrSnake[g_nSnakeLen][2])
		{
			g_arrSnake[g_nSnakeLen + 1][0] = g_arrSnake[g_nSnakeLen][0];
			g_arrSnake[g_nSnakeLen + 1][1] = g_arrSnake[g_nSnakeLen][1] + 2;
			g_arrSnake[g_nSnakeLen + 1][2] = g_arrSnake[g_nSnakeLen][2];
		}
		if (to_north == g_arrSnake[g_nSnakeLen][2])
		{
			g_arrSnake[g_nSnakeLen + 1][0] = g_arrSnake[g_nSnakeLen][0] + 1;
			g_arrSnake[g_nSnakeLen + 1][1] = g_arrSnake[g_nSnakeLen][1];
			g_arrSnake[g_nSnakeLen + 1][2] = g_arrSnake[g_nSnakeLen][2];
		}
		if (to_south == g_arrSnake[g_nSnakeLen][2])
		{
			g_arrSnake[g_nSnakeLen + 1][0] = g_arrSnake[g_nSnakeLen][0] - 1;
			g_arrSnake[g_nSnakeLen + 1][1] = g_arrSnake[g_nSnakeLen][1];
			g_arrSnake[g_nSnakeLen + 1][2] = g_arrSnake[g_nSnakeLen][2];
		}
		g_bIsProFood = true;
		g_nSnakeLen++;
		g_nScore++;
	}
}

void Score()
{
	COORD rd;
	rd.X = 55;
	rd.Y = 8;
	// 设置光标位置
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), rd);
	// 打印
	printf("分数");
	rd.X = 55;
	rd.Y = 9;
	// 设置光标位置
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), rd);
	printf("%d", g_nScore);

}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值