游戏思路:
扫雷游戏是在一个方形区域发现掩藏着的地雷的游戏,除去开始选择点击一个位置时没有任何提示,后面我们都会得到点击过的位置附近藏着多少颗地雷,我们需要根据这些提示一步步的排雷,误触雷后游戏结束,安全发现全部雷后游戏通关。
通过对游戏规则的理解,可以知道,方形区域实质上可以看成是二维数组。我们可以初始化两个二维数组,一个用于埋雷(board数组),赋值字符‘1’表示是有雷,字符‘0’表示无雷,另一个二维数组(arr数组)用于赋值字符‘*’表示藏雷。
总体的思路是:
首先创造雷区,也就是二维数组。
其次是埋下地雷,即在board数组中随机赋值字符’1‘,有几个1表示几个雷。
然后将雷区藏好,也就是将arr数组全部赋值字符’*‘。
再则是展示arr数组。
最后是找雷,在找雷时,如果查找的位置无雷,就统计board数组这个位置附近的雷,并求和赋值给arr数组的这个位置,并且再次展示arr数组,再次找雷,若被雷区炸死则游戏结束并且展示board数组,否则继续该操作,直到排完所有雷游戏结束并且展示board数组。
思路括展:
由上图可知,为了方便代码的实现,要实现9*9的扫雷区域应该初始化11*11的二维数组。
下面是模拟实现9*9的二维数组的扫雷游戏的代码实现。
宏定义
#define ROWS 9+2
#define COLS 9+2
#define ROW 9
#define COL 9
#define EASY_COUNT 10
游戏菜单
void menu()//菜单,输入1开始游戏,0结束游戏
{
printf("****************扫雷***************\n");
printf("********* 1 :开始游戏 *********\n");
printf("********* 0 :退出游戏 *********\n");
printf("****************扫雷***************\n");
}
数组初始化
char board[ROWS][COLS];//埋雷
char arr[ROWS][COLS];//藏雷
void InitBoard(char arr[ROWS][COLS], char board[ROWS][COLS])//初始化
{
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
arr[i][j] = '0';//初始化全是无雷
board[i][j] = '0';
}
}
}
给board数组埋雷
void SetMine(char board[ROWS][COLS], int row, int col)
{
//布置10个雷
//⽣成随机的坐标,布置雷
int count = EASY_COUNT;
while (count)
{
int x = rand() % row + 1;//rand()函数的返回值是一个int型的整数
int y = rand() % col + 1;//x,y赋值为1到9的整数
if (board[x][y] == '0')
{
board[x][y] = '1';
count--; //只有成功在没有埋雷的地方埋雷count才减1
}
}
}
藏雷
void FoggyBorad(char arr[][COLS])//隐藏雷
{
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
arr[i][j] = '*';
}
}
}
找雷
int GetCount(char board[][COLS], int m, int n)//得到附近有多少个雷
{
return board[m + 1][n] + board[m - 1][n] + board[m][n + 1] + board[m][n - 1] + board[m + 1][n + 1] + board[m - 1][n - 1] + board[m - 1][n + 1] + board[m + 1][n - 1] - 8 * '0';
}
void FindMine(char board[ROWS][COLS], char arr[ROWS][COLS], int row, int col)
{
//找雷
int x = 0;
int y = 0;
int cnt = 0;
while (cnt < row * col - EASY_COUNT)//9*9的二维数组,埋10个雷,最多只能找71次
{
printf("请输入要排查的坐标:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x][y] == '1')
{
printf("很遗憾,你被炸死了\n");
DisplayBoard(board);
printf("\n");
printf("\n");
printf("\n");
break;
}
else
{
//该位置不是雷,就统计这个坐标周围有⼏个雷
int count = GetCount(board, x, y);
arr[x][y] = count + '0';
DisplayBoard(arr);
cnt++;
}
}
else
{
printf("坐标非法,重新输入\n");
}
}
if (cnt == row * col - EASY_COUNT)
{
printf("恭喜你,排雷成功\n");
DisplayBoard(board);
printf("\n");
printf("\n");
printf("\n");
}
}
主函数
#include "stdio.h"
#include "stdlib.h"
#include
int main()
{
int input = 0;
srand((unsigned int)time(NULL));//防止埋雷时rand()函数产生相同的随机值
do
{
menu();
printf("请选择:->");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while (input);
return 0;
}
代码实现
#include "stdio.h"
#include "stdlib.h"
#include
#define ROWS 9+2
#define COLS 9+2
#define ROW 9
#define COL 9
#define EASY_COUNT 10
char board[ROWS][COLS];
char arr[ROWS][COLS];
void InitBoard(char arr[ROWS][COLS], char board[ROWS][COLS])//初始化
{
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
arr[i][j] = '0';
board[i][j] = '0';
}
}
}
void SetMine(char board[ROWS][COLS], int row, int col)
{
//布置10个雷
//⽣成随机的坐标,布置雷
int count = EASY_COUNT;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (board[x][y] == '0')
{
board[x][y] = '1';
count--;
}
}
}
void DisplayBoard(char arr[][COLS])//打印雷盘
{
for (int i = 0; i < ROWS - 1; i++)
{
for (int j = 0; j < COLS - 1; j++)
{
if (i == 0)
printf("%d ", j);
else if (j == 0)
printf("%d", i);
else
printf(" %c", arr[i][j]);
}
printf("\n");
}
}
void FoggyBorad(char arr[][COLS])//隐藏雷
{
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
arr[i][j] = '*';
}
}
}
int GetCount(char board[][COLS], int m, int n)
{
return board[m + 1][n] + board[m - 1][n] + board[m][n + 1] + board[m][n - 1] + board[m + 1][n + 1] + board[m - 1][n - 1] + board[m - 1][n + 1] + board[m + 1][n - 1] - 8 * '0';
}
void FindMine(char board[ROWS][COLS], char arr[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int cnt = 0;
while (cnt < row * col - EASY_COUNT)
{
printf("请输入要排查的坐标:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x][y] == '1')
{
printf("很遗憾,你被炸死了\n");
DisplayBoard(board);
printf("\n");
printf("\n");
printf("\n");
break;
}
else
{
//该位置不是雷,就统计这个坐标周围有⼏个雷
int count = GetCount(board, x, y);
arr[x][y] = count + '0';
DisplayBoard(arr);
cnt++;
}
}
else
{
printf("坐标非法,重新输入\n");
}
}
if (cnt == row * col - EASY_COUNT)
{
printf("恭喜你,排雷成功\n");
DisplayBoard(board);
printf("\n");
printf("\n");
printf("\n");
}
}
void game()
{
InitBoard(arr, board);
SetMine(board, ROW, COL);
FoggyBorad(arr);
DisplayBoard(arr);
FindMine(board, arr, ROW, COL);
}
void menu()//菜单
{
printf("****************扫雷***************\n");
printf("********* 1 :开始游戏 *********\n");
printf("********* 0 :退出游戏 *********\n");
printf("****************扫雷***************\n");
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:->");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while (input);
return 0;
}
成果展示