【c语言】扫雷-详解

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

 本文会用到随机数的知识,参考博主先前的文章
 [猜数字游戏]()
 本文采用结构化文件实现游戏 分别包括
 test.c //⽂件中写游戏的测试逻辑 
 game.c //⽂件中写游戏中函数的实现等
 game.h //⽂件中写游戏需要的数据类型和函数声明等

前言

游戏介绍

《扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输
【c语言】扫雷-详解,小游戏,c语言,开发语言

实现思路

1.创建棋盘

创建两个棋盘,一个棋盘大小为11×11进行我们程序的实现,另一个棋盘大小为9×9展示给用户。
创建11*11棋盘大小的原因

如果想要知道边线位置上周围雷的个数,例如下图中7*8的位置周围雷的个数   
arr【7】【8】,我们就需要查找以这个位置为中心的正方形的位置中雷的个
数,在  9*9的棋盘上实现非常的麻烦,所以我们索性定义11*11的棋盘,
在多出来的位置上 信息置为'0'即非雷,这样我们统计某个位置的雷的个个数
时,只需    要进行简单的加法运算

【c语言】扫雷-详解,小游戏,c语言,开发语言

2.进行埋雷

雷的位置在内部棋盘上用‘1’表示 , 没有雷则是‘0’
运用随机数的知识在1111的棋盘的99位置上进行埋雷

3.开始排雷

玩家输入要排查的位置,进行判断该位置是否有雷,有雷则爆炸退出游戏,没有雷则继续进行,并告知玩家该位置周围雷的个数。
【c语言】扫雷-详解,小游戏,c语言,开发语言

具体步骤

头文件

头文件中出现内容都会在后续讲解

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>

#define ROW 9 //代表行数
#define COL 9 //代表列数
#define ROWS COL+2
#define COLS ROW+2
#define EASYCOUNT 10  //定义雷的个数
//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char temp);
//展示棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col);
//埋雷操作
void SetMine(char mine[ROWS][COLS], int row, int col);
//排查雷
void FindMine(char mine[ROWS][COLS], char  show[ROWS][COLS], int row, int col);
//判断x,y坐标位置九宫格内雷的个数
int GetMineCount(char mine[ROWS][COLS], int x, int y);

1.test.c主体(游戏框架)

int main()
{
	srand((unsigned int)time(NULL));

	int input = 0;
	menu();
	printf("请输入你的选择->");
	scanf("%d", &input);
	switch (input)
	{
	case 1:
		game();
		break;
	case 0:
		printf("退出扫雷\n");
		break;

	default:
		printf("输入错误,请重新输入->");

	}
	return 0;
}

2.打印菜单

 打印菜单页面,让玩家进入游戏知道如何开始及退出。
void menu()
{
	printf("*********************\n");
	printf("*** 1. play     *****\n");
	printf("*** 0. exit     *****\n");
	printf("*********************\n");
	printf("*********************\n");
}

【c语言】扫雷-详解,小游戏,c语言,开发语言

3.定义游戏函数

我们需要在这个函数内完成几个需求
1.创建棋盘
2.初始化棋盘
3.埋雷
4.排查雷
5.给出反馈

为使整体代码简洁明了,我们将这几个过程分别自定义为函数
写在头文件中

void game()
{
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	//初始化棋盘
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');


	//展示棋盘
	DisplayBoard(show, ROW, COL);
	//埋雷
	SetMine(mine, ROW, COL);

	//找雷
	FindMine(mine, show, ROW, COL);
	DisplayBoard(show, ROW, COL);
	return;

}

1)创建棋盘

这里我们预先在头文件定义ROWS COLS ,这样的目的
方便我们在后续要生成大小不同的棋盘时,方便更改

#define ROW 9
#define COL 9
#define ROWS COL+2
#define COLS ROW+2
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };

2)初始化棋盘

void InitBoard(char board[ROWS][COLS], int rows, int cols, char temp);

因为我们自己程序运行的界面和展示给用户的界面内容并不相同,所以在定义函数时,多声明一个变量,来应对不同的情况
我们程序内部有雷则是‘1’,没有雷则是‘0’
而展示给用户所看到的当然不能是‘0’和‘1’,否则用户相当于在睁眼猜数字。

void InitBoard(char board[ROWS][COLS], int rows, int cols, char temp)
{
	int i = 0, j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = temp;

		}
	}
}

3)展示初始化后的棋盘

void DisplayBoard(char board[ROWS][COLS], int row, int col);

【c语言】扫雷-详解,小游戏,c语言,开发语言

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	printf("----------扫雷------------\n");
	
	for (i = 0; i <= row; i++)
		printf("%d ", i);
	//为棋盘生成列标号 方便后续玩家进行操作
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		//生成列序号
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);

		}
		printf("\n");
	}
	printf("----------扫雷------------\n");
}

4)埋雷

void SetMine(char mine[ROWS][COLS], int row, int col);

这里我们使用EASYCOUNT,在头文件中预先定义

