c语言实现含递归清场版扫雷游戏

目录
  • 一,设计思路
  • 二.实现方式
    • 1.菜单的打印
    • 2.game函数
    • 3.棋盘的初始化与打印
    •  4.雷的放置,雷的个数
    • 5.递归实现一片效果
    •  6.排查雷
  •  三.完整代码
  • 总结

一,设计思路

想必大家都玩过扫雷

 这便是一个标准的扫雷,换做代码实现,我们需要考虑以下几点:

1.棋盘的设计与初始化

2.在棋盘中放入雷

3.统计雷数

4.如何实现“一片”的效果

5.输赢的判断

接下来我们进行具体操作。

二.实现方式

1.菜单的打印

对任意一个游戏,菜单是必不可少的,也是最简单的部分,直接上代码

void menu()
{
	printf("------------------扫雷------------------\n");
	printf("---------------1.开始游戏---------------\n");
	printf("---------------0.退出游戏---------------\n");
}
int main()
{
	srand((unsigned int)time(NULL));
	int a = 0;
	do
	{
		menu();
		scanf("%d", &a);
		if (a == 0)
		{
			break;
		}
		game();
	} while (a);
	return 0;
}

其中srand是为了求随机值,用来布置雷

2.game函数

主菜单完后进入game函数,在game函数里我们就要开始主要的游戏部分,如棋盘初始化与打印等,当然这些步骤都依靠函数完成,game函数只相当于集合了一系列的游戏模块

void game()
{
	char mine[ROWS][COLS];
	char show[ROWS][COLS];
	initeboard(mine, ROWS, COLS, '0');
	initeboard(show, ROWS, COLS, '*');//初始棋盘
	displayboard(show, ROW, COL);//打印棋盘
	mine_make(mine, ROW, COL);//设置雷
	//displayboard(mine, ROW, COL);
	find_mine(mine, show, ROWS, COLS);//排查雷

}

3.棋盘的初始化与打印

可以看到,我在game函数里初始了两个棋盘,为什么要两个呢?

其实,一个是为了放置了雷,一个为了展示给玩家,为什么不用一个呢,我们要在放雷处用'1',表示不放雷处用‘0',这样计算一个坐标周围雷的数量就会更简单,接下来看一段代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 10
#define COL 10
#define ROWS ROW+2
#define COLS COL+2

这里我们看到定义了一个ROWS和COLS这又是为何呢?

回归棋盘

 扫雷时当你确认一个点时,它会对此点周围的八个点进行排查看是否有泪,当坐标位于红线处时没有无法判断八个,因此有了ROWS与COLS,这时,有人就会问了:那埋雷的地方用ROW COL就可以了,还不用担心雷跑到外边我们加的框,想法很好,但我们有两个棋盘,必须对应,而且也不存在跑出雷的情况,往下分析你就会知道

void initeboard(char board[ROWS][COLS], int cols, int rows,char s)//棋盘初始化,此处用了个节省步骤的方法,不用两个棋盘依次初始化
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = s;
		}
	}
}
void displayboard(char board[ROWS][COLS], int row, int col)//棋盘打印
{
	int i = 0;
	int j = 0;
	printf(" ");//与行中打印的0%d对应
	for (j = 0; j <=col; j++)
	{
		printf(" %d  ", j);
	}
	printf("\n");
	printf("-");
	for (j = 1; j <= col + 1; j++)
	{
		printf("---");
		printf("|");
	}
	printf("\n");//列对应打印完成
	for (i = 1; i <= row; i++)
	{
		if (i <= 9)
		{
			printf(" 0%d ", i);
		}
		else
		printf(" %d ", i);
		printf("|");
		for (j = 1; j <= col; j++)
		{
			printf(" %c ", board[i][j]);
			printf("|");
		}
		printf("\n");
		printf("-");
		for (j = 1; j <= col+1; j++)
		{
			printf("---");
			printf("|");
		}
		printf("\n");//行对应嵌套在内部 打印的数前加0是为了让当行数大于9时能够对应 如09与10
	}
}

