扫雷游戏(保姆级教学一看就懂)!!!!!

    • 扫雷游戏整体规则
      我们选择一个坐标,若坐标处是雷就会被炸死,不是雷就会出现一个数字,会显示坐标四周雷的数量。
  • 扫雷游戏的思路
    扫雷游戏(保姆级教学一看就懂)!!!!!_第1张图片
  • 1.菜单
    在玩游戏的时候都会有一个菜单,菜单里会有各种各样的功能,在做扫雷游戏的时候也需要一个菜单,来给用户提示有什么功能。
void menu()//这里用一个函数封装起来
{
	printf("******************\n");
	printf("***欢迎来到扫雷***\n");
	printf("*******1: play****\n");
	printf("*******0: exit****\n");
	printf("******请选择******\n");
}
  • 2.棋盘

我们需要创建两个数组,一个数组布置雷,另一个数组来记录排雷的数据。
扫雷规格是9 * 9.但我们要创建的两个数组是11行11列的,也就是规格11 * 11,因为我们要注意排查边上的周围如果创建11行11列的数组可以不越界。扫雷游戏(保姆级教学一看就懂)!!!!!_第2张图片
黑色表格是9 * 9规格,如果说在这个规格下在图中画星的四周排查一定会越界,所以说我们要创建11行11列的数组

char bomb[ROWS][COLS];//    用于布置雷
char show[ROWS][COLS];//    用于记录数据
  • 3.初始化数组
  • 我们先要将这两个数组初始化,布置雷的数组初始为’0‘,记录排雷数据的数组初始化为’*‘,为了后面放雷,与放在排雷数据更加容易。
    这里我们把’0‘作为不是雷,’1‘作为雷,‘✳’作为棋盘中的没选择的方块。
    在这里插入图片描述
void initial(char arry[ROWS][COLS], int rows, int cols,char ch)//自定义函数初始化
{
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			arry[i][j] = ch;
			
		}
		
	}
}
//调用函数
initial(bomb, ROWS, COLS,'0');//初始化‘0’  
initial(show, ROWS, COLS,'*');//初始化‘*’
  • 4.打印棋盘
    这时候我们初始化,放置排雷数据的棋盘就发挥作用了,这是我们只对它初始化为了✳,刚好可以作为棋盘使用。
void print(char arry[ROWS][COLS], int row, int col)//自定义打印函数
{
	int i = 0;
	for (i = 0; i <= 9; i++)//这里打印的是列0-9
		printf("%d ", i);
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);//打印行1-9
		for (int j = 1; j <= col; j++)
		{
			printf("%c ", arry[i][j]);//打印对应字符
		}
		printf("\n");
	}
}
printf("棋盘\n");
	print(show, ROW, COL);//调用打印函数
	printf("************\n");
  • 5.布置雷
    这里我们会运用到rand()函数产生随机的雷,rand(),是伪随机数,要先调用srand()函数,并且与time连用。
srand((unsigned int)time(NULL));//这里要在int main{}中写,不然出错
//封装了一个放置雷的函数





void layout(char bomb[ROWS][COLS], int row, int col)//放置炸弹
{
	
	int count = BOMB;
	while (count)
	{	//通过两个rand()来控制x,y坐标的随机值,rand()%9是0-8,我们要在1-9行与列里排雷,所以要加上1,x,y范围就变成了1-9
		int x = (rand() % row) + 1;//行
		int y = (rand() % col) + 1;//列
		if (bomb[x][y] == '0')
		{
			bomb[x][y] = '1';
			count--;
		}
		
	}
}
layout(bomb, ROW, COL);//调用放置雷的函数
  • 6.排雷数据记录
    记录排雷的数据,我们要利用布置雷的数组,先输入坐标,判断当前坐标是不是雷,是雷,炸死退出游戏,不是雷,在自定义一个函数排查布置雷的数组,然后返回排雷数据,并给到记录排雷数据的数数组中并且打印出来
void FBOMB(char bomb[ROWS][COLS], char show[ROWS][COLS], int row, int col)//判断是否是雷的函数
{
	int count = 0;
	int x = 0;//这里x y作为横坐标  纵坐标。
	int y = 0;
	while (count < (row*col - BOMB))//扫雷游戏要把所以没有雷的地方找到
	{								//所以每次bomb[x][y]定位的地方是‘0’,就会count++
									//<号右边row*col是9*9规格,雷也是在9*9规格布置的,在减去炸弹正好是没有炸弹的数量,所以循环条件是count < (row*col - BOMB,当count是71退出循环。
		printf("请输入坐标>:");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (bomb[x][y] == '1')
			{
				printf("很遗憾你被炸死!!!\n");
				print(bomb, row, col);
				break;

			}
			else
			{
				
				int c = search(bomb, x, y);//搜索坐标四周雷的数据
				show[x][y] = c + '0';//接收排雷数据,下文有解释
				print(show, ROW, COL);
				count++;
			}
		}
		else
		{
			printf("输入错误,请重新输入");
		}

		
	}
	if (count == row * col - BOMB)//循环条件结束后,我们要做一个判断,是炸死了,退出循环,排雷成功退出的循环,排雷成功要把没有雷71个位置都要找到,所以当count==71,游戏胜利,这判断出排雷成功
	{
		printf("游戏胜利");
		
	}
}
``

