c语言扫雷

1.扫雷游戏规则

随机点开一个格子,可能会出现雷,数字,若点开的数字是1,则表明该格子周围一圈八个格子有一个雷,如果点到雷游戏结束,如果点完所有非雷部分的格子,则扫雷成功!!

2.游戏各部分功能实现的函数 

 

void menu()//菜单函数
void find_mine(char mine[][11], char show[][11], int row, int col);//排查雷函数
void  Initboard(char arr[][11], int rows,int cols,char set);//初始化函数
void Printboard(char arr[][11], int row, int col);//打印函数
void Set_mine(char arr[][11], int row, int col);//设置雷的函数

3.游戏菜单页面 

void menu()
void menu()
{
	printf("***********************************************\n");
	printf("******************扫雷游戏*********************\n");
	printf("***********************************************\n");
	printf("****************1.开始游戏*********************\n");
	printf("***********************************************\n");
	printf("****************0.退出游戏*********************\n");
	printf("***********************************************\n");
	printf("***********************************************\n");
}

4.游戏实现函数 

void game()
{
	char mine[11][11] = { 0 };
	char show[11][11] = { 0 };
	Initboard(mine, ROWS, COLS, '0');
	Initboard(show, ROWS, COLS, '*');
	//Printboard(mine, ROW, COL);
	//Printboard(show,ROW, COL);
	Set_mine(mine, ROW, COL);
	Printboard(mine, ROW, COL);
	find_mine(mine, show, ROW, COL);

}

5.测试函数(界面选择测试函数)

void test()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择->\n");
		scanf_s("%d", &input);
		switch (input)
		{case 1:
			game();
			break;
		case 0:
			printf("游戏已退出,谢谢使用!!!!\n");
			break;
		default:
			printf("输入错误,请重新选择\n");

		}
       } while (input);

}

6.主函数

int main()
{
	srand((unsigned int)time(NULL));
	test();
	return 0;
}

 7.游戏实现函数各部分

game.h头文件声明游戏实现函数各部分

#pragma once
#include 
#include 
#include 
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
void find_mine(char mine[][11], char show[][11], int row, int col);//排查雷函数
void  Initboard(char arr[][11], int rows,int cols,char set);//初始化函数
void Printboard(char arr[][11], int row, int col);//打印函数
void Set_mine(char arr[][11], int row, int col);//设置雷的函数

game.c实现各个游戏功能

void Initboard(char arr[][11], int rows,int  cols, char set)//初始化函数
{int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
	for (j = 0; j < cols; j++)
	{
		arr[i][j] = set;}
}
}

 游戏的实现方法,mine二维数组里存放的是雷的信息,show二维数组里展示的是游戏的运行信息,首先初始化show数组里面放入字符*表示未点开,而mine数组里存放的全是0,表示还未设置雷。(数组用的为11*11,防止越界,打印只打印中间的9*9

void Printboard(char arr[][11], int row, int col)//打印函数
{
	int i = 0;
	int j = 0;
	printf("---------------------扫雷游戏------------------\n");
	for (j = 0; j <= col; j++)
	{
		printf("%d ", j);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <=col; j++)
		{
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
	printf("---------------------扫雷游戏------------------\n");
}

 打印函数,为了更方便确定位置坐标,在打印的前1行,前一列打印出数字。此时加上分割符会更加清晰,美观且容易区分。

测试结果c语言扫雷_第1张图片

 

void Set_mine(char arr[][11], int row, int col)
{
	int count = 10;//雷的个数
	int x = 0;
	int y = 0;
	
	while (count)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;

		if (arr[x][y] == '0')
		{
			arr[x][y] = '1';
			count--;
        }
}
}

设置雷的函数

 定义设置雷的横纵坐标x,y;while循环一次只设置一个雷,每次设置完count--;直到十个雷设置完成;随机的产生随机数对9取余得到的是0~8的数,然后+1,得到1~9的数,在mine数组中如果没有设置雷,则为字符0,产生随机数头文件应包括

#include 
#include 

产生随机数必须在主函数

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

测试结果c语言扫雷_第2张图片

图中的1为 随机数生成雷的位置

void find_mine(char mine[][11], char show[][11], int row, int col)
{
	int win = 0;
	int x = 0;
	int y = 0;
	while (win= 1 && x <= 9 && y >= 1 && y <= 9)
		{
			if (mine[x][y] == '1')
			{
				printf("你踩到雷了\n");
				Printboard(mine, ROW, COL);
				break;
			}
			else
			{
				int num = getcount(mine, x, y);
				show[x][y] = num + '0';
				Printboard(show, ROW, COL);
				win++;
			}
		}
        else
		{
			printf("输入坐标不合法\n");
		}
	}
	if (win == row * col - 10)
	{
		printf("扫雷成功,真牛啊你小子\n");
		Printboard(show, ROW, COL);
	}
}

 扫雷函数

电脑输入合法的坐标,如果在mine数组中该坐标有雷,则游戏结束,打印出mine数组让玩家可以看到哪里有雷,并且从循环中退出来,如果该坐标没有雷,则此时调用

int getcount(char mine[][11], int x, int y)

统计该坐标周围一圈八个雷的数目 ,由于设置雷的地方放的是字符‘1’,没放雷的地方是字符‘0’,这里唯一的好处就是将周围八个字符加起来减去8*‘0’得到的数字就是周围一圈的雷数,(‘1’-‘0’=1),然后getcount函数返回雷数,

求取雷数函数

int getcount(char mine[][11], int x, int y)
{
	return (mine[x][y - 1] + mine[x][y + 1] +
		mine[x - 1][y] + mine[x + 1][y] +
		mine[x - 1][y - 1] + mine[x - 1][y + 1] +
		mine[x + 1][y - 1] + mine[x + 1][y + 1] - 8 * '0');
}

然后需要往中间空格填入雷数,因为此时返回的是int类型+‘0’得到字符类型填入中间格子,并打印出show展示出来,因为要不断的循环,直到游戏结束,则扫雷的过程写在循环中,当踩到雷了可以break跳出循环,循环结束的条件是点开所有不是雷的格子,表明所有的雷已经扫完。

结果演示c语言扫雷_第3张图片

 为了方便演示count设置成80,也就是80个雷,

c语言扫雷_第4张图片

8.退出游戏 

c语言扫雷_第5张图片

总结

1.扫雷界面实现
2.扫雷的游戏规则
3.mine数组存放雷的信息,show数组排查出雷的信息,防止越界,数组多开一行一列
4.数组初始化mine函数全是0(未布置雷),show数组全是*;
5.打印棋盘,数组用的是11*11,行列操作为9*9;
6.打印出棋盘,无法准确具体的坐标,在打印棋盘时,先打印一行,一列坐标
7.棋盘格适当加分割符美观容易区分
8.布置雷,随机生成二位的坐标,判断如果没雷就可以填入雷,直到雷布置满,循环
9.排查雷,确定坐标合法性,是雷的话,打印一下雷的mine数组并提示踩到雷了,不是的话,统计一下周围雷的个数,每个字符加起来减去8个字符0,如果是10个雷的话,9*9共八十一次,
如果输入71次坐标没踩到雷,游戏结束了,扫雷成功

如果有不对的地方请大佬纠正, 谢谢啦!!!希望能帮助到大家

你可能感兴趣的:(c语言,开发语言)