数组的应用实例2:扫雷

1、分模块的写法

首先,我先介绍一下分模块的写法。我们一般分为三个模块

头文件:game.h 这里包含着对函数的声明

源文件:   game.h 这里包含着对函数的实现

源文件:test.c     这里就是调用函数的部分也就是主函数在的地方(记得包含文件)


2、扫雷的思路 

首先,我们要明白在写这种比较长的程序时一定要从主函数开始顺着往下写

1、既然是游戏那我们必然得先有一个菜单,此时就有了menu函数

2、有了菜单,玩家就会输入,这样接受了输入后,就要对他不同的输入值做出不同的反应。这样就用switch函数来进行分流。因为需要进行区分继续玩还是直接退出于是在switch外有套了一层循环。

3、选择了0,直接退出。选了1,那么进行游戏调用game()函数,来进行游戏。
 


3、源代码

下面为你们展示原代码:如需要可以自己复制使用(但是记得分文件)

game.h

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

#define ROW 9
#define COL 9

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

#define Easy 10

//初始化棋盘
void InitBoard(char Board[ROWS][COLS], int row, int col, char sz);
//打印棋盘
void DisplayBoard(char Board[ROWS][COLS], int row, int col);
//布置雷
void SetMine(char Board[ROWS][COLS], int row, int col);
//扫雷
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS], int row,int col);

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

void InitBoard(char Board[ROWS][COLS], int row, int col, char sz)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			Board[i][j] = sz;
		}
	}
}

void DisplayBoard(char Board[ROWS][COLS], int row, int col)
{

	int i = 0;
	int j = 0;

	printf("-------扫雷游戏------\n");
	for (i = 0; i <=col; 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");



	}
}

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

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

{
	return((mine[x - 1][y - 1] + mine[x - 1][y + 1] + mine[x - 1][y] + mine[x][y] + mine[x][y + 1] + mine[x][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] + mine[x + 1][y - 1]) - 8 * '0');
}

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	printf("请输入要排雷的坐标>:");
	int x = 0;
	int y = 0;
	int count = ROW * COL - Easy;
	
	
	while (count)
	{
		char sta;
		scanf("%d %d", &x, &y);


		if (x >= 1 && x <= 9 && y >= 1 && y <= 9)
		{
			char sta;


			if (mine[x][y] == '0')
			{
				sta = Sta_Mine(mine, x, y);

				if (show[x][y] == '*')
				{
					show[x][y] = sta;
					count--;
					DisplayBoard(show, row, col);

				}
				else
				{
					printf("这个坐标已经被排查过\n");
				}

			}
			else
			{
				printf("你被炸死了\n");
				break;

			}
		}
		else
		{
			printf("输入错误坐标,请重新输入\n");
		}

	}
	if (count == 0)
	{
		printf("恭喜你,扫雷成功\n");
	}
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
	printf("***************************\n");
	printf("********1.play*************\n");
	printf("********2.exit*************\n");
	printf("***************************\n");
	printf("***************************\n");
}

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

	//打印棋盘
	//DisplayBoard(mine, ROW, COL);
	DisplayBoard(show, ROW, COL);

	//布置雷
	SetMine(mine, ROW, COL);

	//打印棋盘
	//DisplayBoard(mine, ROW, COL);
	//DisplayBoard(show, ROW, COL);

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


}

4、算法

下面为你们分析一下各个函数的算法,也game()函数的思路

这里的代码我运用了两个数组来分别存放信息,其中一个mine数组用来存放雷,还有一个show数组来存放排查出来雷的信息(即周围有几个雷)

然后再mine函数中用字符‘1’来表示有雷,字符‘0’表示没雷。


4.1初始化

一开始先初始化,将数组中的内容全部归为最初始的情况

void InitBoard(char Board[ROWS][COLS], int row, int col, char sz)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			Board[i][j] = sz;
		}
	}
}

4.2打印扫雷界面

直接利用两层循环打印出show函数

void DisplayBoard(char Board[ROWS][COLS], int row, int col)
{

	int i = 0;
	int j = 0;

	printf("-------扫雷游戏------\n");
	for (i = 0; i <=col; 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");



	}
}

4.3随机设置雷

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

4.4玩家开始排雷

注意:坐标对不对,坐标是不是空的

这是一个较为集成的函数,

1.开始排雷,对结果进行分流

2.利用Sta_Mine函数对周围的雷进行统计

3.利用成功排雷的次数累加,来判断是否完成游戏

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

{
	return((mine[x - 1][y - 1] + mine[x - 1][y + 1] + mine[x - 1][y] + mine[x][y] + mine[x][y + 1] + mine[x][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] + mine[x + 1][y - 1]) - 8 * '0');
}

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	printf("请输入要排雷的坐标>:");
	int x = 0;
	int y = 0;
	int count = ROW * COL - Easy;
	
	
	while (count)
	{
		char sta;
		scanf("%d %d", &x, &y);


		if (x >= 1 && x <= 9 && y >= 1 && y <= 9)
		{
			char sta;


			if (mine[x][y] == '0')
			{
				sta = Sta_Mine(mine, x, y);

				if (show[x][y] == '*')
				{
					show[x][y] = sta;
					count--;
					DisplayBoard(show, row, col);

				}
				else
				{
					printf("这个坐标已经被排查过\n");
				}

			}
			else
			{
				printf("你被炸死了\n");
				break;

			}
		}
		else
		{
			printf("输入错误坐标,请重新输入\n");
		}

	}
	if (count == 0)
	{
		printf("恭喜你,扫雷成功\n");
	}
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值