【c语言】扫雷

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

 前言:

扫雷是一款经典的单人益智游戏,它的目标是在一个方格矩阵中找出所有的地雷,而不触碰到任何一颗地雷。在计算机编程领域,扫雷也是一个非常受欢迎的项目,因为它涉及到许多重要的编程概念,如数组、循环、条件语句和函数等。

C语言是一种广泛使用的编程语言,它具有高效、灵活和可移植等特点,非常适合编写各种类型的应用程序。因此,使用C语言编写一个扫雷游戏是一个很好的学习编程的项目。

在这篇博客中,我们将介绍如何使用C语言编写一个简单的扫雷游戏。我们将从基本的编程概念开始讲解,逐步深入到更复杂的程序设计技术。我们还将提供完整的代码示例和详细的注释,以帮助读者更好地理解和掌握这个项目。

无论您是初学者还是有一定编程经验的开发者,相信通过阅读本篇博客,您都能够学到一些有用的知识和技巧。让我们一起来探索如何使用C语言编写一个令人兴奋的扫雷游戏吧!

前期准备:

先开一个test.c文件用来游戏的逻辑测试,在分别开一个game.c文件和game.h头文件用来实现游戏的逻辑

【c语言】扫雷,c语言,算法,开发语言

1. 主要步骤:

1.1 游戏规则:

输入1(0)开始(结束)游戏,输入一个坐标,如果该坐标不是雷则会显示该坐标周围有几个雷

1.2 打印菜单:

void menu()
{
	printf("----------------扫雷----------------\n");
	printf("|                                  |\n");
	printf("|              1.play              |\n");
	printf("|              0.exit              |\n");
	printf("|                                  |\n");
	printf("------------------------------------\n");
}
int main()
{
	int input = 0;
	srand((unsigned int )time(NULL));
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("游戏结束,退出游戏\n");
			break;
		default :
			printf("输入错误请重新输入\n");
		}
	} while (input);
	return 0;
}

1.3 打印棋盘:

【c语言】扫雷,c语言,算法,开发语言

写两个数组一个是用来打印给玩家看的棋盘,一个是用来放置炸弹的隐藏棋盘,等到游戏结束我们才会打印这个棋盘。然后我们给数组初始化,用*来初始化我们给玩家看的棋盘,用字符‘0’初始化隐藏棋盘。

   char mine[ROWS][COLS] = { 0 };
   char show[ROWS][COLS] = { 0 };

     //初始化棋盘
	InitBoard(show, ROWS, COLS, '*');
	InitBoard(mine, ROWS, COLS, '0');
	
    //打印棋盘
	DisPalyBoard(show, ROW, COL);
    //DisPalyBoard(mine, ROW, COL);

1.4 打印行列:

因为我们是用坐标来选择排雷的,所以我们需要在棋盘的周围打印出行列才可以让玩家更好的去选择。

首先在打印棋盘for循环上方加上一个打印0~9的for循环就可以打印出棋盘的行了,然后用打印列的for循环套在打印棋盘的for循环上就可以打印出棋盘的列了。

​
void DisPalyBoard(char arr[ROWS][COLS], int row, int col)
{
	printf("------扫雷游戏------\n");
    ​
    int i = 0;
    //打印行的for循环
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");

	//打印列的for循环
	for ( i = 1; i <= row; i++)  
	{
		printf("%d ", i);

        //打印棋盘的for循环
		for (int j = 1; j <= col; j++)
		{
			
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
}

​

1.5 放置炸弹:

要想棋盘上随机分布十个炸弹(炸弹我们用字符‘1’定义),我们就需要生成随机数使数组的随机十个元素等于字符‘1’,而生成随机数就需要调用到前面我写猜数字游戏时讲过的rand函数、srand函数、time函数了。

void SetMine(char arr[ROWS][COLS], int row, int col)
{
	int count = EsayCount;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (arr[x][y] == '0')//防止生成相同随机数时,使多个炸弹放置在同一位置
		{
			arr[x][y] = '1';
			count--;
		}
	}
}

1.6 排查炸弹:

当我们输入一个坐标后如果时炸弹结束游戏,如果不是炸弹则需要显示炸弹的数量。

判断是否是炸弹只需写一个if语句判断该坐标中数组所对应的元素是否等于‘1’就行了。

显示周围有几个雷,我们就需要将所选坐标的周围的数加起来就可以了,这些加起来的数的和替换所选坐标的元素就可以了。

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 + 1] + mine[x - 1][y + 1] + mine[x - 1][y + 1] + mine[x][y + 1] - 8 * '0');
}

也可以用for循环统计

