C语言编程之扫雷小游戏空白展开算法优化

目录
  • 写代码前,扫雷需要什么
  • 进行主函数文件的代码
  • game文件以及函数步骤
  • 在主函数文件中使用game函数
  • 布值棋盘(雷盘和玩家棋盘)
  • 打印棋盘函数
  • 玩家排雷
  • 计算雷数的函数
  • 空白递归算法

写代码前,扫雷需要什么

1,游戏需要初始选择菜单
2,需要布置两个棋盘,一个布置雷,一个展示给玩家看
3,打印棋盘
4,玩家要输入选择的坐标,并且可以多次输入游戏坐标
5,每次输入后打印棋盘,同时判断是否继续还是输赢。
6,玩家每次输入坐标,都进行一次递归展开。

进行主函数文件的代码

void option(int input)
{
	switch (input)//分支语句
	{
	case 1:
		game();//扫雷开始
		break;
	case 0:
		printf("Logon out the game\n");
		break;
	default:
		printf("Input error,please input again\n");
		break;
	}
}
void menu(void)
{
	printf("Welcome to game\n");
	printf("\n");
	printf("****************\n");
	printf("*----1.play----*\n");
	printf("*----0.exit----*\n");
	printf("****************\n");
}
int main(void)
{
	int input;
	srand((unsigned int)time(NULL));
	do
	{
		menu();//打印游戏菜单
		printf("please input option(1/0):>");
		scanf("%d", &input);
		option(input);//选项判断
	} while (input);

}

game文件以及函数步骤

#include <time.h>
#define ROW 9
#define COL 9
#define _CRT_SECURE_NO_WARNINGS
#define ROWS ROW+2
#define COLS COL+2
#define LEVEL 10
#include <stdio.h>
#include <stdio.h>
void game(void);//扫雷游戏
void setboard(char board[ROWS][COLS], int rows, int cols,char ret);//初始布置棋盘内容
void showboard(char board[ROWS][COLS], int rows, int cols);//负责打印棋盘
//void player(char board[ROWS][COLS]);//玩家输入
void setmine(char mine[ROWS][COLS], int row, int col);//布置地雷
int cleanmine(char board[ROWS][COLS], char mine[ROWS][COLS], int row, int col);
void space(char board[ROWS][COLS], char mine[ROWS][COLS], int x,int y);//空白递归算法
int test(char mine[ROWS][COLS], int x, int y);//计算周围雷数

在主函数文件中使用game函数

void game()
{
	char board[ROWS][COLS];
	char mine[ROWS][COLS];
	setboard(mine, ROWS, COLS,'0');//创建初始棋盘
	setmine(mine, ROW, COL);//布雷要在一次游戏开始时就布好雷,只布一次雷
	setboard(board, ROWS, COLS, '*');//给玩家看的棋盘
	while (1)
	{
		int ret;
		showboard(mine, ROW, COL);//打印布雷图
		showboard(board, ROW, COL);//打印玩家棋盘
		//player(board);
		ret=cleanmine(board,mine,ROW,COL);//扫雷
		//showboard(board, ROW, COL);
		int count = 0;//可以用一个函数进行封装
		for (int i = 1; i <= ROW; i++)
		{
			for (int j = 1; j <= COL; j++)
			{
				if (board[i][j] == '*')
					count++;
			}
		}
		if (count ==  LEVEL)
		{
			printf("you win\n");
			break;
		}
		if (ret == 0)
			break;
		system("cls");
	}
}

布值棋盘(雷盘和玩家棋盘)

void setboard(char board[ROWS][COLS], int rows, int cols,char ret)
{
	int i;//主要靠ret决定是布雷还是布置玩家棋盘
	for (i = 0; i < rows; i++)
	{
		int j;
		for (j = 0; j < cols; j++)
		{
			board[i][j] = ret;
		}
	}
}

打印棋盘函数

每次将棋盘重新定义后就可以打印,但是我们设置的棋盘要比打印的大两行,为了保证之后计算雷数的循环成立。

