00. 目录

07. 游戏逻辑

7.5 按下ESC键结束游戏

在moveKeyControl函数中添加如下代码片段

		//按下F2减速
		if (GetAsyncKeyState(VK_F2))
		{
			speedDown();
		}

		//按下ESC键 结束游戏
		if (GetAsyncKeyState(VK_ESCAPE))
		{
			endStatus = 3;

			break;
		}

7.6 判断是否撞到墙

参考代码:

//判断是否撞墙
int isHitWall(void)
{
	if (head->x == 0 || head->x == 56 || head->y == 0 || head->y == 26)
	{
		return 1;
	}
}

在snake.c文件moveKeyControl函数中添加如下代码

		Sleep(sleepTime);

		moveSnake();

		//判断是否撞墙
		if (isHitWall())
		{
			endStatus = 1;

			break;
		}

7.7 判断是否咬到自己

判断是否咬到自己

//判断是否咬到自己
int isBitSelf(void)
{
	snake_t *tmp = NULL;

	tmp = head->next;
	while (NULL != tmp)
	{
		if (tmp->x == head->x && tmp->y == head->y)
		{
			return 1;
		}
		
		tmp = tmp->next;
	}

	return 0;
}

在snake.c文件moveKeyControl函数中添加如下代码

		//判断是否撞墙
		if (isHitWall())
		{
			endStatus = 1;

			break;
		}

		//判断是否咬到自己
		if (isBitSelf())
		{
			endStatus = 2;

			break;
		}

08. 游戏失败界面设计

8.1 游戏失败界面边框设计

【C语言项目】贪吃蛇游戏(下)_C语言贪吃蛇

游戏边框失败界面分析

【C语言项目】贪吃蛇游戏(下)_贪吃蛇_02

参考源代码

//游戏失败界面边框
void failGameUi(void)
{
	int i;

	system("cls");

	//显示游戏失败提示
	setColor(12);
	gotoXY(44, 3);
	printf("游 戏 失 败!!!");

	setColor(11);
	gotoXY(17, 5);

	//绘制上边框
	printf("+----------------------------------------------------------------+");

	//绘制下边框
	gotoXY(17, 20);
	printf("+----------------------------------------------------------------+");

	//绘制左右边框
	for (i = 6; i < 20; i++)
	{
		gotoXY(17, i);
		printf("|");

		gotoXY(82, i);
		printf("|");
	}
}

在moveKeyControl函数中按下ESC选项中添加如下代码

		//按下ESC键 结束游戏
		if (GetAsyncKeyState(VK_ESCAPE))
		{
			endStatus = 3;
			failGameUi();
			break;
		}

8.2 撞墙失败界面

显示效果如下:

【C语言项目】贪吃蛇游戏(下)_C语言_03

界面分析

【C语言项目】贪吃蛇游戏(下)_C贪吃蛇_04

参考代码:

//结束游戏
int endGame(void)
{
	int n;
	int highScore;

	//显示游戏失败边框
	failGameUi();

	setColor(12);

	//根据不同的状态显示不同的失败提示
	switch (endStatus)
	{
		//撞到墙
	case 1:
		gotoXY(38, 9);
		printf("您撞到墙了,游戏结束!!!");
		break;

		//咬到自己
	case 2:
		break;

		//用户按下ESC退出
	case 3:
		break;

	default:
		;
	}

	//显示您的得分
	gotoXY(43, 12);
	setColor(13);
	printf("您的得分: %d", score);


	//从文件中读取最高分
	highScore = readFile();

	if (score > highScore)
	{
		setColor(10);
		gotoXY(38, 16);
		printf("恭喜你, 你已经创记录了,");
		//写文件
		//writeFile(score);
	}
	else
	{
		setColor(10);
		gotoXY(38, 16);
		printf("加油哦,离最高分还差%d分", highScore - score);
	}

    
    return 0;
}

8.3 咬到蛇身失败界面

显示效果如下:

【C语言项目】贪吃蛇游戏(下)_C贪吃蛇_05

在endGame函数中修改代码如下

//结束游戏
int endGame(void)
{
	int n;
	int highScore;

	//显示游戏失败边框
	failGameUi();

	setColor(12);
	gotoXY(38, 9);

	//根据不同的状态显示不同的失败提示
	switch (endStatus)
	{
		//撞到墙
	case 1:
		printf("您撞到墙了,游戏结束!!!");
		break;

		//咬到自己
	case 2:
		printf("您咬到蛇身了,游戏结束!");
		break;

		//用户按下ESC退出
	case 3:
		break;

	default:
		;
	}

	//显示您的得分
	gotoXY(43, 12);
	setColor(13);
	printf("您的得分: %d", score);


	//从文件中读取最高分
	highScore = readFile();

	if (score > highScore)
	{
		setColor(10);
		gotoXY(38, 16);
		printf("恭喜你, 你已经创记录了,");
		//写文件
		//writeFile(score);
	}
	else
	{
		setColor(10);
		gotoXY(38, 16);
		printf("加油哦,离最高分还差%d分", highScore - score);
	}

    return 0;
}