int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
	int a = 0;
	for (int i = x - 1; i <= x + 1; i++)
	{
		for (int j = y - 1; j <= y + 1; j++)
		{
			a += mine[i][j];
		}
	}
	return a - '0' * 9;
}

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0, y = 0;
	int win = 0;
	while (win < row*col - EsayCount)
	{
		printf("请输入要排查的坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了\n");
				DisPalyBoard(mine, ROW, COL);
				break;
			}
			else
			{
				//该坐标不是雷,就得统计该坐标的周围有几个雷
				int count = GetMineCount(mine, x, y);
				show[x][y] = count + '0';
				DisPalyBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("坐标非法,请重新输入\n");
		}
	}
	if (win == row * col - EsayCount)
	{
		printf("恭喜你,排雷成功\n");
		DisPalyBoard(mine, ROW, COL);
	}
}

1.7 周围没有雷就展开一片

首先需要判断所选坐标的周围是否有雷,即判断count是否等于0,如果所选坐标周围没有雷的话,就将此坐标的周围的坐标都调用显示雷的数量的函数。当然还需要判断一下坐标是否为‘*’,如果没有这个判断它就会重复的调用函数,从而进入了死循环。

void arr(char mine[ROWS][COLS], char show[ROWS][COLS], int x,int y)
{

	if (show[x][y] == '*')
	{
		int count = GetMineCount(mine, x, y);
		show[x][y] = count + '0';
		if (x >= 1 && x <= ROW && y >= 1 && y <= ROW)
		{
			if (count == 0)
			{
				arr(mine, show, x - 1, y);
				arr(mine, show, x - 1, y - 1);
				arr(mine, show, x - 1, y + 1);
				arr(mine, show, x, y - 1);
				arr(mine, show, x, y + 1);
				arr(mine, show, x + 1, y - 1);
				arr(mine, show, x + 1, y + 1);
				arr(mine, show, x + 1, y);
			}
		}
	}
}

1.8 计算游戏时间

time函数可以返回一个时间戳,我们可以利用这个函数计算游戏的时间。

int y = time(NULL);
while (1)
{
	system("cls");
	int x = time(NULL) - y;
	printf("%d", x);
	Sleep(1000);
}

1.9 游戏可改性

因为在写这个程序时需要输入很多的数字,如果我们想修改这些数时就要一个一个改,这样非常的麻烦。为了避免这些麻烦我们只需要在头文件定义某字符等于某个数字就可以了,这样我们想改游戏参数的时候在头文件game.h改就行了。

#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2
#define EsayCount 10

比如当我们想改行和列改为16炸弹数量改为40的时候,我们只需要在头文件将ROW 与 COL定义为16就可以了。

#define ROW 16
#define COL 16

#define ROWS ROW+2
#define COLS COL+2
#define EsayCount 40

 【c语言】扫雷,c语言,算法,开发语言

 1.10 控制台颜色的修改

使用system("color attr");函数可以修改控制台颜色,这个函数需要使用#include<windonws.h>调用。颜色可以参考下面这张图:

【c语言】扫雷,c语言,算法,开发语言

  例:
 【c语言】扫雷,c语言,算法,开发语言

2. 完整代码

2.1 game.h头文件

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2
#define EsayCount 10

//声明函数
void InitBoard(char arr[ROWS][COLS], int rows, int cols, char test);
//
void DisPalyBoard(char arr[ROW][COL], int row, int col, int o);
//布置雷的信息
void SetMine(char arr[ROWS][COLS], int row, int col, int o);
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int o);

 2.2 game.c文件

#include"game.h"
void InitBoard(char arr[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			arr[i][j] = set;
		}
	}
}
void DisPalyBoard(char arr[ROWS][COLS], int row, int col,int o)
{
	//清屏
	system("cls");
	printf("-----------扫雷游戏----------\n");
	//计算时间
	printf("已用时间:%ds\n", time(NULL) - o);
	int i = 0;
	for (i = 0; i <= col; i++)
	{
		printf("%2d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%2d ", i);
		for (int j = 1; j <= col; j++)
		{
			printf("%2c ", arr[i][j]);
		}
		printf("\n");
	}
}

void SetMine(char arr[ROWS][COLS], int row, int col)
{
	int count = EsayCount;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (arr[x][y] == '0')
		{
			arr[x][y] = '1';
			count--;
		}
	}
}

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 + 1] + mine[x - 1][y + 1] + mine[x + 1][y] + mine[x][y + 1] - 8 * '0');
	int a = 0;
	for (int i = x - 1; i <= x + 1; i++)
	{
		for (int j = y - 1; j <= y + 1; j++)
		{
			a += mine[i][j];
		}
	}
	return a - '0' * 9;
}

