#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<stdbool.h>
#define MINE_COUNT 10
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
int setp = ROW * COL - MINE_COUNT;
int flag = 1;
#pragma warning (disable:6031)
extern int flag;
extern int setp;
void Hide_board(char a[][COLS], int x, int y, char set);
void Show_board(char a[][COLS], int x, int y);
void Set_mine(char mine[][COLS], int x, int y, int count);
void Find_mine(char show[][COLS], char mine[][COLS], int x, int y);
int get_mine(char show[][COLS], char mine[][COLS], int x, int y);
bool is_mine(char mine[][COLS], int m, int n);
bool is_find(char show[][COLS], int m, int n);
void surprise(char mine[][COLS], char show[][COLS], int x, int y, int m, int n);
void Menu()
{
printf("******************\n");
printf("******1.Play******\n");
printf("******2.How*******\n");
printf("******0.Exit******\n");
printf("******************\n");
}
void How()
{
printf("1.输入点坐标的x值和y值,和一任意字符,之间用空格隔开\n");
printf("2.若要标记某地点有雷,将任意字符改为Y即可\n");
}
void Hide_board(char a[][COLS], int x, int y, char set)
{
for (int i = 1; i <= x; i++)
{
for (int j = 1; j <= y; j++)
{
a[i][j] = set;
}
}
}
void Show_board(char a[][COLS], int x, int y)
{
for (int i = 0; i <= x; i++)
{
if (i < 10)
printf("%d ", i);
else
{
printf("%c", 'A' + i - 10);
}
}
putchar('\n');
for (int j = 0; j <= x; j++)
{
printf("--");
}
putchar('\n');
for (int i = 1; i <= y; i++)
{
if (i < 10)
printf("%d|", i);
else
{
printf("%c|", 'A' + i - 10);
}
for (int j = 1; j <= x; j++)
{
printf("%c ", a[i][j]);
}
putchar('\n');
}
}
void Set_mine(char mine[][COLS], int x, int y, int count)
{
int m = 0;
int n = 0;
while (count)
{
m = rand() % x + 1;
n = rand() % y + 1;
if (mine[m][n] == ' ')
{
mine[m][n] = '*';
count--;
}
}
}
void Find_mine(char show[][COLS], char mine[ROWS][COLS], int x, int y)
{
int m = 0;
int n = 0;
char ch = 0;
while (scanf("%d %d %c", &m, &n, &ch) != EOF)
{
if (m >= 1 && m <= x && n >= 1 && n <= y)
{
if (!is_find(show, m, n))
{
if (show[m][n] == '!' && 'Y' == ch)
{
show[m][n] = '@';
printf("取消标记成功!\n");
system("cls");
Show_board(show, x, y);
break;
}
if ('Y' == ch)
{
show[m][n] = '!';
printf("标记成功!\n");
system("pause");
system("cls");
Show_board(show, x, y);
break;
}
else
{
if (is_mine(mine, m, n))
{
printf("你被雷炸死了\n\a\a\a");
show[m][n] = '*';
flag = 0;
system("pause");
system("cls");
Show_board(show, x, y);
break;
}
else
{
surprise(mine, show, x, y, m, n);
system("pause");
system("cls");
Show_board(show, x, y);
break;
}
}
}
else
{
printf("坐标已经排查过,请重新输入:\n");
}
}
else
{
printf("坐标非法,请重新输入!\n");
}
}
}
int get_mine(char show[][COLS], char mine[][COLS], int m, int n)
{
int count = 0;
if (mine[m - 1][n - 1] == '*')
count++;
if (mine[m - 1][n] == '*')
count++;
if (mine[m - 1][n + 1] == '*')
count++;
if (mine[m][n - 1] == '*')
count++;
if (mine[m][n + 1] == '*')
count++;
if (mine[m + 1][n - 1] == '*')
count++;
if (mine[m + 1][n] == '*')
count++;
if (mine[m + 1][n + 1] == '*')
count++;
return count;
}
bool is_mine(char mine[][COLS], int m, int n)
{
if (mine[m][n] == ' ')
return false;
return true;
}
bool is_find(char show[][COLS], int m, int n)
{
if (show[m][n] == '@' || show[m][n] == '!')
return false;
return true;
}
void surprise(char mine[][COLS], char show[][COLS], int x, int y, int m, int n)
{
if (!(m >= 1 && m <= x && n >= 1 && n <= y))
return;
if (is_mine(mine, m, n) || is_find(show, m, n))
return;
setp--;
int count = get_mine(show, mine, m, n);
show[m][n] = count + '0';
if (count == 0)
{
surprise(mine, show, x, y, m - 1, n - 1);
surprise(mine, show, x, y, m - 1, n);
surprise(mine, show, x, y, m - 1, n + 1);
surprise(mine, show, x, y, m, n - 1);
surprise(mine, show, x, y, m, n + 1);
surprise(mine, show, x, y, m + 1, n - 1);
surprise(mine, show, x, y, m + 1, n);
surprise(mine, show, x, y, m + 1, n + 1);
}
}
void game()
{
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
Hide_board(mine, ROW, COL, ' ');
Hide_board(show, ROW, COL, '@');
Set_mine(mine, ROW, COL, MINE_COUNT);
Show_board(show, ROW, COL);
setp = ROW * COL - MINE_COUNT;
flag = 1;
while (setp && flag)
{
printf("请输入你要排查的位置:\n");
Find_mine(show, mine, ROW, COL);
}
if (!setp)
{
system("cls");
printf("挑战成功\a\a\a\a\n");
}
else if (!flag)
{
system("cls");
printf("挑战失败\a\a\a\n");
}
Show_board(show, ROW, COL);
for (int j = 0; j <= COL; j++)
{
printf("--");
}
putchar('\n');
Show_board(mine, ROW, COL);
}
int main()
{
srand((unsigned int)time(NULL));
int input = 1;
while (input != 0)
{
Menu();
printf("请输入选项:");
scanf("%d", &input);
switch (input)
{
case 1:
system("cls");
game();
break;
case 2:
system("pause");
system("cls");
How();
break;
case 0:
system("pause");
system("cls");
printf("已成功退出游戏!");
break;
default:
system("pause");
system("cls");
printf("输入有误,请重新输入!");
break;
}
}
return 0;
}