zoukankan      html  css  js  c++  java
  • 【C语言项目】贪吃蛇游戏(下)

    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 游戏失败界面边框设计

    游戏边框失败界面分析

    参考源代码

    //游戏失败界面边框
    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 撞墙失败界面

    显示效果如下:

    界面分析

    参考代码:

    //结束游戏
    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 咬到蛇身失败界面

    显示效果如下:

    在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结束游戏界面

    显示效果:

    在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 界面添加选择

    显示效果如下:

    界面分析

    代码实现

    //结束游戏
    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++交流群

  • 相关阅读:
    Golang结构体序列化与反序列化时默认值的问题
    Golang在函数中给结构体对象赋值的一个坑
    Go出现panic的场景
    Redis内存使用率增长的一些解决思路
    「转」50个Go新手容易犯的错误
    关系型数据库跨时区查询简介
    Golang中append与copy内置函数介绍
    实践案例1利用低代码开发平台Odoo快速构建律师事务所管理系统
    自助分析工具Power BI的简介和应用
    一个开源免费高颜值的轻量级商业智能BI平台Superset 介绍
  • 原文地址:https://www.cnblogs.com/szitcast/p/11082013.html
Copyright © 2011-2022 走看看