int win = 0;
void arr(char mine[ROWS][COLS], char show[ROWS][COLS], int x,int y)
{

	if (show[x][y] == '*'&& x >= 1 && x <= ROW && y >= 1 && y <= ROW)
	{
		int count = GetMineCount(mine, x, y);
		show[x][y] = count + '0';
		win++;
		if (count == 0)
		{
			arr(mine, show, x - 1, y);
			arr(mine, show, x - 1, y - 1);
			arr(mine, show, x - 1, y + 1);
			arr(mine, show, x, y - 1);
			arr(mine, show, x, y + 1);
			arr(mine, show, x + 1, y - 1);
			arr(mine, show, x + 1, y + 1);
			arr(mine, show, x + 1, y);
		}
	}
}

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int o)
{
	int x = 0, y = 0;
	while (win < row * col - EsayCount)
	{
		
		printf("请输入要排查的坐标(0 0重开):>");
		scanf("%d %d", &y, &x);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				DisPalyBoard(mine, ROW, COL, o);
                printf("你被炸死了!!!\n");
				break;
			}
			else
			{
				//该坐标不是雷,就得统计该坐标的周围有几个雷
				arr(mine, show, x, y);
				DisPalyBoard(show, ROW, COL, o);
			}
		}
		else if (x == 0 && y == 0)
		{
			printf("重新开始游戏。\n");
			break;
		}
		else
		{
			printf("坐标非法,请重新输入\a\n");
		}
	}
	if (win == row * col - EsayCount)
	{
		DisPalyBoard(mine, ROW, COL, o);
        printf("恭喜你,排雷成功\n");
	}
}

2.3 test.c文件

#include"game.h"

void menu()
{
	printf("----------------扫雷----------------\n");
	printf("|                                  |\n");
	printf("|              1.play              |\n");
	printf("|              0.exit              |\n");
	printf("|                                  |\n");
	printf("------------------------------------\n");
}

void game()
{
	int o = time(NULL);
	//存放布置好雷的信息
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };

	InitBoard(show, ROWS, COLS, '*');
	InitBoard(mine, ROWS, COLS, '0');
	//随机布置10个雷
	SetMine(mine, ROW, COL, o);
	//打印棋盘
	/*DisPalyBoard(mine, ROW, COL,o);*/
	DisPalyBoard(show, ROW, COL, o);

	//排查雷
	FindMine(mine, show, ROW, COL, o);
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("游戏结束,退出游戏\n");
			break;
		default:
			printf("输入错误请重新输入\a\n");
		}
	} while (input);
	return 0;
}

2.4 效果图:

【c语言】扫雷,c语言,算法,开发语言文章来源地址https://www.toymoban.com/news/detail-822488.html

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

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

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

相关文章

  • go语言实现扫雷

    go语言实现扫雷

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

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

    【C语言】实现扫雷游戏

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

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

    C语言实战——扫雷游戏

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

    2024年03月15日
    浏览(11)
  • 贝蒂快扫雷~(C语言)

    贝蒂快扫雷~(C语言)

             ✨✨欢迎大家来到贝蒂大讲堂✨✨         ​​​​🎈🎈养成好习惯,先赞后看哦~🎈🎈                  所属专栏:贝蒂的游戏                          贝蒂的主页:Betty‘s blog           扫雷相信大家小时候到玩过吧,那我们通过目前已学的知识,自

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

    扫雷---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日
    浏览(2)
  • 【c语言】扫雷

    【c语言】扫雷

    扫雷是一款经典的单人益智游戏,它的目标是在一个方格矩阵中找出所有的地雷,而不触碰到任何一颗地雷。在计算机编程领域,扫雷也是一个非常受欢迎的项目,因为它涉及到许多重要的编程概念,如数组、循环、条件语句和函数等。 C语言是一种广泛使用的编程语言,它

    2024年01月25日
    浏览(3)
  • C语言(扫雷)

    C语言(扫雷)

    准备工作 效果展示 准备工作: game.h 一个头文件–声明函数 test.c 为主文件 game.c 为功能函数实现文件 效果展示 菜单界面 游戏界面打印(二维数组) 雷的随机产生 排雷(以及判断周围的雷数) 胜利条件 大致思路就是这样,接下来我们一步步去分析 这里我们要 不断的去 接

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

    扫雷【C语言】

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

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

    【c语言】扫雷-详解

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

    2024年02月08日
    浏览(9)
  • C语言怎样写扫雷

    C语言怎样写扫雷

    1.生成基础雷盘 在游戏开始时,基础雷盘就生成完毕。在基础雷盘上,地雷 已经 随机分布,每一格周围有多少地雷也 已经 计算完成并显示在这一格上。可以理解为,透视版的扫雷。下图就是基础雷盘的展现(现实中并不会展现基础雷盘) 2.生成表面雷盘 现实中当然没有透

    2024年02月06日
    浏览(10)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包