棋盘的打印做了行列对应,所以可能有点不明显

 4.雷的放置,雷的个数

雷的放置很简单,在棋盘‘0',处放置就行,因为我们对随机数的算式使随机数只会出现在0-9没有跑出的情况

mine_make(char mine[ROWS][COLS], int row, int col)//设置雷
{
	int count = 10;
	while (count)
	{
		int x = rand() % 10;
		int y = rand() % 10;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}
}

雷的个数就需要一定考虑了:

首先,我们需要把周围八个位置是否有雷,有多少个雷判断出来,这时我们设计‘0' ‘1'类型就排上用场了,但是注意,这是字符,不是数字

 一张表 让我们知道如何转型

当然返回的数字记得转成字符类型

int get_mine(char mine[ROWS][COLS], int i, int j)//得到一个坐标附近雷的个数
{
	return mine[i - 1][j - 1] + mine[i - 1][j] + mine[i - 1][j + 1] +
		mine[i][j - 1] + mine[i][j + 1] +
		mine[i + 1][j - 1] + mine[i +1 ][j] + mine[i + 1][j + 1] - 8 * '0';//此处我们的数字其实是字符,用此方法可以转为数字整形
}

5.递归实现一片效果

当不为雷是会展开附近一片不为雷,提高游戏效率

void spread(char show[ROWS][COLS], char mine[ROWS][COLS], int x, int y)//递归方法实现一大片
{
	show[x][y] = ' ';//先让输入金的坐标处变为空格,因为已经判定过雷所以可以直接转空格
	int i = 0;
	int j = 0;
	int ret = 0;
	for (i = x - 1; i <= x + 1; i++)
	{
		for (j = y - 1; j <= y + 1; j++)//嵌套for循环表示输入坐标包括自生及周围八个
		{
			if (i > 0 && i <= ROW && j > 0 && j <= COL && mine[i][j] != '1' && show[i][j] == '*')//防止出现负坐标,避免有雷,避免输入重复
			{
				ret = get_mine(mine, i, j);//判断ret是0或非0,并得出周围雷数
				if (!ret)//如果ret=0,!ret便是非0;为真
				{
					spread(show, mine, i, j);//递归
				}
				if (ret)//ret!=0时为真,便打印数
				{
					show[i][j] = ret + '0';//使数字转成对应字符
				}
			}

		}
	}
}

效果展示:

 6.排查雷

负责判断是否被炸死及游戏胜利

void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)//排查雷
{
	printf("请输入坐标\n");
	int i = 0;
	int j = 0;
	int win = 0;
	while (row*col-10)//因为是十个雷,所以是—10,因为下总数减10就赢了,所以可以以此跳出循环,当然要是雷部位10,定一个变量就行,此处就不改了
	{
		scanf("%d %d", &i, &j);
		if (mine[i][j] == '1')
		{
			printf("你挂了\n");
			displayboard(mine, ROW, COL);
			break;
		}
		else
		{
			show[i][j] = get_mine(mine, i, j)+'0';
			spread(show,mine, i, j);
			displayboard(show, ROW, COL);
			win++;
		}
	}
	if (win ==row * col - 10)
	{
		printf("恭喜你,成功了\n");
		displayboard(mine, ROW, COL);
	}
}

具体注释都在代码里了

正常情况把打印雷盘注释就行,就可以正常游戏了

 三.完整代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 10
