C语言小项目之扫雷(进阶版)

这篇具有很好参考价值的文章主要介绍了C语言小项目之扫雷(进阶版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:C语言学习分享⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵
带你学习更多C语言知识
  🔝🔝


C语言小项目之扫雷(进阶版)


1. 前期准备

扫雷游戏其实就是一个N×N的棋盘
可以用二维数组来模仿这个环境

值得注意的是:

当当前位置不是雷时
我们需要计算以当前位置为中心
的九宫格中有多少个雷
然后将这个数字填入当前位置中
当这个位置为棋盘边缘时,数组会越界

结论:

  • N×N的棋盘应该定义为
  • (N+2)×(N+2)
  • 打印棋盘时应该打印N×N的数组

画图理解:
C语言小项目之扫雷(进阶版)
再将所有步骤细化成:

  • 初始化棋盘- InitBoard
  • 打印棋盘- PrintBoard
  • 布置地雷- SetMine
  • 排查地雷- FindMine
  • 求坐标周围有几个雷- GetMineCount
  • 周围都没有雷时的展开- unfold

2. 初始化棋盘

假设我们用9×9的棋盘玩游戏
地雷的数量一共是10个:

#define ROW 9 //打印9×9
#define COL 9
#define ROWS ROW+2 //内部实现用11×11
#define COLS COL+2
#define MCount 10  //定义一共有10个地雷

要打印的棋盘应该和
内部实现功能的棋盘分开
所以我们定义两个数组
将打印数组初始化为’*’
埋地雷的棋盘初始化为’0’

为什么要将埋地雷棋盘初始化为0?

因为在埋地雷的时候将’0’改为’1’
没有地雷的位置就是’0’
有地雷的位置就是’1’
当我们计算一个位置的九宫格
范围内有多少个雷时就可以
直接将九宫格里所有位置加起来
得出的值就是当前位置周围雷的个数

void InitBoard(char mine[ROWS][COLS], char show[ROW][COLS], int rows, int cols)
{
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			mine[i][j] = '0';
			show[i][j] = '*';
		}
	}
}

3. 打印棋盘

打印出来的是9×9的棋盘

C语言小项目之扫雷(进阶版)

并且在左边和上面给对应的坐标1~9

void PrintBoard(char a[ROWS][COLS], int rows, int cols)
{
	printf("最边上为行数与列数\n");
	int  i = 0;
	for (i = 0; i <= cols; i++)
	{
		printf("%d-", i);
	}
	printf("\n");
	for (i = 1; i <= rows; i++)
	{
		printf("%d ", i);
		int j = 0;
		for (j = 1; j <= cols; j++)
		{
			printf("%c ", a[i][j]);
		}
		printf("\n");
	}
}

4. 布置地雷

需要随机生成一个坐标
然后将此坐标从’0’变成’1’

(注:随机选取的位置不能已经有雷了)

void SetMine(char mine[ROWS][COLS], int rows, int cols)
{
	int count = MCount;//define宏定义的雷的个数
	while (count > 0)
	{
        int x = rand() % rows + 1;//生成1~9的随机横坐标
	    int y = rand() % cols + 1;
		if (mine[x][y] == '0')//若当前位置已经有雷了,就不执行if语句,再重新生成一个随机位置
		{
			mine[x][y] = '1';
			count--;//当前位置不是雷才进入if语句,count才减少
		}
	}
}

解释在代码块中


5. 当前位置周围的雷数

正如上面解释的一样
将以当前位置为中心的九宫格
中其他八个位置的值相加就是
当前位置雷的个数!

int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
	return (mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] + mine[x + 1][y] +
		mine[x + 1][y + 1] + mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0');
}

因为初始化时给的是字符’0’
所以将全部值加起来后减去八个’0’
得到的才是整数


6. 排查地雷(非展开)

排查地雷需玩家输入需要排查的坐标
然后判断这个位置是不是字符’1’
如果是就被地雷炸死了
如果不是,就将周围雷的个数打印出来

(注:当棋盘上只剩下Mcout个位置时
也就是除了地雷外所有位置都被排查了
代表玩家胜利了!)

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols)
{
	int x, y;
	int winC = 0;//当winC等于棋盘数减去雷数时,游戏胜利!
	while (winC < ROW * COL - MCount)
	{
		printf("请输入要排查的坐标:");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= cols && y >= 1 && y <= rows)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了!");
				PrintBoard(mine, rows, cols);
				break;
			}
			else if (mine[x][y] == '0')
			{
				winC++;
				mine[x][y] = GetMineCount(mine,x,y);
				PrintBoard(show, rows, cols);
			}
		}
		else
		{
			printf("坐标输入错误");
		}
		if (winC == rows * cols - MCount)
		{
			printf("恭喜你,排雷成功\n");
			PrintBoard(mine, ROW, COL);
		}

	}
}

7. 利用递归使棋盘展开

电脑上的扫雷游戏有这样的功能:
当前位置不是地雷并且周围也没有雷时
它会将这一区域展开:

C语言小项目之扫雷(进阶版)

只有当打印棋盘的当前位置
是字符’*',并且横纵坐标没有越界时递归

