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

要想实现扫雷游戏的实现,首先我们要理解它的逻辑:

当我们要进行扫雷,首先我们要有一块雷区。

我们初步定义这块雷区大小为9x9.

接下来,我们随机向里面放置10个雷:

现在,我们有了棋盘,布置了雷,可以进行排雷了。

那么对于我们排雷有两种情况:

1.我们排到0,即无雷区,便展示周围雷的个数;

2.我们排到1,即有雷区

对于第二种情况,我们踩雷了,即结束游戏。

那么来看第一种情况:这时我们将周围雷的个数打印出来。

比如第一次我们选择坐标(3,4):

从图上我们可以看出在坐标(3,4)的周围只有一个雷,这时候我们在棋盘上打印1。

如何计算周围雷的个数?

当我们要计算(6,3)——第六列第三行这个区域周围雷的信息,最简单的方式就是将周围的数值加起来并且输出,即(5,2)+(6,2)+(7,2)+(5,3)+(7,3)+(5,4)+(6,4)+(7,4)=3;

但这时,这个3就占据了原先0的位置,产生混淆。于是我们需要一个新的棋盘——一个专门显示信息给玩家看的棋盘。


这样完成了我们排雷的基本逻辑。

但是,一个很关键的地方:

在边角我们怎么去计算周围雷的个数呢?

为了方便计算,并且避免溢出,这时候我们就需要两个11x11的棋盘。

(为了方便以及游戏体验,我们将展示图的每个区域放上星号)

大概游戏思路我们已经完成,那么如何用程序实现它呢?

  1. 创建雷区和展示区

我们可以建立两个11x11大小的数组(为了与星号统一格式,0、1都用字符形式)

这里的Rows和Cols大小都为11:

char mine[Rows][Cols] = { 0 };
char show[Rows][Cols] = { 0 };

2.我们再设计函数对其进行初始化

createTable(mine, Rows,Cols,'0');
createTable(show, Rows, Cols, '*');
void createTable(char arr[Rows][Cols], int rows, int cols, char set)
{
	int i, j;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			arr[i][j] = set;
		}
	}
}

3.此时我们已经初始化好了两个区域,现在利用随机数函数在雷区中随机创建10个雷

void creatBoom(char arr[Rows][Cols], int row, int col)
{
	int ret = 0;
	int i, j;

	while (ret<10)
	{
		
		i = rand() % 9 + 1;
		j = rand() % 9 + 1;
		if (arr[i][j] == '0')
		{
			arr[i][j] = '0' + 1;
			ret++;
		}
		
	}
	
}

4.创造好了展示棋盘区以及雷区,现在我们还需要一个函数用来打印棋盘

void displayTable(char arr[Rows][Cols], int row, int col)
{
	int i, j;
	printf("  ");
	for (i = 1; 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 ", arr[i][j]);
		}
		printf("\n");
	}
}

5.现在就是再设计一个函数用于进行游戏

void startBoom(char arr[Rows][Cols], char arr1[Rows][Cols])
{
	int r, c,win=0;
	do
	{
		Sleep(250);
		system("cls");
		displayTable(arr1, Row, Col);
		
		
		
			int select = 0;
			printf("请输入您的游戏操作:\n");
			printf("1.排雷\n");
			printf("2.标记雷区\n");
			scanf("%d", &select);
			if (select == 1)
			{
				printf("请输入您要猜的位置:\n");
				scanf("%d %d", &r, &c);
				if (arr[r][c] == '1')
				{
					printf("很遗憾,您踩雷了!游戏结束!\n");
					printf("现在公布雷区:\n");
					displayTable(arr, Row, Col);
					break;
				}
				else if (arr[r][c] = '0')
				{

					int inf = 0;
					inf = arr[r - 1][c - 1] + arr[r - 1][c] + arr[r - 1][c + 1] + arr[r][c - 1] + arr[r][c + 1] + arr[r + 1][c - 1] + arr[r + 1][c] + arr[r + 1][c + 1] - '0' * 8;
					arr1[r][c] = inf + '0';
					win++;
					if (win == 71)
						printf("恭喜您!排雷成功!\n");
				}
				else if (r < 1 || c < 1 || r>9 || c>9)
					printf("输入错误,请重新输入!\n");
				else
					printf("无效输入,请重新输入!\n");
			}
			else if (select == 2)
			{
				markBoom(arr1);
			}
			else
			{
				printf("输入错误,请重新输入\n");
			}
		



			
		
		
	} while (win <71);
		
}

