C【练习】(扫雷小游戏)

本页详细解读 C语言控制台小程序 扫雷小游戏。实现使用控制台小程序,完成扫雷小程序(1.0)!!!
在这里插入图片描述
话不多说直接贴上效果图接下来开始叙述怎么做出成果
这里我在实现的过程中按照先写骨架,再写功能,最后补全(不够专业的叙述)

Main()

承担小程序的核心运行,使扫雷可以正常的运行 且能在每一盘游戏之后可以选择继续游戏或者退出。

int main(){
	srand((unsigned int)time(NULL));
	while (1){
		int choice = Meau();
		if (choice){
			Game();
		}
		else{
			break;
		}
	}
	system("pause");
	return 0;
}

1.为什么这里要使用srand,后面会说
2.while 循环的使用保证我的游戏在结束时可以循环选择
3.int Choice 为我的功能做了一个选择开关这里也可以使用 switch 代替

Game()

Game()函数作为扫雷的主体,主要作用实现扫雷的主体实现,可以完成棋盘的初始化、用户的输入、输入坐标的判定、棋盘为用户的展示

void Game(){
	int Blank_Count = 0;  //记录空白格个数

	char out_map[ROW+2][COL+2];    //给人看的地图
	char mine_map[ROW+2][COL+2];	//地雷的地图

	Init(out_map,mine_map);							//初始化地图
	
	while (1){
		system("cls");
		Display_Map(out_map);     //展示地图(地雷被隐藏)

		int row, col;
		printf("输入检测的坐标:");
		scanf("%d %d", &row, &col);

		if (row<1 || row>ROW || COL<1 || col>COL){
			printf("坐标非法,重新输入:\n");
			continue;
		}    //检查坐标是否合法

		//检验是否踩到地雷
		if (mine_map[row][col] == '1'){
			printf("踩到地雷GG\n");
			break;          //直接结束Game()
		}

		//验证是否扫雷成功
		++Blank_Count;
		if (Blank_Count == ROW*COL - MINE_COUNT){
			printf("胜利!!!\n");
			break;
		}

		//更新地图
		Update_Out_Map(out_map,row,col,mine_map);
	}
	Display_Map(mine_map);
}

1.使用char 类型初始化 out_map[ROW+2][COL+2]、mine_map[ROW+2][COL+2]一个作为给用户展示的棋盘一个作为存储地雷信息的棋盘
2.while 的作用在游戏中实现 用户输入、棋盘检测、地图打印 循环操作
3.if(row<1 || row>ROW || COL<1 || col>COL) 判定用户输入坐标的合法 不合法则重新输入,保证用户输入的坐标在[1,9]上
4.定义有地雷的地方为‘1’,if (mine_map[row][col] == ‘1’),如果挂掉就 Display_Map 打印所有信息棋盘
5.当活着走到这一步证明之前都是正确操作没有踩雷所以 空白格子数量 ++Blan_Count
6,将这里的所有信息更新进入地图信息,

Init()

按照Game()提供的思路我们当然先初始化数组
分两种情况
out_map 为用户展示的地图当然初始化全为空格
mine_map 地雷我在这里定义两种情况0/1 初始化无雷全为0

int Init(char out_map[ROW+2][COL+2], char mine_map[ROW+2][COL+2]){
	//out_map初始化全为 空格
	for (int row = 0; row < ROW + 2; row++){
		for (int col = 0; col < COL + 2; col++){
			out_map[row][col] = ' ';
		}
	}
	 // 2.把mine_map初始化全是 '0'
	for (int row = 0; row < ROW + 2; row++){
		for (int col = 0; col < COL + 2; col++){
			mine_map[row][col] = '0';
		}
	}
	//3.随机种地雷
	int mine_count = MINE_COUNT;
	while (mine_count>0){
		int row = rand() % ROW + 1;
		int col = rand() % COL + 1;
		if (mine_map[row][col] == '1'){
			continue;
		}
		else{
			mine_map[row][col] = '1';
			--mine_count;
		}
	}
	return 0;
}  

1.通过 #define MINE_COUNT定义地雷数作为限制条件
2.while(mine_count) 种雷的限制条件
3.采用随机数种雷 rand%ROW+1;
%ROW的结果为0-8 但是为了适应我们的棋盘所以+1
4.注意在种雷时 的种种影响 比如 该位置不能有雷

Display_Map()

打印地图
按照我们的需求打印整个map
我这里放 代码方便 以后使用
void Display_Map(char out_map[ROW+2][COL+2]){
//打印地图 与对应坐标
printf(" ||");
//打印列坐标
for (int i = 1; i <= ROW; i++){
printf(" %d “, i);
}
printf(”\n");
//打印横线
for (int i = 0; i <= ROW; i++){
printf("===", i);
}
printf("\n");
for (int row = 1; row <= ROW; row++){
printf(" %d||",row);
for (int col = 1; col <= COL; col++){
printf(" %c “, out_map[row][col]);
}
printf(”\n");
}
}

Update_Out_Map()

实现 检测空白格周围地雷的个数并且将它展示给用户

void Update_Out_Map(char out_map[ROW+2][COL+2],int row,int col,char mine_map[ROW+2][COL+2]){
	 //统计当前位置周围格子地雷数字 将数字更新 out_map
	// row 1-9 col 1-9  row-1不会越界
	//加入边框 防止 数组越界
	int count = 0; //发现的地雷数字
	/*if (mine_map[row-1][col - 1] == '1'){
		++count;
	}

	if (mine_map[row-1][col] == '1'){
		++count;
	}

	if (mine_map[row-1][col + 1] == '1'){
		++count;
	}

	if (mine_map[row][col - 1] == '1'){
		++count;
	}


	if (mine_map[row][col + 1] == '1'){
		++count;
	}

	if (mine_map[row+1][col - 1] == '1'){
		++count;
	}

	if (mine_map[row+1][col] == '1'){
		++count;
	}

	if (mine_map[row+1][col + 1] == '1'){
		++count;
	}*/

	count = (mine_map[row - 1][col - 1] - '0')
		+ (mine_map[row - 1][col] - '0')
		+ (mine_map[row - 1][col + 1] - '0')
		+ (mine_map[row][col - 1] - '0')
		+ (mine_map[row][col + 1] - '0')
		+ (mine_map[row + 1][col - 1] - '0')
		+ (mine_map[row + 1][col] - '0')
		+ (mine_map[row + 1][col + 1] - '0');

	out_map[row][col] ='0'+count;  //整形转换为字符型 0-9
}

1.这里集中解释一下为什么我要给 map +2,这个行为称之为加边框 就是为了在这里解决这个特殊的问题,当安全的空白格在(1,1)(1,9)…这些特殊的位置他周围有一些或部分假如我们没有+2就会发生数组越界
2.在这里插入图片描述
用图看代码一看就懂!!!

生命不息!!奋斗不止!!

猜你喜欢

转载自blog.csdn.net/qq_36390039/article/details/85917406