#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int Menu(){
printf("================================\n");
printf(" 1, 开始游戏\n");
printf(" 0, 结束游戏\n");
printf("================================\n");
int choice = 0;
printf("请输入您的选择:\n");
scanf("%d", &choice);
return choice;
}
#define MAX_ROW 9
#define MAX_COL 9
#define MINE_COUNT 10 //雷的个数
//show_map 表示翻开和未翻开的两种状态
//mine_map 表示是地雷和不是地雷的状态
void Init(char show_map[MAX_ROW][MAX_COL], char mine_map[MAX_ROW][MAX_COL]){
//1,将 show_map 初始化为未翻开的状态 *
for (int row = 0; row < MAX_ROW; ++row){
for (int col = 0; col < MAX_COL; ++col){
show_map[row][col] = '*';
}
}
//2,将 mine_map 初始化为全不是地雷 0
for (int row = 0; row < MAX_ROW; ++row){
for (int col = 0; col < MAX_COL; ++col){
mine_map[row][col] = '0';
}
}
//在 mine_map 中随机选择 10 个位置存放地雷
int mine_count = MINE_COUNT;
while (mine_count > 0){
int row = rand() % MAX_ROW;
int col = rand() % MAX_COL;
if (mine_map[row][col] == '1'){
continue;
}
mine_map[row][col] = '1';
--mine_count;
}
}
void PrintMap(char map[MAX_ROW][MAX_COL]){
printf(" |");
for (int col = 0; col < MAX_COL; ++col){
printf(" %d ", col);
}
putchar('\n');
for (int col = 0; col < MAX_COL + 1; ++col){
printf("---", col);
}
putchar('\n');
for (int row = 0; row < MAX_ROW; ++row){
printf(" %d |", row);
for (int col = 0; col < MAX_COL; ++col){
printf(" %c ", map[row][col]);
}
putchar('\n');
}
}
void UpdateShowMap(int row, int col,
char mine_map[MAX_ROW][MAX_COL], char show_map[MAX_ROW][MAX_COL]){
int count = 0; //记录周围的地雷数
if (row - 1 >= 0 && col - 1 >= 0 && mine_map[row - 1][col - 1] == '1'){
++count;
}
if (row - 1 >= 0 && mine_map[row - 1][col] == '1'){
++count;
}
if (row - 1 >= 0 && col + 1 < MAX_COL && mine_map[row - 1][col + 1] == '1'){
count++;
}
if (col - 1 >= 0 && mine_map[row][col - 1] == '1'){
++count;
}
if (col + 1 < MAX_COL && mine_map[row][col + 1] == '1'){
++count;
}
if (row + 1 <MAX_ROW && col - 1 > 0 && mine_map[row + 1][col - 1] == '1'){
++count;
}
if (row + 1 < MAX_ROW && mine_map[row + 1][col] == '1'){
++count;
}
if (row + 1 < MAX_ROW && col + 1< MAX_COL&& col + 1 <=MAX_COL && mine_map[row + 1][col + 1] == '1'){
++count;
}
show_map[row][col] = count + '0';
}
void Game(){
//1,创建两个二维数组作为地图
char show_map[MAX_ROW][MAX_COL];
char mine_map[MAX_ROW][MAX_COL];
//2,对两个地图进行初始化
Init(show_map, mine_map);
int blank_count = 0; //记录翻开不是地雷的个数
while (1){
system("cls");
//3,打印地图
PrintMap(show_map);
//4,提示玩家输入坐标,并且进行校验
printf("请输入要翻开的位置 (row col) : ");
int row = 0;
int col = 0;
scanf("%d %d", &row, &col);
if (row < 0 || row > MAX_ROW || col < 0 || col > MAX_COL){
printf("您输入的坐标非法,请重新输入!\n");
continue;
}
if (show_map[row][col] != '*'){
printf("您输入的坐标已打开,请重新输入!\n");
continue;
}
//5,判断是否踩雷
if (mine_map[row][col] == '1'){
printf("很遗憾,您踩雷了,游戏结束!\n");
PrintMap(mine_map);
return;
}
++blank_count;
//6,判断游戏是否胜利
if (blank_count == MAX_ROW * MAX_COL - MINE_COUNT){
system('cls');
printf("恭喜你,扫雷成功!\n");
return;
}
//7,告诉玩家当前位置有几个雷
UpdateShowMap(row, col, mine_map, show_map);
}
}
int main(){
srand((unsigned int)time(0));
while (1){
int choice = Menu();
if (choice == 1){
Game();
}
else if (choice == 0){
printf("goodbey! \n");
break;
}
else{
printf("您的输入有误,请重新输入!\n");
}
}
system("pause");
return 0;
}
简单扫雷游戏
最新推荐文章于 2022-05-12 16:18:47 发布