#define EASYCOUNT 10  //定义雷的个数
void SetMine(char mine[ROWS][COLS], int row, int col)
{
   //定义雷的个数
	int count = EASYCOUNT;

	while (count)
	{
       //使用srand()函数来随机生成我要存放雷的位置
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		//当我们行数和列数
		if (mine[x][y] == '0')
		//如果此位置没有雷时
		{
			mine[x][y] = '1';
			//此位置放上雷
			count--;
			//未放置雷的个数减一 直至所有雷都放置完毕
		}
	}
}

在埋完雷之后,我们展示一下我们系统所能看见的棋盘界面
当然这个界面不能为用户展示

DisplayBoard(mine, ROW, COL);

1代表雷 0代表没有雷
【c语言】扫雷-详解,小游戏,c语言,开发语言

5)找雷

 用户输入一个坐标,我们要实现两件事
 该位置是否有雷   
        1.有雷-----爆炸,游戏结束
        2.没有雷----显示该位置九宫格内雷的个数
//查找雷
void FindMine(char mine[ROWS][COLS], char  show[ROWS][COLS], int row, int col);
//判断x,y坐标位置九宫格内雷的个数
int GetMineCount(char mine[ROWS][COLS], int x, int y);
void FindMine(char mine[ROWS][COLS], char  show[ROWS][COLS], int row, int col)
{
	int x, y;
	int win = 0;
	//这里定义一个变量win  当我们每排查一次,并且该位置没有雷,则win++
	while (win < row * col - EASYCOUNT)
	//row*col代表一个棋盘可以存在雷的数量
	//EASYCOUNT代表雷的个数
	//相减即是没有雷的个数
	//当我们排查的次数小于没有雷的个数
	//即没有把雷排查完,则循环一直进行,直至排查完所有的雷
	{
		printf("请输入你要排查的位置坐标->");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
        //判断输入的位置坐标是否合理
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,被炸死了\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else
			//如果此处没有雷,则该位置显示周围九宫格内雷的个数
			{
				int c = GetMineCount(mine, x, y);
				show[x][y] = c + '0';
				DisplayBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("非法输入,请重新输入->\n");
		}
	}
	
	if (win == row * col - EASYCOUNT)
	//已经把没有雷的位置全部找出了
	{
		printf("恭喜你,排雷成功\n");
		DisplayBoard(mine, ROW, COL);
	}

}

判断x,y坐标位置九宫格内雷的个数

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';
}

我们实操一下
1.查找的位置没有雷
输入位置坐标2 6
该位置没有雷,并且周围也没有雷,则我们继续
【c语言】扫雷-详解,小游戏,c语言,开发语言
2.排查的位置是雷
【c语言】扫雷-详解,小游戏,c语言,开发语言

完整代码

game.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>

#define ROW 9
#define COL 9
#define ROWS COL+2
#define COLS ROW+2
#define EASYCOUNT 10  //定义雷的个数

void InitBoard(char board[ROWS][COLS], int rows, int cols, char temp);

void DisplayBoard(char board[ROWS][COLS], int row, int col);

void SetMine(char mine[ROWS][COLS], int row, int col);

void FindMine(char mine[ROWS][COLS], char  show[ROWS][COLS], int row, int col);

int GetMineCount(char mine[ROWS][COLS], int x, int y);

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"

//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char temp)
{
	int i = 0, j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = temp;

		}
	}
}

void SetMine(char mine[ROWS][COLS], int row, int col)
{
	int count = EASYCOUNT;

	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}
}

//展示棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	printf("----------扫雷------------\n");
	for (i = 0; i <= row; i++)
		printf("%d ", i);
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);

		}
		printf("\n");
	}
	printf("----------扫雷------------\n");
}

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';
}

void FindMine(char mine[ROWS][COLS], char  show[ROWS][COLS], int row, int col)
{
	int x, y;
	int win = 0;
	while (win < row * col - EASYCOUNT)
	{
		printf("请输入你要排查的位置坐标->");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,被炸死了\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else
			{
				int c = GetMineCount(mine, x, y);
				show[x][y] = c + '0';
				DisplayBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("非法输入,请重新输入->\n");
		}
	}
	if (win == row * col - EASYCOUNT)
	{
		printf("恭喜你,排雷成功\n");
		DisplayBoard(mine, ROW, COL);
	}

}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
	printf("*********************\n");
	printf("*** 1. play     *****\n");
	printf("*** 0. exit     *****\n");
	printf("*********************\n");
	printf("*********************\n");
}
void game()
{
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	//初始化棋盘
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');


	//展示棋盘
	DisplayBoard(show, ROW, COL);
	//埋雷
	SetMine(mine, ROW, COL);
	DisplayBoard(mine, ROW, COL);
	//找雷
	FindMine(mine, show, ROW, COL);
	DisplayBoard(show, ROW, COL);
	return;

}
int main()
{
	srand((unsigned int)time(NULL));

	int input = 0;
	menu();
	printf("请输入你的选择->");
	scanf("%d", &input);
	switch (input)
	{
	case 1:
		game();
		break;
	case 0:
		printf("退出扫雷\n");
		break;

	default:
		printf("输入错误,请重新输入->");

	}
	return 0;
}

