今天写一个大家都玩过扫雷游戏,大小我写的是9乘9的界面,话不多说,直接展示内容。
游戏规则1.界面多个格子中随机选择一个格子,如果该格子是雷,则玩家就被“炸死了”,也就是游戏结束;当格子不是雷,则在点击后就会显示该格子周围其他格子中共有几个雷。
2.选择过的格子不能再次选择。
3.当界面所剩格子数量正好等于雷的数量时,游戏就会成功。
头文件在这里,我们使用#define定义标识符常量.因为是9乘9大小,所以我设置了行数ROW为9,列数COL为9;当格子在界面的边界时,统计格子周围雷信息会不方便,所以我们在上下左右各多出一行或者一列,最后变成11乘11的大小。
mine_num在这里代表的时雷数。
#pragma once #include主程序#include #include #define ROW 9//定义标识符常量最后如果加上;会产生不宜解决的麻烦 #define COL 9 #define ROWS 11 #define COLS 11 #define mine_num 10 void init_board(char board[ROWS][COLS], int rows, int cols, char set); void display_board(char board[ROWS][COLS], int row, int col); void add_mine(char mine[ROWS][COLS], int row, int col); void Minesweeper(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col); int around_mine(char mine[ROWS][COLS], int x, int y);
在运行程序后,首先就是展示游戏界面,其次玩家根据界面的选项选择操作。
void menu()
{
printf("***************n");
printf("*****1.play****n");
printf("*****0.exit****n");
printf("***************n");
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
menu();
do
{
printf("请选择>-n");
scanf("%d", &input);
switch (input)
{
case 0:
printf("结束游戏n");
break;
case 1:
game();
//printf("进入游戏n");
break;
default:
printf("选择错误,请重新选择n");
break;
}
} while (input);
return 0;
}
这里使用do...while循环是因为在每次游戏结束之后都会弹出是否再次游戏。
srand()用来设置随机数起点。
进入游戏game()在这个游戏中,我们使用数组来存放信息,而且在每选择一个格子后还要将信息展现出来。我们设置在数组某个位置无雷时是字符0,有雷是字符1。如果在选择一个格子后,该格子周围正好只有一个雷,所以它要表现出字符1。但这时我们发现此时字符1有俩个信息,一个是代表此处有雷,二是代表该格子周围有一个雷,出现这种情况就会造成不方便。所以为了方便我们的操作,我们创建两个数组,一个用来存放信息,一个用来表现信息。
在game()中,还有其他几个功能,初始化、显示、添加雷、进行扫雷等几个操作
void game()
{
//游戏需要两个数组
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
//数组初始化
init_board(mine, ROWS, COLS, '0');
init_board(show, ROWS, COLS, '*');
//显示
display_board(mine, ROW, COL);
display_board(show, ROW, COL);
//加入雷的信息
add_mine(mine, ROW, COL);
//display_board(mine, ROW, COL);
//扫雷
Minesweeper(mine, show, ROW, COL);
}
初始化
void init_board(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
显示
void display_board(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
for (j = 0; j < 10; j++)
{
printf("%d ", j);
}
printf("n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("n");
}
printf("n");
}
添加雷信息
void add_mine(char mine[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
int count = 0;
while (count < mine_num)
{
int x = rand() % 9 + 1;
int y = rand() % 9 + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count++;
}
else
continue;
}
}
x,y是行,列坐标。rand()%9使结果为0~8,再加上1使得坐标为1~9
扫雷该部分要进行多次判断,首先要判断界面中是否还有无雷的格子。在选择格子时我们通过输入其在数组中的坐标来进行选择。选择后还要判断所选格子在之前是否已经被选择过。
void Minesweeper(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int m = 0;
while (m < row * col - mine_num)
{
scanf("%d %d", &x, &y);
if (x > 0 && x <= row && y > 0 && y <= col)
{
if (show[x][y] != '*')
{
printf("该位置已被选择过了,请重新选择>-n");
}
else
{
m++;
int count = around_mine(mine, x, y);
show[x][y] = count + '0';
}
}
else
{
printf("选择错误,请重新选择>-n");
}
if (m < row * col - mine_num)
{
display_board(show, ROW, COL);
}
else
printf("扫雷成功n");
}
}