#define COL 10
#define ROWS ROW+2
#define COLS COL+2
void menu()
{
	printf("------------------扫雷------------------\n");
	printf("---------------1.开始游戏---------------\n");
	printf("---------------0.退出游戏---------------\n");
}
void initeboard(char board[ROWS][COLS], int cols, int rows,char s)//棋盘初始化,此处用了个节省步骤的方法,不用两个棋盘依次初始化
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = s;
		}
	}
}
void displayboard(char board[ROWS][COLS], int row, int col)//棋盘打印
{
	int i = 0;
	int j = 0;
	printf(" ");//与行中打印的0%d对应
	for (j = 0; j <=col; j++)
	{
		printf(" %d  ", j);
	}
	printf("\n");
	printf("-");
	for (j = 1; j <= col + 1; j++)
	{
		printf("---");
		printf("|");
	}
	printf("\n");//列对应打印完成
	for (i = 1; i <= row; i++)
	{
		if (i <= 9)
		{
			printf(" 0%d ", i);
		}
		else
		printf(" %d ", i);
		printf("|");
		for (j = 1; j <= col; j++)
		{
			printf(" %c ", board[i][j]);
			printf("|");
		}
		printf("\n");
		printf("-");
		for (j = 1; j <= col+1; j++)
		{
			printf("---");
			printf("|");
		}
		printf("\n");//行对应嵌套在内部 打印的数前加0是为了让当行数大于9时能够对应 如09与10
	}
}
mine_make(char mine[ROWS][COLS], int row, int col)//设置雷
{
	int count = 10;
	while (count)
	{
		int x = rand() % 10;
		int y = rand() % 10;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}
}
int get_mine(char mine[ROWS][COLS], int i, int j)//得到一个坐标附近雷的个数
{
	return mine[i - 1][j - 1] + mine[i - 1][j] + mine[i - 1][j + 1] +
		mine[i][j - 1] + mine[i][j + 1] +
		mine[i + 1][j - 1] + mine[i +1 ][j] + mine[i + 1][j + 1] - 8 * '0';//此处我们的数字其实是字符,用此方法可以转为数字整形
}
void spread(char show[ROWS][COLS], char mine[ROWS][COLS], int x, int y)//递归方法实现一大片
{
	show[x][y] = ' ';//先让输入金的坐标处变为空格,因为已经判定过雷所以可以直接转空格
	int i = 0;
	int j = 0;
	int ret = 0;
	for (i = x - 1; i <= x + 1; i++)
	{
		for (j = y - 1; j <= y + 1; j++)//嵌套for循环表示输入坐标包括自生及周围八个
		{
			if (i > 0 && i <= ROW && j > 0 && j <= COL && mine[i][j] != '1' && show[i][j] == '*')//防止出现负坐标,避免有雷,避免输入重复
			{
				ret = get_mine(mine, i, j);//判断ret是0或非0,并得出周围雷数
				if (!ret)//如果ret=0,!ret便是非0;为真
				{
					spread(show, mine, i, j);//递归
				}
				if (ret)//ret!=0时为真,便打印数
				{
					show[i][j] = ret + '0';//使数字转成对应字符
				}
			}

		}
	}
}
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)//排查雷
{
	printf("请输入坐标\n");
	int i = 0;
	int j = 0;
	int win = 0;
	while (row*col-10)//因为是十个雷,所以是—10,因为下总数减10就赢了,所以可以以此跳出循环,当然要是雷部位10,定一个变量就行,此处就不改了
	{
		scanf("%d %d", &i, &j);
		if (mine[i][j] == '1')
		{
			printf("你挂了\n");
			displayboard(mine, ROW, COL);
			break;
		}
		else
		{
			show[i][j] = get_mine(mine, i, j)+'0';
			spread(show,mine, i, j);
			displayboard(show, ROW, COL);
			win++;
		}
	}
	if (win ==row * col - 10)
	{
		printf("恭喜你,成功了\n");
		displayboard(mine, ROW, COL);
	}
}
void game()
{
	char mine[ROWS][COLS];
	char show[ROWS][COLS];
	initeboard(mine, ROWS, COLS, '0');
	initeboard(show, ROWS, COLS, '*');//初始棋盘
	displayboard(show, ROW, COL);//打印棋盘
	mine_make(mine, ROW, COL);//设置雷
	displayboard(mine, ROW, COL);
	find_mine(mine, show, ROWS, COLS);//排查雷

}
int main()
{
	srand((unsigned int)time(NULL));
	int a = 0;
	do
	{
		menu();
		scanf("%d", &a);
		if (a == 0)
		{
			break;
		}
		game();
	} while (a);
	return 0;
}
    

