提问C初写扫雷程序的一些问题

目前出现问题有:插旗未显示、第二次踩雷才退出、点击空格未显示数字
思路和自学课里教的不一样,不知道怎么改,求指点
#include<stdio.h>
#include<stdlib.h>

#define hang 10
#define lie 10

char board[hang][lie];
void initboard(char board[][lie], int a, int b)//初始化、放雷
{
for (a = 0; a < hang-1; a++)
{
for (b = 0; b < lie-1; b++)
{
board[a][b] = ' ';
}
}
int z = 0;
srand((unsigned)time(NULL));
while(1)
{
int x = rand() % hang+1;
int y = rand() % lie + 1;
if (board[x][y] == ' '&&z<20)
{
board[x][y] = 'B';
z++;
}
if (z == 20)
break;
}
}

int check(int a, int b)//在已点击空格显示周围雷数
{
int e = 0; int k = 0; int g = 0;
int c = -1; int d =-1;
for (c == - 1; c<=1; c++)
{
for (d == - 1; d<=1; d++)
{
if (board[a+c][b+d] == 'B' && g < 6)
{
e++; g++;
}
if (board[a + c][b + d] == ' ' && g < 6)
{
g++;
check(a + c, b + d);
char k = check(a + c, b + d);
board[a + c][b + d] == ("%c", k);
}
}
}
return e;
}
void dayin(char board[][lie], int a, int b)//打印所有格子
{
int i = 0; int h = 0;
for (i = 0; i < hang - 1; i++)
{
printf(" %d ", i+1);
}
printf("\n");
for (h = 0; h < a - 1; h++)
{
int l = 0;
printf("%d", h+1);
for (l = 0; l < b - 1; l++)
{
if (board[h][l] = 'B')//让格子呈现玩家看到的状态(空格或旗
{
printf(" ");
}
if (board[h][l] == 'A')
{
printf(" F ");
}
if (board[h][l] == 'C')
{
printf(" F ");
}
else
printf(" %c ", board[h][l]);
if (l < b - 2)
printf("|");
}
printf("\n");
if (h < a - 2)
{
int l = 0; int j = 0;
for (l = 0; l < b - 1; l++,j++)
{
if (j < lie - 1&&j!=0)
{
printf("——");
}
if (j == 0)
{
printf(" ——");
}
if (l < b - 2)
printf("|");
}
printf("\n");
}
}
}
int judge(char board[][lie], int a, int b)//判断是否获胜
{
for (a = 0; a < hang - 1; a++)
{
for (b = 0; b < lie - 1; b++)
{
if (board[a][b] = ' ')
{
return 2;
}
if (board[a][b] = 'C')
{
return 2;
}
if (board[a][b] = 'B')
{
return 2;
}
if ( board[a][b] ='A')
{
if (a == hang - 1 && b == lie - 1 )
{
return 1;
}
}
}
}
}
int player(char board[][lie], int a, int b)//玩家操作
{
int x = 0; int y = 0; int f = 0;
while (1)
{
int k = 0;
top3:
scanf_s("%d %d", &x, &y);
if (x >= 1 && x <= a - 1 && y >= 1 && y <= b - 1)
{
do
{
if (board[x - 1][y - 1] == 'B')
{
printf("\nBoom!\n");
return 3;
}
if (board[x - 1][y - 1] == ' ')
{
check(x - 1, y - 1);
char k = check(x - 1, y - 1);
board[x - 1][y - 1] == ("%c", k);
dayin(board, hang, lie);
break;
}
} while (1);
}
if (x == 0 && y == 0)//插旗
{
printf("开启标记模式!\n");
top5:printf(" ");
int x2 = 0; int y2 = 0;
scanf_s("%d %d", &x2, &y2);
if (x2 >= 1 && x2 <= a - 1 && y2 >= 1 && y2 <= b - 1)
{
if (board[x2 - 1][y2- 1] == 'B')
{
board[x2 - 1][y2- 1] == 'A';
dayin(board, hang, lie);
goto top5;
}
if (board[x2 - 1][y2 - 1] == ' ')
{
board[x2 - 1][y2 - 1] == 'C';
dayin(board, hang, lie);
goto top5;
}
}
if (x2 == 0 && y2 == 0)
{
printf("关闭标记模式!\n");
goto top3;
}
else
goto top5;
}
else
goto top3;
}
}

void menu()//主流程
{
printf("扫雷!\n输入数字:行(空格)列坐标点开空格\n输入:0(空格)0开启/关闭标记模式!\n");
}
int main()
{
menu();
initboard(board, hang, lie);
dayin(board, hang, lie);
while (1)
{
player(board, hang, lie);
if(player(board, hang, lie) ==3)
{
printf("GG!You lost\n");//不知为何第二次踩雷才显示这句并退出
break;
}
dayin(board, hang, lie);
judge(board, hang, lie);
int q = judge(board, hang, lie);
switch (q)
{
case 1:
printf("GG!You win\n");
break;
}
}

return 0;

}

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^