全部游戏过程讲解完毕,现在附上完整源码,加入了标记雷的函数:

testgame.c源文件代码如下:

#include "game.h"

 

void menu()
{
	printf("---------------------------\n");
	printf("           开始游戏        \n");
	printf("---------------------------\n");
}



void game()
{
	
	char mine[Rows][Cols] = { 0 };
	char show[Rows][Cols] = { 0 };
	createTable(mine, Rows,Cols,'0');
	createTable(show, Rows, Cols, '*');
	creatBoom(mine, Row, Col);
	//displayTable(mine, Row, Col);gameMenu();
	startBoom(mine, show);
	//displayTable(mine, Row, Col);
	//displayTable(show, Row, Col);
}
void midGame() {
	char mine1[Rows1][Cols1] = { 0 };
	char show1[Rows1][Cols1] = { 0 };
	createTable1(mine1, Rows1, Cols1, '0');
	createTable1(show1, Rows1, Cols1, '*');
	creatBoom1(mine1, Row1, Col1);
	//displayTable(mine, Row, Col);gameMenu();
	startBoom1(mine1, show1);
	//displayTable(mine, Row, Col);
	//displayTable(show, Row, Col);
}
void gameTest()
{
	srand((unsigned int)time(NULL));
	int input=0;
	int choose;
	do {
		menu();
			printf("请选择->\n");
			printf("选择1开始游戏:\n");
			printf("选择0退出游戏:\n");
			scanf("%d",&input);
			switch (input)
			{
			case 1:
				do
				{
					 choose = 0;
					printf("请选择游戏难度:\n");
					printf("1.简单\n");
					printf("2.中等\n");
					printf("3.困难\n");
					scanf("%d", &choose);
					switch (choose)
					{
					case 1:
						game();
						break;
					case 2:
						midGame();
						break;
					default:
						printf("输出错误,请重新选择!\n");
						break;
					}
				} while (choose == 1 || choose == 2);
				printf("正在进入游戏...");
				Sleep(1000);

				break;
			case 0:
				break;
			default:
				printf("输出错误,请重新选择!\n");
				break;
			}
			


	} while (input);
}

int main()
{
	gameTest();
	return 0;
}

game.c源文件代码如下:

#include "game.h"

void createTable(char arr[Rows][Cols], int rows, int cols, char set)
{
	int i, j;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			arr[i][j] = set;
		}
	}
}

void displayTable(char arr[Rows][Cols], int row, int col)
{
	int i, j;
	printf("  ");
	for (i = 1; 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 ", arr[i][j]);
		}
		printf("\n");
	}
}

void creatBoom(char arr[Rows][Cols], int row, int col)
{
	int ret = 0;
	int i, j;

	while (ret<10)
	{
		
		i = rand() % 9 + 1;
		j = rand() % 9 + 1;
		if (arr[i][j] == '0')
		{
			arr[i][j] = '0' + 1;
			ret++;
		}
		
	}
	
}

void startBoom(char arr[Rows][Cols], char arr1[Rows][Cols])
{
	int r, c,win=0;
	do
	{
		Sleep(250);
		system("cls");
		displayTable(arr1, Row, Col);
		
		
		
			int select = 0;
			printf("请输入您的游戏操作:\n");
			printf("1.排雷\n");
			printf("2.标记雷区\n");
			scanf("%d", &select);
			if (select == 1)
			{
				printf("请输入您要猜的位置:\n");
				scanf("%d %d", &r, &c);
				if (arr[r][c] == '1')
				{
					printf("很遗憾,您踩雷了!游戏结束!\n");
					printf("现在公布雷区:\n");
					displayTable(arr, Row, Col);
					break;
				}
				else if (arr[r][c] = '0')
				{

					int inf = 0;
					inf = arr[r - 1][c - 1] + arr[r - 1][c] + arr[r - 1][c + 1] + arr[r][c - 1] + arr[r][c + 1] + arr[r + 1][c - 1] + arr[r + 1][c] + arr[r + 1][c + 1] - '0' * 8;
					arr1[r][c] = inf + '0';
					win++;
					if (win == 71)
						printf("恭喜您!排雷成功!\n");
				}
				else if (r < 1 || c < 1 || r>9 || c>9)
					printf("输入错误,请重新输入!\n");
				else
					printf("无效输入,请重新输入!\n");
			}
			else if (select == 2)
			{
				markBoom(arr1);
			}
			else
			{
				printf("输入错误,请重新输入\n");
			}
		



			
		
		
	} while (win <71);
		
}


