- 游戏介绍
扫雷游戏相信大家都玩过,上图就是一个网页版的扫雷,它的规则是玩家选择一个方格,若此方格没有地雷,那么该方格会显示与它相邻的八个方格中雷的个数,若此方格有地雷,那么游戏失败,当玩家把除了有地雷的方格外的其他方格都成功翻开时,游戏胜利。
- 棋盘的定义
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9 //行
#define COL 9 //列
#define ROWS ROW+2
#define COLS COL+2
int Menu(void);
void PlayBoard(char arr[ROWS][COLS], char empty[ROW][COL]);//初始化棋盘
void SetMine(char arr[ROWS][COLS], char empty[ROW][COL]);//布置雷
void PrintBoard(char arr[ROWS][COLS], char empty[ROW][COL]);//打印棋盘
void ExcludeMine(char arr[ROWS][COLS], char empty[ROW][COL]);//排雷
如上图:我们定义了两个棋盘,分别用来保存布置雷的信息和排查雷的信息,这样就可以避免二者相互干扰或者相互覆盖;
同时,我们使用宏来定义雷盘的大小以及雷的个数,这样做的好处是当我们以后想使用更大的雷盘或者想增加扫雷的难度的时候,我们只需要改动这里一次即可,增加了代码的可维护性。
- 初始化棋盘
#include "game.h"
void PlayBoard(char arr[ROWS][COLS], char empty[ROW][COL])//初始化棋盘
{
int i, j;
for (i = 0; i <= ROWS; i++)
{
for (j = 0; j <= COLS; j++)
{
arr[i][j] = '0';
}
}
for (i = 1; i <= ROW; i++)
{
for (j = 1; j <= COL; j++)
{
empty[i][j] = '*';
}
}
}
- 布置雷
布置雷我们需要注意:
1.防止重复布置
2.雷必须是随机的
void SetMine(char arr[ROWS][COLS], char empty[ROW][COL])//布置雷
{
int i, x, y;
srand((unsigned int)time(NULL));
for (i = 0; i < 10; i++)
{
x = rand() % ROW + 1;
y = rand() % COL + 1;
if (arr[x][y] == '0')
arr[x][y] = '1';
else
i--;
}
}
- 打印棋盘
我们只需要把全是'*'的棋盘展现给玩家
void PrintBoard(char arr[ROWS][COLS], char empty[ROW][COL])//打印棋盘
{
int i, j;
/*for (i = 0; i < 10; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= ROW; i++)
{
printf("%d ", i);
for (j = 1; j <= COL; j++)
{
printf("%c ", arr[i][j]);
}
printf("\n");
}*/
for (i = 0; i < 10; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= ROW; i++)
{
printf("%d ", i);
for (j = 1; j <= COL; j++)
{
printf("%c ", empty[i][j]);
}
printf("\n");
}
}
- 排雷
排雷我们需要注意:
1.不得重复排雷
2.坐标不得超出范围
void ExcludeMine(char arr[ROWS][COLS], char empty[ROW][COL])//排雷
{
int x = 0, y = 0, p = 0, q = 1;
while (p != 71 && q == 1)
{
int count = 0;
printf("请输入排查的坐标(列 行)->");
scanf("%d%d",&x,&y);
if (x > 0 && x < 10 && y>0 && y < 10)
{
if (empty[x][y] == '*')
{
if (arr[x][y] == '1')
{
printf("很遗憾,你被炸死了!\n");
system("pause");
q = 0;
}
else
{
count = count +
arr[x - 1][y - 1] +
arr[x - 1][y] +
arr[x - 1][y + 1] +
arr[x][y - 1] +
arr[x][y + 1] +
arr[x + 1][y - 1] +
arr[x + 1][y] +
arr[x + 1][y + 1] - 8 * '0';
empty[x][y] = count + '0';
printf("%d\n", count);
PrintBoard(arr, empty);
p++;
}
}
else
{
printf("该坐标已被排查,请重新输入!\n");
}
}
else
{
printf("非法输入,请重新输入!\n");
}
}
if (p == 71)
{
printf("恭喜你,排雷成功!\n");
}
}