创建一个大小为9*9方格的扫雷区,实现扫雷功能。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROWS 9
#define COLUMNS 9
#define FAKE_ROWS 11
#define FAKE_COLUMNS 11
#define COUNT 10
void menu();
void play();
void init(char arr[ROWS][COLUMNS], int rows, int columns, char fill);
void show_arr(char arr[ROWS][COLUMNS], int rows, int columns);
void print(int minefield[ROWS][COLUMNS], int cover[ROWS][COLUMNS]);
void lay_out_mine(char minefield[ROWS][COLUMNS], int rows, int columns);
void clean_mine(char minefield[FAKE_ROWS][FAKE_COLUMNS], char cover[FAKE_ROWS][FAKE_COLUMNS]);
int main() {
do {
menu();
} while (1);
play();
return 0;
}
//菜单
void menu() {
printf("---------扫雷---------\n");
printf("------1.开始游戏------\n");
printf("------0.退出游戏------\n");
printf("----------------------\n");
printf("请选择:");
int select;
scanf("%d", &select);
switch (select) {
case 1:
play();
break;
case 0:
printf("再见");
exit(EXIT_SUCCESS);
break;
default:
printf("选择错误,请重新选择:\n");
}
}
//游戏内容
void play() {
//创建雷区
char minefield[FAKE_ROWS][FAKE_COLUMNS] = { 0 };
init(minefield, FAKE_ROWS, FAKE_COLUMNS, '0');
//创建覆盖层
char covering[FAKE_ROWS][FAKE_COLUMNS] = { 0 };
init(covering, FAKE_ROWS, FAKE_COLUMNS, '*');
//打印出雷区和覆盖区
//print(minefield, covering);
//布雷
lay_out_mine(minefield, ROWS, COLUMNS);
print(minefield, covering);
//排雷
clean_mine(minefield, covering);
}
//初始化二维数组
void init(char arr[FAKE_ROWS][FAKE_COLUMNS], int rows, int columns, char fill) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
arr[i][j] = fill;
}
}
}
//显示数组
void show_arr(char arr[FAKE_ROWS][FAKE_COLUMNS], int rows, int columns) {
//打印索引
for (int i = 0; i <= rows;i++) {
if (i == 0) {
printf(" ");
}
else {
printf("%-4d",i);
}
}
printf("\n\n");
for (int i = 0; i < rows;i++) {
printf("%-4d",i+1);
for (int j = 0; j < columns;j++) {
printf("%-4c",arr[i][j]);
}
printf("\n");
}
}
//打印出雷区和覆盖区
void print(int minefield[FAKE_ROWS][FAKE_COLUMNS], int cover[FAKE_ROWS][FAKE_COLUMNS]) {
printf("-----------mine_area(雷区)-----------\n");
show_arr(minefield, FAKE_ROWS, FAKE_COLUMNS);
printf("---------------------------------------\n");
printf("----------cover_erea(覆盖区)---------\n");
show_arr(cover, FAKE_ROWS, FAKE_COLUMNS);
}
//布雷
void lay_out_mine(char minefield[FAKE_ROWS][FAKE_COLUMNS], int rows, int columns) {
//创建随机数,布雷,用num表示雷的数量
srand((unsigned int)time(NULL));
int num = 0;
while (num < COUNT) {
int row = rand() % 9 + 1;
int column = rand() % 9 + 1;
if (minefield[row][column] == '1') {
continue;
}
else {
minefield[row][column] = 49;
num++;
}
}
}
//排雷
void clean_mine(char minefield[FAKE_ROWS][FAKE_COLUMNS], char cover[FAKE_ROWS][FAKE_COLUMNS]) {
int numb = 0;
//当排出雷的数量<(行数*列数-雷的总数)时
while (numb < ROWS * COLUMNS - COUNT) {
int row = 0;
int column = 0;
rewind(stdin); //清空缓冲区
printf("请输入坐标:");
scanf("(%d,%d)", &row, &column);
if (row > 0 && row <= ROWS && column > 0 && column <= COLUMNS) {
if (cover[row][column] != '*') {
continue;
}
else if (minefield[row][column] != '1') {
//计算输入坐标周围的雷的数量
int num_mine = 0;
//第一行的雷数
num_mine = num_mine + minefield[row - 1][column - 1] - '0';
num_mine = num_mine + minefield[row - 1][column] - '0';
num_mine = num_mine + minefield[row - 1][column + 1] - '0';
//第二行左右两边的雷数
num_mine = num_mine + minefield[row][column - 1] - '0';
num_mine = num_mine + minefield[row][column + 1] - '0';
//第三行的雷数
num_mine = num_mine + minefield[row + 1][column - 1] - '0';
num_mine = num_mine + minefield[row + 1][column] - '0';
num_mine = num_mine + minefield[row + 1][column + 1] - '0';
cover[row][column] = num_mine + '0';
numb++;
print(minefield, cover);
}
else {
printf("很遗憾,你被雷炸死了,游戏结束!\n");
break;
}
}
else {
printf("输入错误,请重新输入!\n");
}
}if (numb == ROWS * COLUMNS - COUNT) {
printf("恭喜你,扫雷成功!!!\n");
}
}