扫雷游戏C语言代码实现(上)

举报
倔强的石头_ 发表于 2024/12/14 22:56:10 2024/12/14
【摘要】 使⽤控制台实现经典的扫雷游戏 游戏可以通过菜单实现继续玩或者退出游戏 扫雷的棋盘是9*9的格⼦ 默认随机布置10个雷 可以排查雷——通过输入坐标 如果位置不是雷,该坐标就会显示周围的雷的数量 如果位置是雷,就炸死游戏结束 把除10个雷之外的所有非雷坐标都找出来,排雷成功,游戏结束

文章目录

一、问题描述

        游戏说明

二、思路分析

1. 数据结构

mine数组

show数组

2. 文件结构

三、分步实现过程

1. menu函数——游戏菜单

2. main函数的实现框架




一、问题描述

        游戏说明

  1. 使⽤控制台实现经典的扫雷游戏
  2.  游戏可以通过菜单实现继续玩或者退出游戏
  3. 扫雷的棋盘是9*9的格⼦
  4. 默认随机布置10个雷
  5. 可以排查雷——通过输入坐标
  •  如果位置不是雷,该坐标就会显示周围的雷的数量
  • 如果位置是雷,就炸死游戏结束
  • 把除10个雷之外的所有非雷坐标都找出来,排雷成功,游戏结束

二、思路分析

1. 数据结构

通过两个数组来实现,

一个数组用来存储棋盘本身的数据,这个数组暂且称为mine

一个用来对外展示,这个数组暂且称为show

mine数组

我们需要在9*9的棋盘上布置雷的信息和排查雷,所以需要创建⼀个9*9的数组来存放 信息。如果这个位置布置雷,我们就存放1,没有布置雷就存放0.

编辑

但是这个时候也存在一个问题,当我们要排查的坐标处于数组的边缘时,计算周围雷的数量就可能产生越界和出错,为了防止这种行为发生,我们创建一个11*11的数组并初始化,但是实际使用中依然使用9*9的范围

编辑

show数组

在游戏排雷的过程中对外展示,初始界面暂且全部设置为'*',每次排查一个坐标时,就将该位置改为周围一圈雷的数量

至于为什么要创建两个数组来分别存储数据和对外展示,

假设我们排查了某 ⼀个位置后,这个坐标处不是雷,这个坐标的周围有1个雷,那我们需要将排查出的雷的数量信息记录 存储,并打印出来,作为排雷的重要参考信息的。那这个雷的个数信息存放在哪⾥呢?如果存放在布 置雷的数组中,这样雷的信息和雷的个数信息就可能或产⽣混淆和打印上的困难,这个时候就产生了歧义——到底1表示该位置是雷呢,还是说该位置的周围有一个雷的?

所以为了防止这种情况发生,我们将两组数据分开来单独存放



2. 文件结构

通过三个文件来实现(为了方便后期的修改和调试)

这里

我们使用game.h来存放函数的声明 

使用game.c来实现函数完整的定义

使用test.c包含main函数和函数的调用


三、分步实现过程

游戏的框架——主函数的实现

进入程序首先要出现一个菜单以及对游戏的说明,这里我们用一个函数封装来实现,暂且称为

1. menu函数——游戏菜单

游戏菜单说明开始游戏和结束游戏的方式,进入程序的第一步就要展现出来,这里我们把它放在game.c文件,并在game.h文件声明,test.c的main函数中调用,(以下皆同,不再重复)

使用printf函数不要忘记包含stdio.h头文件

为了代码更加简便,我们将所有头文件都放在game.h头文件中,再在主程序test.c中包含game.h头文件

包含自己创建的头文件的方式是 #include"game.h"   放在双引号内部

#include"game.h"
void menu()
{
	printf("*********扫雷游戏***********\n");
	printf("*****输入数字1 开始游戏*****\n");
	printf("*****输入数字0 结束游戏*****\n");
	printf("*********游戏说明***********\n");
	printf("*开始游戏后,输入两位数坐标*\n");
	printf("*并按回车确认您要排雷的位置*\n");
}


接下里是

2. main函数的实现框架

刚刚我们完成了菜单的打印,接下来就要创建一个整型变量来存储用户输入的值,并对此做出反应,这里用一个switch语句来实现——分别在输入1的时候开始游戏,输入0的时候结束游戏,在输入其他值的时候做出 出错提醒

#include"game.h"
int main()
{
	menu();
	int a = 0;
	scanf("%d", &a);
	switch (a)
	{
	case 1:
		//游戏过程
		break;
	case 0:
		printf("结束游戏\n");
		break;
	default:
		printf("输入的值错误,请重新输入\n");

	}
	return 0;
}

关于switch语句这篇文章有更详细的介绍C语言结构语句介绍-CSDN博客


但是如果要想要多次游戏的话,就需要将switch分支语句和menu函数放在一个循环里实现,但是第一次进入程序的时候,我们必须保证能至少进行一次判断,这里使用do while循环就比较合适

而且将输入的值作为循环是否执行的条件恰到好处

#include"game.h"
int main()
{
	int a = 0;
	do
	{
		menu();
		scanf("%d", &a);
		switch (a)
		{
		case 1:
			//游戏过程
			break;
		case 0:
			printf("结束游戏\n");
			break;
		default:
			printf("输入的值错误,请重新输入\n");

		}
	} while (a);
	return 0;
}

来看一下效果

编辑

现在,游戏的整体框架在main函数的部分就已经完成了,接下来我们将游戏过程封装在一个函数game()函数中来实现,来逐步完成细节

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。