void showboard(char board[ROWS][COLS], int rows, int cols)
{
	for (int a = 0; a <= cols; a++)
		printf("%d ",a);
	printf("\n");
	int i;
	int a = 1;
	for (i = 1; i <= rows; i++)
	{
		printf("%d ", a++);
		int j;
		for (j = 1; j <= cols; j++)
		{
			printf("%c|", board[i][j]);
		}
		printf("\n");
	}
}

玩家排雷

int cleanmine(char board[ROWS][COLS],char mine[ROWS][COLS],int row,int col)
{
	int x, y;
	while (1)
	{
		printf("please input the coordinate:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '0')
			{
				board[x][y] = test(mine, x, y) + '0';
				//空白递归算法
				space(board, mine, x, y);
				//showboard(board, ROW, COL);
				break;
			}
			else if (mine[x][y] == '1')
			{
				printf("You died\n");
				return 0;
				break;
			}
		}
		else
			printf("Coordinate is illegal,please input again\n");
	}
	printf("player\n");
	//showboard(board, ROW, COL);
	return 1;
}

计算雷数的函数

int test(char mine[ROWS][COLS], int x, int y)
{
	int count = 0;
	for (int i = x - 1; i <= x + 1; i++)
	{
		for (int j = y - 1; j <= y + 1; j++)
		{
			if (mine[i][j] == '1')
				count++;
		}
	}
	return count;//count就代表返回的雷数
}

空白递归算法

void space(char board[ROWS][COLS], char mine[ROWS][COLS], int x, int y)
{
	int i;
	if(test(mine, x, y)==0)
	{
		board[x][y] = ' ';
		for (i = x-1; i <=x+1; i++)
		{
			int j;
			for (j = y-1; j <=y+1; j++)
			{
				if (i > 0 && i <= ROW && j > 0 && j <= COL && mine[i][j] != '1'&&board[i][j]=='*')
				{
					space(board, mine, i, j);
				}
			}
		}
	}
	else
		board[x][y] = '0' + test(mine, x, y);
}

要使用test函数去测试某个元素周围8个元素是不是雷,如果不是,就进入函数进行递归,里面用来循环来表示各个方向的元素

如果检测出来test不为0,就代表周围有雷,就else玩家棋盘定义为周围雷数,同时返回上一级函数。每一次递归都有两个for循环来递归检查各个方向上的元素。
就这些,如有问题,烦请大佬指点一二

以上就是C语言编程之扫雷小游戏空白展开算法优化的详细内容,更多关于C语言空白展开算法的资料请关注我们其它相关文章!

(0)