```c
int search(char bomb[ROWS][COLS], int x, int y)//排查排雷数据函数
{
	return (bomb[x - 1][y] +bomb[x - 1][y - 1] +bomb[x][y - 1] +bomb[x + 1][y - 1] +bomb[x + 1][y] +bomb[x + 1][y + 1] +bomb[x][y + 1] +bomb[x - 1][y + 1] - 8 * '0');
}

return (bomb[x - 1][y] +bomb[x - 1][y - 1] +bomb[x][y - 1] +bomb[x + 1][y - 1] +bomb[x + 1][y] +bomb[x + 1][y + 1] +bomb[x][y + 1] +bomb[x - 1][y + 1] - 8 * ‘0’);
代码意义:调用函数传输了x,y,坐标,排查四周数据,返回一个整型给int c,注意这里算的是数字,char show[ROWS][COLS]是字符数组,把数子化成字符,字符数字-字符0=数字,数字=字符+字符0
举例:‘1’-‘0’=1;
因为0ASCLL码是48,1是49。
扫雷游戏(保姆级教学一看就懂)!!!!!_第3张图片

最后调用函数FBOMB(bomb, show, ROW, COL);

扫雷整体代码

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
	printf("******************\n");
	printf("***欢迎来到扫雷***\n");
	printf("*******1: play****\n");
	printf("*******0: exit****\n");
	printf("******请选择******\n");
}
int main()
{
	srand((unsigned int)time(NULL));
	
	int input = 0;//这里创建一个变量,来控制循环,并且也能控制switch语句,根据输入的数字给定提升信息
	do 
	{
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case 1:
		{
			game();
			break;
		}
		case 0:
		{
			printf("退出游戏!\n欢迎下次来玩\n");
			break;
		}
		default:
		{
			printf("输入错误!请重新输入");
			break;

		}
		}

	} while (input);
	return 0;
}

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void initial(char arry[ROWS][COLS], int rows, int cols,char ch)//初始化
{
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			arry[i][j] = ch;
			
		}
		
	}
}
void print(char arry[ROWS][COLS], int row, int col)
{
	int i = 0;
	for (i = 0; i <= 9; i++)
		printf("%d ", i);
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (int j = 1; j <= col; j++)
		{
			printf("%c ", arry[i][j]);
		}
		printf("\n");
	}
}
void layout(char bomb[ROWS][COLS], int row, int col)//放置炸弹
{
	
	int count = BOMB;
	while (count)
	{
		int x = (rand() % row) + 1;//行
		int y = (rand() % col) + 1;//列
		if (bomb[x][y] == '0')
		{
			bomb[x][y] = '1';
			count--;
		}
		
	}
}
int search(char bomb[ROWS][COLS], int x, int y)
{
	return (bomb[x - 1][y] +bomb[x - 1][y - 1] +bomb[x][y - 1] +bomb[x + 1][y - 1] +bomb[x + 1][y] +bomb[x + 1][y + 1] +bomb[x][y + 1] +bomb[x - 1][y + 1] - 8 * '0');
}
void FBOMB(char bomb[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int count = 0;
	int x = 0;
	int y = 0;
	while (count < (row*col - BOMB))
	{
		printf("请输入坐标>:");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (bomb[x][y] == '1')
			{
				printf("很遗憾你被炸死!!!\n");
				print(bomb, row, col);
				break;

			}
			else
			{
				
				int c = search(bomb, x, y);
				show[x][y] = c + '0';
				print(show, ROW, COL);
				count++;
			}
		}
		else
		{
			printf("输入错误,请重新输入");
		}

		
	}
	if (count == row * col - BOMB)
	{
		printf("游戏胜利");
		
	}
}

void game(void)//游戏实现核心放置
{
	char bomb[ROWS][COLS];//    用于布置雷
	char show[ROWS][COLS];//    用于存放排雷数据
	initial(bomb, ROWS, COLS,'0');//初始化‘0’
	initial(show, ROWS, COLS,'*');//初始化‘*’
	printf("棋盘\n");
	print(show, ROW, COL);
	printf("************\n");
	//print(show, ROW, COL);
	layout(bomb, ROW, COL);
	//print(bomb, ROW, COL);//炸弹示意图
	FBOMB(bomb, show, ROW, COL);
}


game.h

#pragma once
#include
#include
#include
#include
#define BOMB 80 //炸弹
#define ROW  9  //行
#define COL  9  //列
#define ROWS  ROW+2
#define COLS  COL+2
void game(void);
//初始化数组
void initial(char arr[ROWS][COLS], int rows, int cols,char ch);
//布置雷
void layout(char arr[ROWS][COLS], int row, int col);
//搜雷
void FBOMB(char bomb[ROWS][COLS], char show[ROWS][COLS], int row, int col);
//打印棋盘
void print(char arry[ROWS][COLS], int row, int col);

你可能感兴趣的:(游戏,c语言,经验分享,学习)