C语言--扫雷游戏(结尾附源码)

一、游戏介绍

扫雷游戏在早年间是一款人尽皆知的电脑游戏,不仅内存小而且具有一定的挑战性,在我的童年时代对这个游戏的理解就是盲猜,即便不会玩也知道这个基本每台电脑必备的游戏,其游戏规则是玩家可以通过点击来翻开方块,如果是雷那么游戏就结束了,反之就会出现一个数字代表了其周围的8个方块中隐藏的雷的数目,通过计算可以排除剩下的安全区,全部排出即获得胜利

二、设计思路

由于是看了教学,所以有相似之处,但是游戏实现是自己构思所以可能不太一样,首先要打印棋盘,这里假设要打印一个9*9的棋盘存放10个雷,设想如果只用一个二维数组来存放雷,那么就不方便单独打印,还需要另外一个数组来存放“雷”,这里我们就用星号来表示,当棋盘打印出来之后还需要输入坐标排雷,然后判断是否是雷,不是雷就计数并打印出来,因此我们就分为三个文件:

  1. main.c//搭建游戏选择界面和游戏框架
  2. game.c//具体的游戏实现
  3. game.h//整个游戏的头文件、函数声明和宏定义
    其中有两个数组:
    mine数组//用于存放设置的雷
    show数组//用于展示棋盘

三、代码实现

剩余的具体介绍老规矩看代码注释,有疑问或者不足之处还请评论区指教,谢谢各位,那么直接上代码

1.主函数&game函数

经典开局,设计很巧妙

int main()
{
	int input=0;
	do
	{
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case 1:game(); break;
		case 0:printf("退出游戏!"); break;
		default:printf("输入有误!请重新输入:");
		}
	} while (input);
	return 0;
}

game函数(游戏框架)

void game()
{
	//雷表示1,空表示0
	int count=1,mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };//展示为*和数字表示周围的雷的数目
	setboard(mine);//随机设置10个雷
	initboard(show);//初始化面板
	for (count = 0;count < ROW * COL - EASY;count++)//循环(总数-雷数)次
	{
		dpyboard(show);//展示面板
		if (findboard(mine,show) == 1)break;//踩雷就返回跳出循环进行判断,否则继续展示
	}
	//判断是否踩雷
	if (count == ROW * COL - EASY)
	{
		printf("恭喜你成功排除%d颗雷!\n ",EASY);
		dpyboard(show);
	}
	else
	{
		printf("\n很遗憾,你被炸死了!\n");//这里可以接一个答案函数
	}
}

2.头文件

这里的头文件如果有疑问可以移步我的猜数字这篇博客有详细介绍

#include<stdio.h>
#include<time.h>//时间函数
#include<stdlib.h>//随机值函数
#define ROW 9
#define COL 9
#define EASY 10
#define ROWS ROW+2
#define COLS COL+2
void menu();//打印菜单
void initboard(char show[ROWS][COLS]);//初始化show函数
void setboard(char mine[ROWS][COLS]);设置随机的雷
void dpyboard(char show[ROWS][COLS]);打印棋盘
int findboard(char mine[ROWS][COLS],char show[ROWS][COLS]);//找雷

3.函数实现

1.设置雷的函数

void setboard(int mine[ROWS][COLS])
{
	int x=0,y=0,count = 0;
	srand((unsigned int)time(NULL));//利用时间戳产生随机值
	//此处也可以设置雷的个数然后count--也很方便,那样就只有一个while循环了
	for (count; count < EASY; count++)//放EASY个雷
	{
		while (1)
		{
			x = rand() % (ROWS - 2) + 1;
			y = rand() % (COLS-2) + 1;
			if (mine[x][y] == 0) 
			{
				mine[x][y] = 1; break;
			}
		}
	}
}

2.初始化雷的函数

void initboard(char show[ROWS][COLS])
{
	int x = 1, y = 1;
	for (x=1; x < ROWS - 1; x++)
		for (y=1; y < COLS - 1; y++)
			show[x][y] = '*';
}

3.打印棋盘的函数

void dpyboard(char show[ROWS][COLS])
{
	int x, y;
	printf("\n");
	for ( y = 0; y < COLS-1; y++)//打印列标
		printf("%d ", y);
		printf("\n");
	for(x=1;x<ROWS-1;x++)
		{
			printf("%d ", x);//打印行标
			for (y=1; y < COLS-1; y++)//打印扫雷布局
			printf("%c ",show[x][y]);
			printf("\n");
		}
}

4.找雷的函数

int findboard(int mine[ROWS][COLS], char show[ROWS][COLS])
{
	int a,b=0,x,y;
	printf("请输入你的坐标:");
	//死循环判断是否输入正确,正确跳出循环
	while(1)
	{
		scanf("%d", &a);
		x = a / 10;
		y = a % 10;
		if (x<1 || x>ROWS - 2 || y<1 || y>COLS - 2)
			printf("输入有误,请重新输入坐标:");
		else if (show[x][y] != '*')printf("重复输入!请重新输入坐标:");
		else break;
	} 
	if (mine[x][y] == 0)//没踩到雷就计算坐标周围雷的个数
	{
		b = mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1];
		show[x][y] = 48 + b; return 0;//48是ASCII表里的字符“1”,方便打印
	}
	else return 1;
}

四、总结

这一次其实代码很快就写好了,因为我吸收第一次写井字棋的经验选择了从上往下写,这样的好处是具体的代码实现会很清晰,也不会因为一处修改而影响全局,相对独立,相对来说还是比较满意的,美中不足是没有实现递归展开,无法实现展开一片的功能,原因是最开始构思框架时没有考虑进去,后面写好了想改会比较困难
,这次也对比也比较少,今晚回来之后要跟其他人对比吸收经验,其余的实现相对也比较满意,希望各位有比较好的实现方法也在评论区提出来大家交流,那么好,今天的分享就到此结束,希望你和我都能有所收获!

  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值