一.初始化地图
1、流程 、函数的声明以及预定义
#pragma once
#define ROW 9
#define COL 9
#define ROWS ROW+2//防止数组在排雷的时候数组越界
#define COLS COL+2//防止数组在排雷的时候数组越界
#define mineofcount 10
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
void init_map(char arry[ROWS][COLS], int rows, int cols, char set);
void print_map(char arry[ROWS][COLS],int rows, int cols);
void burry_mine(char arry[ROWS][COLS],int row, int col);
void remove_mines(char mine[ROWS][COLS],char show[ROWS][COLS], int row,int col);
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
init_menu();
printf("请输入:\n");
scanf("%d", &input);
switch (input)
{
case 1:
game();
//printf("start\n");
break;
case 0:
printf("quit\n");
break;
default:
printf("您输入的数据有问题\n");
}
} while (input);
return 0;
}
2、启动画面( 1是开始游戏,0是结束游戏 )
void init_menu()
{
printf("**********************************\n");
printf("********* 1.start ***************\n");
printf("********* 0.quit ***************\n");
printf("**********************************\n");
}
二.进入游戏
1、game()的流程
void game(void)
{
char mine[ROWS][COLS];//埋雷数组
char show[ROWS][COLS];//排雷数组
//初始化数组
init_map(mine, ROWS, COLS, '0');//先将mine数组初始化为0,1代表是雷
init_map(show, ROWS, COLS, '*');
//打印地图(用于测试)
//print_map(mine, ROW, COL);
//print_map(show, ROW, COL);
//埋雷
burry_mine(mine,ROW,COL);
//print_map(mine, ROW, COL);
//排雷
remove_mines(mine,show,ROW,COL);
}
定义两个数组一个是用来实现存储埋的雷,另一个是用于更人交互,就是来显示,当我们输入排雷坐标的时候,会以坐标为中心统计边长为3的范围内的雷的个数,然后在show数组对用的位置上显示雷的个数。
2、埋雷
void burry_mine(char arry[ROWS][COLS], int row, int col)
{
int i = 0;
while (i < mineofcount)//生成雷的个数
{
int x = rand() % row + 1; //生成随机数1-9 ,因为我是9*9的地图
int y = rand() % col + 1;
if (arry[x][y] == '0') //这个条件语句是为了防止随机坐标产生重复了,而无法保证准确埋雷的数量
{
arry[x][y] = '1';
i++;
}
}
}
3、排雷
void remove_mines(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x=0, y=0;
int win = 1;
print_map(show, ROW, COL);//游戏开始的时候肯定是什么都看不见全是 9*9 的*
while (win < (row * col- mineofcount))//用于判读是否排雷成功
{
win++;
printf("请输入排查坐标\n");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)//坐标范围限制,保证排查范围是对的
{
if (mine[x][y] == '1')
{
printf("game over \n");//踩雷了,游戏结束
print_map(mine, ROW, COL);//显示所有地雷
break;
}
else
{
int cnt = mine_count(mine, x, y);//没踩雷,我就要统计该坐标周围雷的个数
show[x][y] = cnt + '0'; //字符-字符=int
将数组mine(x,y)坐标周围雷的个数+字符0=雷的‘字符个数’,赋值给数组show对应坐标
system("cls"); //清屏,保证交互的时候呈现出来的地图要是最新的,把之前的去掉
print_map(show, ROW, COL);
}
}
else
{
printf("坐标非法\n");
}
if (win == row * col - mineofcount)
{
printf("you win\n");
break;
}
}
}
3.1统计雷的数量
int mine_count(char mine[ROWS][COLS], int x, int y)
//如果不是雷的话,排查周围雷的个数
{
int cnt = mine[x - 1][y] + mine[x + 1][y] + mine[x][y - 1] \
+ mine[x][y + 1] + mine[x - 1][y - 1] + mine[x + 1][y + 1] \
+ mine[x - 1][y + 1] + mine[x + 1][y + 1] - 8 * '0';
return cnt;
}
20231104