void markBoom(char arr[Rows][Cols])
{
	int i=0,j=0;
	printf("请输入您想标记的位置\n");
	scanf("%d %d", &i, &j);
	if ((i < 1 || i>9) || (j < 1 || j>9))
	{
		printf("无效输入,请重新输入\n");
	}
	else if (arr[i][j] == '*')
	{
		arr[i][j] = '#';
	}
	
	
}








void createTable1(char arr[Rows1][Cols1], int rows, int cols, char set)
{
	int i, j;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			arr[i][j] = set;
		}
	}
}

void displayTable1(char arr[Rows1][Cols1], int row, int col)
{
	int i, j;
	printf("    ");
	for (i = 1; i <= row; i++)
	{
		printf("%3d ", i);
	}
	printf("\n");

	for (i = 1; i <= row; i++)
	{
		printf("%3d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%3c ", arr[i][j]);
		}
		printf("\n");
	}
}

void creatBoom1(char arr[Rows1][Cols1], int row, int col)
{
	int ret = 0;
	int i, j;

	while (ret < 10)
	{

		i = rand() % 16 + 1;
		j = rand() % 16 + 1;
		if (arr[i][j] == '0')
		{
			arr[i][j] = '0' + 1;
			ret++;
		}

	}

}

void startBoom1(char arr[Rows1][Cols1], char arr1[Rows1][Cols1])
{
	int r, c, win = 0;
	do
	{
		
		system("cls");
		displayTable1(arr1, Row1, Col1);



		char select = 0;
		printf("请输入您的游戏操作(输入#标记雷区):\n");
		printf("1.排雷\n");
		printf("#.标记雷区\n");
		scanf("%c", &select);
		if (select == '1')
		{
			printf("请输入您要猜的位置:\n");
			scanf("%d %d", &r, &c);
			if (arr[r][c] == '1')
			{
				printf("很遗憾,您踩雷了!游戏结束!\n");
				printf("现在公布雷区:\n");
				displayTable(arr, Row, Col);
				break;
			}
			else if (arr[r][c] = '0')
			{

				int inf = 0;
				inf = arr[r - 1][c - 1] + arr[r - 1][c] + arr[r - 1][c + 1] + arr[r][c - 1] + arr[r][c + 1] + arr[r + 1][c - 1] + arr[r + 1][c] + arr[r + 1][c + 1] - '0' * 8;
				arr1[r][c] = inf + '0';
				win++;
				if (win == 216)
					printf("恭喜您!排雷成功!\n");
			}
			else if (r < 1 || c < 1 || r>16 || c>16)
				printf("输入错误,请重新输入!\n");
			else
				printf("无效输入,请重新输入!\n");
		}
		else if (select == '#')
		{
			markBoom1(arr1);
		}
		







	} while (win < 216);

}


void markBoom1(char arr[Rows1][Cols1])
{
	int i = 0, j = 0;
	printf("请输入您想标记的位置\n");
	scanf("%d %d", &i, &j);

	if ((i < 1 || i>16) || (j < 1 || j>16))
	{
		printf("无效输入\n");
	}
	else if (arr[i][j] == '*')
	{
		arr[i][j] = '#';
	}


}

game.h头文件源码如下:

#include<stdio.h>
#include<stdlib.h>

#define Row 9
#define Col 9
#define Rows Row+2
#define Cols Col+2

#define Row1 16
#define Col1 16
#define Rows1 Row1+2
#define Cols1 Col1+2



void createTable(char arr[Rows][Cols], int rows, int cols, char set);
void displayTable(char arr[Rows][Cols],int row,int col);
void creatBoom(char arr[Rows][Cols], int row, int col);
void startBoom(char arr[Rows][Cols], char arr1[Rows][Cols]);
void markBoom(char arr[Rows][Cols]);


void createTable1(char arr[Rows1][Cols1], int rows, int cols, char set);
void displayTable1(char arr[Rows1][Cols], int row, int col);
void creatBoom1(char arr[Rows1][Cols1], int row, int col);
void startBoom1(char arr[Rows1][Cols1], char arr1[Rows1][Cols1]);
void markBoom1(char arr[Rows1][Cols1]);


如果这篇文章对你有帮助,请留下您的珍贵评论点赞+收藏,这将是我前进的动力!!学海无涯,共勉!

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值