C语言中excit函数,扫雷游戏(C语言实现)

#include#define ROW 7

#define COL 7

#define mine 4 * (ROW - 2)*(COL - 2) / 10//埋雷个数,控制比列

void SetMine(char mine_board[ROW][COL])//埋雷函数

{

srand((unsigned long)time(NULL));

int sum = mine;

int x, y;

while (sum)

{

x = rand() % (ROW - 2) + 1;

y = rand() % (COL - 2) + 1;

if (mine_board[x][y] == '0')

{

sum--;

mine_board[x][y] = '*';

}

}

}

void CountMine(char mine_board[ROW][COL])//给安全位置标数字

{

int i, j, p1, p2, sum;

for (i = 1; i < ROW - 1; i++)

{

for (j = 1; j < COL - 1; j++)

{

sum = 0;

if (mine_board[i][j] != '*')

{

for (p1 = i - 1; p1 <= i + 1; p1++)

{

for (p2 = j - 1; p2 <= j + 1; p2++)

{

if (mine_board[p1][p2] == '*')

sum++;

}

}

mine_board[i][j] = sum + '0';

}

}

}

}

void Show(char show_board[ROW][COL])//打印函数

{

int i, j;

printf(" 1 2 3 4 5 6 7 8 9 10\n");

printf("--------------------------------------------\n");

for (i = 1; i < ROW - 1; i++)

{

printf("%2d|", i);

for (j = 1; j < COL - 1; j++)

{

printf(" %c |", show_board[i][j]);

}

printf("\n");

printf("--------------------------------------------\n");

}

}

void Expand(char Tmine_board[ROW][COL], char show_board[ROW][COL], int x, int y)//把选中位置挨着的安全区域标识出来,在showboard上显示出来

{

if (x < 1 || x>ROW - 2 || y < 1 || y>COL - 2 || Tmine_board[x][y] == '*')

return;

else

{

show_board[x][y] = Tmine_board[x][y];

Tmine_board[x][y] = '*';

}

Expand(Tmine_board, show_board, x + 1, y);

Expand(Tmine_board, show_board, x - 1, y);

Expand(Tmine_board, show_board, x, y + 1);

Expand(Tmine_board, show_board, x, y - 1);

}

int Judge(char show_board[ROW][COL])//判断是否赢了

{

int sum = 0;

for (int i = 1; i < ROW - 1; i++)

{

for (int j = 1; j < COL - 1; j++)

{

if (show_board[i][j] == '?')

{

sum++;

}

}

}

if (sum == mine)

return 1;

else

return 0;

}

void PlayGame(char mine_board[ROW][COL], char show_board[ROW][COL])

{

char Tmine_board[ROW][COL];//创建一个和雷区数组一样的数组,用来后面递归函数使用

memset(Tmine_board, '0', sizeof(Tmine_board));

int i, j;

for (i = 1; i < ROW - 1; i++)

{

for (j = 1; j < COL - 1; j++)

{

Tmine_board[i][j] = mine_board[i][j];

}

}

int x, y, key = 1;

while (key)

{

scanf("%d%d", &x, &y);

if (mine_board[x][y] == '*')

{

if (key == 1)

{

printf("此处有雷,重新输入\n");

Show(show_board);

key++;

}

else

{

printf("游戏结束\n");

Show(mine_board);

key = 0;

}

}

else

{

key++;

Expand(Tmine_board, show_board, x, y);//把选中位置挨着的安全区域标识出来,在showboard上显示出来

Show(show_board);

if (Judge(show_board) == 1)//判断是否赢了

{

key = 0;

printf("你赢了\n");

}

}

}

}

void play()

{

char mine_board[ROW][COL];

char show_board[ROW][COL];

memset(show_board, '?', sizeof(show_board));

memset(mine_board, '0', sizeof(mine_board));

SetMine(mine_board);//埋雷函数

CountMine(mine_board);//给安全位置标数字

Show(show_board);//打印函数

PlayGame(mine_board, show_board);

}

int main()

{

int key = 1;

int menu = 0;

while (key)

{

printf("#######################\n");

printf("###1 play 2 excit ###\n");

printf("#######################\n");

scanf("%d", &menu);

switch (menu)

{

case 1:

play();

break;

case 2:

key = 0;

break;

default:

printf("输入有误,请重新输入\n");

break;

}

}

system("pause");

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值