相关推荐

  • C语言实现扫雷算法简易版

    扫雷分析 从小到大你或许没玩过但一定听过的游戏--扫雷 首先我们来分一下"扫雷"的功能 这是一个简单难度的扫雷,从外观上,我们可以发现可供用户操作的棋盘范围是9×9的范围,也就是我们建立的棋盘大小至少要为9,但是问题也就来了,我们如果只建立9×9的棋盘,那么在边缘的格子要进行提示操作的时候就会出现数据越界问题. 为了解决数据越界的问题,我们最好创建一个比可视界面大一圈的数组,即11×11的数组 但是在我们开始做这个小游戏的时候发现了一个问题--一个数组里面包含的数据太多了,可能会发生数

  • C语言实现扫雷游戏及其优化

    本文实例为大家分享了C语言实现扫雷游戏及其优化的具体代码,供大家参考,具体内容如下 关于扫雷优化 1.核心思想:使用两个二维数组进行设计,一个用于显示,一个用于后台雷的布置. 2.使用宏常量,后期可以任意修改游戏难度. 3.关于扫雷拓展模块,目前使用的方法比较low,若周围均没有,则全部显示. 4.剩余位置数使用全局变量count,必须考虑拓展之后count变化. 有待改进之处 1.需设计标记雷的步骤,增加用户体验. 2.拓展方式有待改进. 3.界面布局仍需要进行优化. 扫雷游戏代码 #incl

  • C语言实现扫雷游戏详解

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下 功能设计 扫雷大家应该都玩过,这是一个十分经典的游戏,今天我将给大家讲解如何用C语言实现扫雷,我的这个扫雷有如下几个功能: 1.显示该点周围雷的个数 2.第一次下子,不炸死 3.坐标周围没雷,可以实现展开 4.游戏结束后展示玩家用时 效果展示 话不多说,先附上效果图: 设计思路 我们只要输入坐标就可以扫雷了,是不是很有趣? 其实要想实现这也不难,我们要用几个算法模块来模拟游戏规则,需要用函数来调用各个模块使游戏跑起来.

  • C语言版扫雷小游戏

    本文实例为大家分享了C语言版扫雷小游戏的具体代码,供大家参考,具体内容如下 一.游戏功能 1.显示该点周围雷的个数 2.第一次下子,不炸死 3.坐标周围没雷,可以实现展开 二.效果展示 三.设计思路 这里由于博主目前能力有限,所以这里就用输入坐标的形式来进行排雷. 要想实现上方游戏功能其实也不难,总体思路就是:我们用几个算法模块来模拟游戏规则,实现上方的功能,然后用函数来调用各个模块使游戏跑起来. 接下来我们就来看看如何用C语言代码来实现游戏吧! 四.游戏实现步骤 1.游戏菜单 首先我们需要打印

  • C语言 扫雷程序的实现

    C语言 扫雷程序的实现 这个游戏可以实现根据选择坐标后所显示无雷区范围的不同分为简单 ,普通和困难 游戏程序中,实现了游戏的计时(分钟)功能,实现了扫雷游戏的最基础功能. 定义了一个9*9的棋盘,玩家只要根据提示选择游戏,和难度: 根据提示输入 合法的坐标,如输入不合法则会进行提示: 扫雷结束则会提示:如触雷则游戏自动结束: 整个游戏设计中主要的函数为: 1.初始化地雷棋盘和显示棋盘 2.棋盘打印函数 3.扫雷函数的实现 4.游戏主函数 大家可以在宏定义中改变棋盘大小,雷的个数,以及显示的无雷区

  • C语言模拟实现扫雷游戏

    扫雷是Windows系统的经典游戏,下文将利用c语言实现这个经典的小游戏.本版本程序添加了炸弹标记功能.但由于作者水平实现较为死板,此处留坑待以后学习后改进. Part 1主函数部分: 此部分主要提供用户界面,不同程序均可利用: int main() { srand((unsigned int)time(NULL)); int input = 0; do { menu(); printf("请选择:>\n"); scanf("%d", &input);

  • C语言编程之扫雷小游戏空白展开算法优化

    目录 写代码前,扫雷需要什么 进行主函数文件的代码 game文件以及函数步骤 在主函数文件中使用game函数 布值棋盘(雷盘和玩家棋盘) 打印棋盘函数 玩家排雷 计算雷数的函数 空白递归算法 写代码前,扫雷需要什么 1,游戏需要初始选择菜单 2,需要布置两个棋盘,一个布置雷,一个展示给玩家看 3,打印棋盘 4,玩家要输入选择的坐标,并且可以多次输入游戏坐标 5,每次输入后打印棋盘,同时判断是否继续还是输赢. 6,玩家每次输入坐标,都进行一次递归展开. 进行主函数文件的代码 void option

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

    本文实例为大家分享了C语言简单实现扫雷小游戏 的具体代码,供大家参考,具体内容如下 游戏规则: 以9*9棋盘为例,棋盘上随机分布着10个地雷,玩家在棋盘上进行点击,如果被点击的格子是地雷,则玩家被炸"死",游戏结束:如果被点击的格子上没有地雷,与被点击的格子相邻的格子(被点击格子的上下左右还有斜向,共八个格子)有地雷,则在被点击的格子上显示这些地雷的总数,如果与被点击的格子相邻的八个格子都没有地雷,则棋盘自动展开,直到与展开的格子相邻的格子有地雷才停止.此时最后被展开的格子显示其相邻格

  • C语言实现控制台扫雷小游戏

    C语言实现控制台"扫雷"小游戏 根据以往的游戏经验,我们能首先可以确定扫雷游戏胜利的规则是:翻开所有不是雷的区域才能算是胜利. 接下来我们需要确定整个程序的设计思路: 1.首先,我们定义两个9*9的二维数还是未翻开的状态组.第一个数组用来表示雷区地图的展开情况,即每个素组元素的位置的状态是处于展开状态还是未展开状态,我们命名为showMap().第二个数组我们用来表示地雷的分布情况,素组中的每个元素位置都被标记为是否为地雷,我们命名为minMap(). 2.初始化两个地图,并将地图打印

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

    本文实例为大家分享了C语言简单实现扫雷小游戏的具体代码,供大家参考,具体内容如下 设计思路 1. 定义两个二维数组,一个存放炸弹信息,一个隐藏信息后向玩家展示. 2. 玩家每一次选择都要判断是否踩到炸弹,如果踩雷,将结束游戏,否则继续游戏. 3.玩家每一次判断后要将新棋盘展示给玩家,且将该位置附近雷的个数展示出来. 4.最后如果玩家找到所有非雷区时,玩家获胜. 首先,我们设计一个简单的主函数 方便玩家自由选择进入游戏与退出游戏 int main() { int input = 0; srand(

  • 用C语言实现一个扫雷小游戏

    本文实例为大家分享了C语言实现一个扫雷小游戏的具体代码,供大家参考,具体内容如下 一.全部源码 //棋盘大小 #define ROW 9 #define COL 9 //棋盘加边缘坐标大小 #define ROWS 10 #define COLS 10 #define EASY_COUNT 10//雷的数量 #include <stdio.h> #include<stdlib.h> #include<time.h> void InitBoard(char board[R

  • C语言实现经典扫雷小游戏的示例代码

    目录 一.游戏简介 二.游戏实现 1.初始化棋盘 2.打印棋盘 3.布置雷 4.排查雷 三.源文件 1.game.h 2.game.c 3.Test.c 一.游戏简介 游戏初始界面有两个选择,选项“1”为开始游戏,选项“0”为退出游戏:选择开始游戏之后将会打印出9*9的棋盘,此时系统已经为游戏设置了10个雷,输入坐标之后将会打印出此坐标周围八个位置有几个雷,如果踩到了雷,那么游戏结束,打印出所有雷的位置. 二.游戏实现 1.初始化棋盘 void InitBoard(char board[ROWS

  • C语言实现经典扫雷小游戏完整代码(递归展开 + 选择标记)

    目录 游戏介绍 游戏整体框架 游戏具体功能及实现 1.雷盘的定义 2.雷盘的初始化 3.布置雷 4.排查雷 5.递归式展开一片 6.获取周围雷的个数 7.标记特定位置 8.打印雷盘 游戏完整代码 1.test.c 2.game.h 3.game.c 游戏效果展示 大家好,今天我们将一起用C语言实现一个经典小游戏 – 扫雷,Let is go ! 游戏介绍 扫雷游戏相信大家都玩过,上图就是一个网页版的扫雷,它的规则是玩家选择一个方格,若此方格没有地雷,那么该方格会显示与它相邻的八个方格中雷的个数,

  • 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语言实现扫雷小游戏的具体代码,供大家参考,具体内容如下 主页面: 游戏页面: 虽然页面比较low,但我已经尽力了 具体代码实现: #include<stdio.h> #include<windows.h> #include<conio.h> #include<stdlib.h> #include<time.h> int n;//记录已经探索的区域数 int x,y;//光标的横纵坐标 int T;//判断游戏是否失败,T=1

  • C语言练习之扫雷小游戏

    本文实例为大家分享了C语言实现扫雷小游戏的具体代码,供大家参考,具体内容如下 *1.设计思路与实现要求 (1)创建两个二维数组 9x9 ,一个表示显示地图数组showMap-未翻开状态,一个内部设置雷的状态地图mineMap表示-翻开状态) (2)初始化这两个数组,使showMap数组元素全为字符 '#';使mineMap数组元素随机生成10个1表示地雷位置,其余全为0的表示安全位置. (3)打印地图 (4)用户进行扫雷(输入想翻开位置的数组下标row col) (5)判断是否踩雷(如果输入数组

随机推荐