8.4 ESC结束游戏界面

显示效果:

【C语言项目】贪吃蛇游戏(下)_贪吃蛇_06

在endGame函数中修改代码如下

//结束游戏
int endGame(void)
{
	int n;
	int highScore;

	//显示游戏失败边框
	failGameUi();

	setColor(12);
	gotoXY(38, 9);

	//根据不同的状态显示不同的失败提示
	switch (endStatus)
	{
		//撞到墙
	case 1:
		printf("您撞到墙了,游戏结束!!!");
		break;

		//咬到自己
	case 2:
		printf("您咬到蛇身了,游戏结束!");
		break;

		//用户按下ESC退出
	case 3:
		printf("您已经结束了游戏,游戏结束");
		break;

	default:
		;
	}

	//显示您的得分
	gotoXY(43, 12);
	setColor(13);
	printf("您的得分: %d", score);


	//从文件中读取最高分
	highScore = readFile();

	if (score > highScore)
	{
		setColor(10);
		gotoXY(38, 16);
		printf("恭喜你, 你已经创记录了,");
		//写文件
		//writeFile(score);
	}
	else
	{
		setColor(10);
		gotoXY(38, 16);
		printf("加油哦,离最高分还差%d分", highScore - score);
	}

	return 0;
}

8.5 界面添加选择

显示效果如下:

【C语言项目】贪吃蛇游戏(下)_C语言_07

界面分析

【C语言项目】贪吃蛇游戏(下)_C语言贪吃蛇_08

代码实现

//结束游戏
int endGame(void)
{
	int n;
	int highScore;

	while (1)
	{
		//显示游戏失败边框
		failGameUi();

		setColor(12);
		gotoXY(38, 9);

		//根据不同的状态显示不同的失败提示
		switch (endStatus)
		{
			//撞到墙
		case 1:
			printf("您撞到墙了,游戏结束!!!");
			break;

			//咬到自己
		case 2:
			printf("您咬到蛇身了,游戏结束!");
			break;

			//用户按下ESC退出
		case 3:
			printf("您已经结束了游戏,游戏结束");
			break;

		default:
			;
		}

		//显示您的得分
		gotoXY(43, 12);
		setColor(13);
		printf("您的得分: %d", score);


		//从文件中读取最高分
		highScore = readFile();

		if (score > highScore)
		{
			setColor(10);
			gotoXY(38, 16);
			printf("恭喜你, 你已经创记录了,");
			//写文件
			//writeFile(score);
		}
		else
		{
			setColor(10);
			gotoXY(38, 16);
			printf("加油哦,离最高分还差%d分", highScore - score);
		}

		//输出用户选择信息
		gotoXY(25, 23);
		setColor(12);
		printf("在玩一局请输入: 1");

		gotoXY(52, 23);
		printf("直接退出请输入:2");

		gotoXY(46, 25);
		setColor(11);
		printf("请选择:");

		scanf("%d", &n);
		getchar();

		if (1 == n)
		{
			score = 0;
			sleepTime = 350;
			add = 1;
			break;
		}
		else if (2 == n)
		{
			exit(0);
		}
		else
		{
			gotoXY(30, 27);
			setColor(12);
			printf("您的输入有误, 请重新输入, 按下任意键继续");
			getchar();
		}
	}
	return 0;
}

8.6 写文件实现

//写文件
int writeFile(int score)
{
	FILE *fp = NULL;

	fp = fopen("save.txt", "w+");

	fprintf(fp, "%d", score);

	fclose(fp);

	return 0;
}

在endGame函数中,如果破纪录了就写文件


		if (score > highScore)
		{
			setColor(10);
			gotoXY(38, 16);
			printf("恭喜你, 你已经创记录了,");
			//写文件
			writeFile(score);
		}

09. 一起来找茬


//销毁蛇
int destroySnake(void)
{
	snake_t *tmp = NULL;
	snake_t *save = NULL;

	tmp = head;
	while (NULL != tmp)
	{
		save = tmp->next;
		free(tmp);
		tmp = save;
	}

	head = NULL;

	return 0;
}

10. 项目扩展

  • 设置关卡

    蛇移动速度

  • 保存每一个用户的得分信息

  • 排名榜

11. 项目总结

基础知识: C语言 数据结构中简单单向链表

大学生C/C++QQ交流群
【C语言项目】贪吃蛇游戏(下)_C语言贪吃蛇_09