欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-09 15:07:58
本页详细解读 C语言控制台小程序 扫雷小游戏。实现使用控制台小程序,完成扫雷小程序(1.0)!!!话不多说直接贴上效果图接下来开始叙述怎么做出成果这里我在实现的过程中按照先写骨架,再写功能,最后补全(不够专业的叙述)Main()承担小程序的核心运行,使扫雷可以正常的运行 且能在每一盘游戏之后可以选择继续游戏或者退出。int main(){srand((unsigned int)ti......

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

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.C【练习】(扫雷小游戏)
用图看代码一看就懂!!!

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

本文地址:https://blog.csdn.net/qq_36390039/article/details/85917406