在写代码之前,我们应当了解扫雷这款游戏所需要的基本要素
1.棋盘
2.坐标
3.判断
棋盘:
9*9的格子
随机布置10个雷
坐标:
运用基础的二维数组,在棋盘周围打上坐标
判断:
判断选中位置是否是雷
是,则游戏失败
若不是,则计算周围雷的数量
棋盘:
因为最边缘的坐标在计算周围雷的个数的时候,会以自身为中心向周围“扫描”
所以在制作代表棋盘的二维数组时候,我们可以将数组的范围扩大一圈
如同右侧图片所显示的一样,我们可以将绿色的范围输入字符'0'。这样计算周围雷的数量时,会方便不少。
雷的随机生成:
我们采用伪随机数【rand()函数】的方式来布置雷
首先需要头文件:#include <time.h>和#include <sedlib.h>
随后在函数中使用srand((unsigned int)time(NULL));来生成一段伪随机数
使用起来也非常简单,比如 int a = rand(); 这样a就是一段随机数
我们使棋盘中的 x轴 和y轴为随机数,这样就能随机生成雷了
为了后文方便计算,可以令雷的位置='1'
为了防止同一个地方重复生成雷,我们需要添加一个if条件,判断该地方为'0'后,再令其='1'
注意,文中所说的'0'和'1'均为字符,'0'在ASCII码中为48,'1'为49
判断周围雷的数量:
因为周围都是字符'0'或者'1',他们的ASCII码为48、49
因此我们可以做一个简单的运算,得出周围雷的数量
如:
其中return的返回值,就是雷的数量,但是我们不能直接运用在数列中。
因为我们设置的数列内容是“字符”
我们需要得到的结果(return的返回值) + '0'
如: 2 + '0' = 50 50在ASCII码对照表中就是'2'
随后可以令选中的位置 = '2'
假如选中的位置是 x和 y
列出来的等式就是:int count = GetnMineCount(mine, x,y) (函数的返回值为上文return的返回值)
show[x][y] = count + '0';
较难的地方就是这些,剩下的就是函数实现了
函数如下:
test.h
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 9
#define COL 9
#define ROWS ROW + 2
#define COLS COL + 2
#define NUMBER 10
int start();
void InitBoard(char board[ROWS][COLS], int row, int cols, char set);
void Displayboard(char board[ROWS][COLS], int row, int col);
void Setmine(char board[ROWS][COLS], int row, int col);
void Finemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
text.c
#include "test.h"
int start()
{
printf("****************\n");
printf("****************\n");
printf("****1. play ****\n");
printf("****0. exit ****\n");
printf("****************\n");
printf("****************\n");
return 0;
}
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
int a = 0;
for (a = 0; a < rows; a++) {
int b = 0;
for (b = 0; b < cols; b++) {
board[a][b] = set;
}
}
}
void Displayboard(char board[ROWS][COLS], int row, int col)
{
int a = 0;
printf("--------扫雷游戏-------\n");
for (a = 0; a <= col; a++) {
printf("%d ", a);
}
printf("\n");
for (a = 1; a <= row; a++) {
printf("%d ", a);
int b = 0;
for (b = 1; b <= row; b++) {
printf("%c ", board[a][b]);
}
printf("\n");
}
}
void Setmine(char board[ROWS][COLS], int row, int col)
{
int count = NUMBER;
while (count) {
int x = rand() % row + 1;
int y = rand() % col + 1;
if (board[x][y] == '0') {
board[x][y] = '1';
count--;
}
}
}
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
return
(mine[x-1][y-1] + mine[x-1][y] + mine[x-1][y+1]
+mine[x][y+1] + mine[x][y-1]
+mine[x+1][y-1] +mine [x+1][y] + mine[x+1][y+1] - 8 * '0');
}
void Finemine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (win < row*col - NUMBER) {
printf("请输入要排查的坐标\n");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col) {
if (mine[x][y] == '1') {
printf("很遗憾,你被炸死了\n");
Displayboard(mine, ROW, COL);
break;
}
else {
int count = GetMineCount(mine, x, y);
show[x][y] = count + '0';
Displayboard(show, ROW, COL);
win++;
}
}
else
{
printf("输入错误,请重新输入");
}
}
if (win == row * col - NUMBER)
{
printf("恭喜你,排雷成功");
Displayboard(show, ROW, COL);
}
}
game.c
#include "test.h"
void game()
{
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');
Displayboard(show, ROW, COL);
Setmine(mine, ROW, COL);
Finemine(mine, show, ROW, COL);
}
int main()
{
int judment = 0;
printf("请选择\n");
do {
start();
scanf("%d", &judment);
if (judment == 1) {
srand((unsigned int)time(NULL));
game();
break;
}
else {
printf("输入错误,请重新输入\n");
}
} while (judment != 0);
return 0;
}