#define BOMB 15
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu();//简易菜单
void game();//游戏功能实现程序
void Init(char mine[11][11], char show[11][11]);//初始化棋盘
void display(char board[11][11]);//打印棋盘
int is_bomb(char mine[11][11], int x, int y);//判断是否为雷
void tips(char mine[11][11], char show[11][11], int x, int y);//提示周围有几个雷
void show_bomb(char mine[11][11], char show[11][11]);//显示所有雷
int is_win(char show[11][11]);//判断雷是否排完
void menu()
{
printf("#########################\n");
printf("######## 1. Play #######\n");
printf("######## 0. Exit #######\n");
printf("#########################\n");
}
void game()
{
int x = 0;
int y = 0;
int ret = 0;
char mine[11][11] = { 0 };
char show[11][11] = { 0 };
Init(mine, show);
do
{
//display(mine);
//printf("\n");
display(show);
printf("Input row and col:> ");
scanf_s("%d %d", &x, &y);
if (x >= 1 && x <= 9 && y >= 1 && y <= 9)
{
ret = is_bomb(mine, x, y);
if (ret)
{
printf("Boom.You lost!\n");
show_bomb(mine, show);
display(show);
}
else
{
tips(mine, show, x, y);
if (is_win(show))
{
printf("You Win!\n");
break;
}
}
}
else
printf("Wrong.Input again!\n");
} while (!ret);
}
void Init(char mine[11][11], char show[11][11])
{
int bomb = BOMB;
int count = 0;
for (int i = 0; i < 11; i++)
{
for (int j = 0; j < 11; j++)
{
mine[i][j] = '0';
show[i][j] = '#';
}
}
while(count < bomb)
{
int x = rand() % 9 + 1;
int y = rand() % 9 + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count++;
}
}
}
void display(char board[11][11])
{
for (int i = 1; i < 10; i++)
{
for (int j = 1; j < 10; j++)
{
printf(" %c ", board[i][j]);
}
printf("\n");
}
}
int is_bomb(char mine[11][11], int x, int y)
{
if (mine[x][y] == '1')
return 1;
else
return 0;
}
void tips(char mine[11][11],char show[11][11], int x, int y)
{
int count = 0;
for (int i = x-1; i <= x+1; i++)
{
for (int j = y-1; j <= y+1; j++)
{
if(mine[i][j] != '0')
++count;
}
}
if (count != 0)
show[x][y] = 48 + count;
else
show[x][y] = '0';
}
void show_bomb(char mine[11][11], char show[11][11])
{
for (int i = 0; i < 11; i++)
{
for (int j = 0; j < 11; j++)
{
if (mine[i][j] == '1')
show[i][j] = '@';
}
}
}
int is_win(char show[11][11])
{
int count = 0;
for (int i = 1; i < 10; i++)
{
for (int j = 1; j < 10; j++)
{
if (show[i][j] == '#')
{
count++;
}
}
}
if (count == BOMB)
return 1;
else
return 0;
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("Please choose:> ");
scanf_s("%d", &input);
switch (input)
{
case 0:
printf("Exit Game!\n");
break;
case 1:
printf("Game Start!\n");
game();
break;
default:
printf("Wrong.Input again!\n");
break;
}
break;
} while (input);
return 0;
}
简易版扫雷,目前还只能每次提示一个格子,没想出来怎么实现点一下就把周围没有雷的格子全打开,有待完善。