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.
用图看代码一看就懂!!!
生命不息!!奋斗不止!!
本文地址:https://blog.csdn.net/qq_36390039/article/details/85917406
上一篇: 成都哪里的火锅最好吃
下一篇: 立秋后饮食吃什么