void unfold(char mine[ROWS][COLS], char show[ROWS][COLS],int x, int y,int rows,int cols)
{
	if (GetMineCount(mine,x,y) == 0)//如果当前位置周围雷数为0
	{
		show[x][y]=' ';//像上面的图片一样将这个位置变成空格
		for (int i = x - 1; i < x + 1; i++)//递归左上,正上,右上,正左,正右...八个位置
		{
			for (int j = y - 1; j < y + 1; j++)
			{
				if (show[i][j] == '*' && i > 0 && i <= rows && j > 0 && j <= cols)
				{
					unfold(mine, show, i, j, rows, cols);//递归
				}
			}
		}
	}
	else
	{
		show[x][y] = GetMineCount(mine, x, y) + '0';
	}
}

C语言小项目之扫雷(进阶版)


8. 总结以及代码分享

完成一个规范的项目
少不了定义多个头文件和.c文件
要想你的工程变得规范,容易理解
应该将各个部分分开来实现

把所有代码的链接分享给大家:

gitee代码仓库文章来源地址https://www.toymoban.com/news/detail-513757.html

到了这里,关于C语言小项目之扫雷(进阶版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 扫雷——C语言实现

    要用代码来实现扫雷这个小游戏,我们就需要先了解扫雷这个游戏的规则和有关操作。 我们先来看一段扫雷游戏的动画: 游戏目标:在N*N的区域中找到M个随机布置的地雷 若点击的区域不是雷,那么就会显示一个数字,这个数字代表着这块区域周围雷的个数 若点击的区域是

    2024年02月08日
    浏览(40)
  • C语言实战——扫雷游戏

    1.1扫雷游戏的功能说明 使用控制台实现经典的扫雷游戏 游戏可以通过菜单实现继续玩或者退出游戏 扫雷的棋盘是9*9的格子 默认随机布置10个雷 可以排查雷 如果位置不是雷,就显示周围有几个雷 如果位置是雷,就炸死游戏结束 把除10个雷之外的所有⾮雷都找出来,排雷成功

    2024年03月15日
    浏览(46)
  • 【C语言】扫雷【附源码】

    欢迎来到英杰社区 https://bbs.csdn.net/topics/617804998        尽快找到雷区中的所有不是地雷的格子,而不许踩到地雷。点开的数字是几,则说明该数字旁边的8个位置中有几个雷,如果挖开的是地雷,则会输掉游戏。 宏定义 : Row 和 Col 定义了棋盘的行数和列数。 Rows 和 Cols 分别

    2024年04月12日
    浏览(29)
  • go语言实现扫雷

    源码如下 如下显示效果 长按鼠标左键划过格子会有提示,与windows扫雷效果一致。 左键既是单击,点数字时也是双击,右键标雷。 在界面输入,1 + 回车 = 初级,2 + 回车 = 中级,3 + 回车 = 高级 在界面输入, 11 22 33 + 回车 = 高度11,宽度22,总雷数33 。可以自定义数据 如果想在浏览器

    2024年03月13日
    浏览(54)
  • C语言(扫雷游戏)

                          Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注+收藏,欢迎欢迎~~                              💥 个人主页 :小羊在奋斗                         💥 所属专栏 :C语言             本

    2024年04月23日
    浏览(33)
  • [C语言][游戏][扫雷]

    为了巩固C语言,我运用所学的知识,写了一篇关于扫雷游戏的博客。如果有大佬看到这篇文章,如有不足之处,请你一定要指出来。 游戏的规则: 我们在棋盘格中任意点开一个格子(输入行和列确认这个格子),若这个格子不是雷就排除了这个位置,排除后这个格子会显示

    2024年02月13日
    浏览(37)
  • 【C语言】实现扫雷游戏

    详细介绍扫雷游戏的思路和实现过程,并用随机数实现埋雷。 • 使用控制台实现经典的扫雷游戏 • 游戏可以通过菜单实现继续玩或者退出游戏 • 扫雷的棋盘是9*9的格⼦ • 默认随机布置10个雷 • 可以排查雷 ◦ 如果位置不是雷,就显示周围有几个雷 ◦ 如果位置是雷,就炸

    2024年02月04日
    浏览(44)
  • 【c语言】扫雷-详解

    《扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输 创建两个棋盘,一个棋盘大小为11×11进行我们程序的实现,另一个棋盘大小为9×9展示给用户。 创建11*11棋盘大

    2024年02月08日
    浏览(30)
  • 扫雷【C语言】

    用C语言实现一个9X9的扫雷 test.c   测试部分 game.c  游戏实现部分 game.h   游戏声明部分 游戏部分包括创建一个扫雷的区域,在其中埋雷,玩家进行扫雷,判断扫雷是否成功 这里我i们定义行列,便于以后将其修改为其他格式的扫雷 因为我们扫雷如果扫到的不是类雷会返回该

    2024年02月08日
    浏览(20)
  • 扫雷---C语言

    目录 前言: 1.认识扫雷 1.1游戏构思 1.2碎碎念 2.扫雷接口实现 2.1菜单打印 2.2创建标识符常量和初始化数组 2.3打印棋盘 2.4随机埋雷 2.5排查雷 3.源码 3.1头文件和函数原型声明game.h 3.2游戏函数实现game.c  3.3测试代码文件test.c  ❤博主CSDN:啊苏要学习   ▶专栏分类:C语言◀  

    2024年02月05日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包