总结

到此这篇关于c语言实现含递归清场版扫雷游戏的文章就介绍到这了,更多相关c语言实现扫雷内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言实现扫雷小游戏(适合初学者)

    扫雷小游戏作为初学c语言的小白有很大的帮助,其中用到了函数的定义,函数的声明,循环语句,数组思想等等知识,对于代码理解和设计代码思路有很大的帮助,本文就详细介绍了代码的各个步骤和运行结果.希望给到和我一样的小白一点帮助. //game.h头文件 #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 9//定义了界面的长宽,可以直更改ROW,COL的值,避免了程序中数字重复出现 #define

  • 基于C语言实现的扫雷游戏代码

    本文详细讲述了基于C语言实现的扫雷游戏代码,代码中备有比较详细的注释,便于读者阅读和理解.希望对学习游戏开发的朋友能有一点借鉴价值. 完整的实例代码如下: /* 模拟扫雷游戏 */ #include <graphics.h> #include <math.h> #include <stdio.h> #include <dos.h> #include <stdlib.h> #include <conio.h> #include <

  • C语言实现简易扫雷小游戏

    我们经常在电脑上面玩的扫雷游戏,很考验我们的判断能力,但是实现一个扫雷游戏并不是很困难,只要多注意一些细节就好,就可以将一个简单的扫雷游戏写出来! 接下来先介绍扫雷游戏要实现的功能: 首先,要对雷阵进行初始化,在初始化的时候要注意要定义两个数组,一个是让我们扫雷的阵,另外一个就是显示某一个地方的周围的雷的总个数的矩阵,在初始化的时候要注意为了避免传址的问题,我们把它写在主函数里面. char mine[rows][cols]; char show[rows][cols]; int i = 0;

  • C语言代码实现扫雷游戏

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下 该游戏我们也是利用数组完成,设置俩个数组一个mine数组,一个show数组. mine数组存放雷,show数组显示棋盘并且显示该位置是否有雷或者显示该位置周围有几个雷. 数组大小有讲究,我们宏定义变量 ROW COL 为9 定义ROWS COLS为11,我们显示的是9X9的棋盘,也是将雷设置在9X9的位置内,但是我们设置数组是设置11X11,因为这样方便我们遍历9X9棋盘四边位置上某位置四周雷的数目,不然的话会发生越界错

  • C语言实现扫雷小游戏(扩展版可选择游戏难度)

    游戏简介 扫雷,是一款益智类小游戏. 游戏目标是找出所有没有地雷的方格,完成游戏:要是按了有地雷的方格,游戏失败:玩家可标记雷的位置.游戏以完成时间来评高低.有不同的游戏难度可选择. 实现的功能介绍 1.计时 2.初始化雷盘 3.打印雷盘 4.随机设置雷的分布,可选择游戏难易程度 5.统计坐标位置周围的雷数 6.第一次排雷不会被炸死 7.扩展式排雷,展开周围的非雷区 8.给所选坐标位置做标记,或取消标记 该程序分为三个文件: 1.game.h :包含头文件的引用.函数的声明和宏定义 2.game

  • C语言实现简单扫雷小游戏

    本文实例为大家分享了C语言实现扫雷小游戏的具体代码,供大家参考,具体内容如下 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <windows.h> #include <time.h> /* 用 C 语言写一个简单的扫雷游戏 */ // 1.写一个游戏菜单 Menu() // 2.开始游戏 // 1.初始化二维数组 Init_Interface() // 2.打印游戏界面 Print_Interfa

  • C语言代码实现简单扫雷小游戏

    用C语言写一个简单的扫雷,供大家参考,具体内容如下 1.所需要的知识 c语言的基本语法,简单的二维数组,一点简单的递归知识. 2.总体思路 扫雷游戏主要由3个部分组成,埋雷子,扫雷,判断输赢. 扫雷游戏的主体是两个个字符类型的二维数组.一个是mine[][]它的构成是'0'和'1',其中'0'表示无雷,'1'表示有雷.一个是show[][]它的构成是'*'和'数字'.星号表示未开启的地方,数字表示周围的雷数.这里要注意的是:mine和show的实际大小是11x11,但是展示的效果是 9x9.这样

  • C语言开发简易版扫雷小游戏

    前言: 想起来做这个是因为那时候某天知道了原来黑框框里面的光标是可以控制的,而且又经常听人说起这个,就锻炼一下好了. 之前就完成了那1.0的版本,现在想放上来分享却发现有蛮多问题的,而且最重要的是没什么注释[果然那时候太年轻]!现在看了也是被那时候的自己逗笑了,就修改了一些小bug,增加了算是详尽而清楚的注释,嗯,MSDN上面对各种函数的解释很详细的[又锻炼一下英语],顺便让开头和结尾的展示"动"了起来,就当作1.5的版本好了. 这个只是给出了一个实现的思路,其中肯定也有很多不合理的地

  • C语言实现扫雷小游戏

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下 主函数:main.c #include "game.h" void Menu() { printf("##########################\n"); printf("##1.play 0.exit##########\n"); printf("##########################\n"); printf("##

  • c语言实现含递归清场版扫雷游戏

    目录 一,设计思路 二.实现方式 1.菜单的打印 2.game函数 3.棋盘的初始化与打印  4.雷的放置,雷的个数 5.递归实现一片效果  6.排查雷  三.完整代码 总结 一,设计思路 想必大家都玩过扫雷  这便是一个标准的扫雷,换做代码实现,我们需要考虑以下几点: 1.棋盘的设计与初始化 2.在棋盘中放入雷 3.统计雷数 4.如何实现"一片"的效果 5.输赢的判断 接下来我们进行具体操作. 二.实现方式 1.菜单的打印 对任意一个游戏,菜单是必不可少的,也是最简单的部分,直接上代

  • C语言实现递归版扫雷游戏实例

    目录 思路 清晰的逻辑 菜单 棋盘 布置雷 排雷 判断输赢 text.c实现 game.c实现 game.h实现 递归部分详解 总结 思路 清晰的逻辑 为方便将其分为三个文件:text.c(测试) game.c(函数实现) game.h(头文件声明) 在排雷的时候为了方便,我们需要将每一行每一列对应的行数,列数打印出来. #define LEI 10 #define ROW 10 #define LOW 10 #define ROWS ROW+2 #define LOWS LOW+2 //在定义

  • C语言版扫雷游戏

    本文实例为大家分享了C语言版扫雷游戏的具体代码,供大家参考,具体内容如下 1.思路 一.创建二维数组,来表示地图 每一个格子要表示的信息: 1.未翻开状态(草地)和已翻开状态(数字) 2.该格子是地雷或者不是地雷(1表示是地雷,0表示不是) 二.使用两个二维数组来分别表示以上的两种状态 第一个二维数组 char showMap[9][9];表示每个格子的翻开和未翻开状态 表示未翻开,字符'0'-'8'表示已翻开的数字 第二个二维数组 char mineMap[9][9];表示每个格子是否是地雷

  • C语言实现第一次防死版扫雷游戏

    目录 前言 一.功能描述 二.实现的步骤 1.菜单的打印函数: 2.初始化雷盘函数: 3.打印雷盘函数: 4.埋雷函数: 5.排雷函数: 6.防止第一次死的函数: 7.展开函数: 总结 前言 扫雷这款经典的游戏想必大多数人都玩过了,今天用C语言实现了扫雷小游戏,小伙伴们快来看看吧. 一.功能描述 扫雷代码有以下功能: 1.若输入的坐标周围没雷,可以直接展开 2.防止第一次玩就直接踩雷,被炸死 3.若输入的坐标周围有雷,会显示周围雷的个数 4.若排雷失败,会展示出雷图的雷分布是怎样的 二.实现的步

  • 利用java开发简易版扫雷游戏

    1.简介 学了几周的Java,闲来无事,写个乞丐版的扫雷,加强一下Java基础知识. 2.编写过程 编写这个游戏,一共经历了三个阶段,编写了三个版本的游戏代码. 第一版:完成了扫雷游戏的基本雏形,实现了游戏的基本功能,游戏运行在cmd黑窗口中,以字符绘制游戏界面,无图形化窗口,通过控制台输入字符完成游戏控制.代码放置在一个java文件中,代码的可读性以及可扩展性都比较差. 第二版:在第一版实现基本功能的基础之上,对游戏代码进行重构,根据各部分的功能创建多个类,增加代码注释,提高代码的可读性以及可

  • C++实现简易版扫雷游戏

    目录 一.菜单栏 二.创建棋盘数组 三.初始化棋盘 四.打印棋盘 五.布置雷 六.排查雷 七.全部代码 总结 一.菜单栏 1.先用printf函数制作一个简易版的菜单,并附上选项提示,玩游戏或者退出游戏 2.为了使玩家能选择玩或者不玩游戏,则采用do while循环比较合适,同时,借助switch case语句来进行选择 3.玩游戏的那个选项,只需调用game()函数即可 二.创建棋盘数组 为了便于修改棋盘大小,所以采用宏定义的方式定义其行与列 由于有三个信息:放置雷的的信息,周围雷的信息,以及

  • C++控制台版扫雷游戏

    本文实例为大家分享了C++控制台版扫雷游戏的具体代码,供大家参考,具体内容如下 先说思路,其实挺简单的. (1) 随机生成10个雷,标记到二维数组里,然后计算八个方向的雷的总数记录下来,这是预处理阶段. (2)输入要翻开的位置的坐标,如果是数字直接显示,是空白的话,这里采用bfs即宽度优先搜索解决,搜到最外层是数字(仅一层)时结束,具体详见代码. // 扫雷程序  #include <iostream> #include <string> #include <queue>

  • js版扫雷游戏

    本文实例为大家分享了js版扫雷游戏的具体代码,供大家参考,具体内容如下 界面 考虑到简单,一般,困难三个扫雷区域的格子数都不同,所以界面上的扫雷区域是用js动态生成.先搭好整体html框架: <div class="container">         <div class="level">             <button class="select">简单</button>       

  • C语言实现简易版扫雷游戏

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下 这个小项目源自两个月前学数组的时候,由于觉得比较重要,想记录一下. 首先,大概的思路是要做出两个二维数组充当棋盘,一个用于后台储存雷的情况,一个用于打印给玩家玩游戏 那么第一步我们知道,需要声明两个二维数组,一个打印出来给用户看,一个自己深埋在心里. 第二步应该是要埋雷,这里我们可以定义几个数值去让玩家选择埋雷的数量. 第三步也就是最难的扫雷部分了,我的思路是,首先玩家先输入一个坐标,我们再对玩家输入的坐标找到对应藏雷的

  • 利用c++和easyx图形库做一个低配版扫雷游戏

    游戏界面 由于这个游戏是我抱着玩一玩的心态做出来的,所以没有过多的去设计界面,也没有去找游戏的资源(图片.游戏音效等).仅使用了不同颜色的方块来表示游戏中方块的状态和种类.(绿色为初始状态(未翻转的状态),黄色为翻转后的背景颜色,蓝色表示已插旗的方块,红色代表地雷) 图1 游戏主菜单界面 图二 模式一的游戏界面(20*20 40个雷) 图三 模式二的游戏界面(10*10 20个雷) 图四 游戏成功界面 图五 游戏失败界面 2.全部代码 #include<graphics.h> #include

随机推荐