码字不易,期待你的点赞,关注和收藏。
有什么好的建议欢迎在评论区提出0.0文章来源地址https://www.toymoban.com/news/detail-717901.html

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

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

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

相关文章

  • c语言小游戏之扫雷

    目录 一:游戏设计理念及思路 二:初步规划的游戏界面 三:开始扫雷游戏的实现 注:1.创建三个文件,test.c用来测试整个游戏的运行,game.c用来实现扫雷游戏的主体,game.h用来函数声明和包含头文件 2.为方便定位坐标,在展示数组时添加行号和列号 四:谢谢观看  听说看到

    2024年01月23日
    浏览(47)
  • 小游戏扫雷实现教学(详解)

    目录  【前言】 一、模块化程序设计(多文件编程)介绍 1.概述 2.传统编程的方式 3.模块化程序设计的方法 二、扫雷代码设计思路 三、扫雷代码设计 1.创建菜单函数  2.实现9x9扫雷 3.初始化棋盘  4.打印棋盘  5.随机布置雷的位置 6.排查雷的信息  7.回到步骤1,重新选择进入

    2024年02月12日
    浏览(33)
  • C语言:轻松实现扫雷小游戏

    目录 一、前言 二、扫雷步骤 1.创建项目 2.设计整体框架 1.定义数组长度和雷的个数 2.game函数功能 三、头文件game.h代码实现  四、测试文件test.c代码实现 五、game函数功能实现 1.初始化棋盘 2.打印棋盘  3.布置雷 4. 获得雷的个数  5.排查雷 6.game函数实现代码 六、总结 大家好

    2024年02月03日
    浏览(51)
  • C语言——扫雷小游戏(递归展开版)

    哈喽,大家好,上次我们已经学习了三子棋小游戏,今天我们来学习扫雷小游戏了。 目录 1.游戏介绍 2.函数部分 2.1菜单 2.2game()函数 2.3mian()函数 2.4初始化棋盘 2.5打印棋盘 2.6布置雷 2.7排查雷 2.8统计雷 2.9递归,展开一片区域 3.完整代码展示  想必大家都玩过扫雷这款小游戏吧

    2024年02月03日
    浏览(55)
  • 【C语言】扫雷小游戏(递归展开版)

    哈喽,大家好,上次我们已经学习了三子棋小游戏,今天我们来学习扫雷小游戏了。 目录 1.游戏介绍 2.函数部分 2.1菜单 2.2game()函数 2.3mian()函数 2.4初始化棋盘 2.5打印棋盘 2.6布置雷 2.7排查雷 2.8统计雷 2.9递归,展开一片区域 3.完整代码展示  想必大家都玩过扫雷这款小游戏吧

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

    相信大家一定都玩过扫雷小游戏,今天我就带大家来用C语言实现一个简易版的扫雷小游戏。 这里我们还是需要三个文件来封装我们的写的代码: test.c ----- 用于我们代码的测试,以及游戏整体框架的实现。 game .c ------ 用来封装实现我们游戏的相关函数。 game.h ------ 主要用来

    2024年02月11日
    浏览(103)
  • 【C语言】小游戏-扫雷(清屏+递归展开+标记)

    大家好,我是深鱼~ 目录 一、游戏介绍 二、文件分装  三、代码实现步骤 1.制作简易游戏菜单  2. 初始化棋盘(11*11)  3.打印棋盘(9*9) 4.布置雷   5.计算(x,y)周围8个坐标的和  6.排查雷   1清屏后打印棋盘 2递归展开 3标记雷 四、完整代码 game.h:相关函数的声明,整个代码要引用

    2024年02月12日
    浏览(53)
  • 【C语言实现扫雷小游戏——可展开一片】

    学习完了函数和数组,让我们做个扫雷小游戏巩固一下所学的知识把! 使用控制台操作 通过菜单实现选择 棋盘为9×9 默认随机布置10个雷 排查雷 如果排查的位置不是雷,就显示周围有几个雷 排查位置是雷,游戏结束,玩家失败 把10个雷全部排除,游戏结束,玩家成功 扫雷

    2024年02月08日
    浏览(50)
  • C语言之扫雷小游戏的实现【含递归展开】

    扫雷游戏是1992年发行的一款大众类益智游戏,对于许多80后、90后来说都是童年的回忆。如今三十年过去了,这款游戏依旧受到很多网友的喜爱,今天我们一起来模拟实现一下扫雷游戏。 本文所用的编译器是VS2022 这里我们使用模块化设计,模块化设计就是把各个模块的代码分

    2024年02月02日
    浏览(49)
  • 带你实现初阶扫雷小游戏—【C语言】

      目录 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 我们这里拿9*9的棋盘(其中包含10个雷)来实现(这里也可以自定义棋盘大小和雷的个数 》我们这

    2024年02月05日
    浏览(104)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包