要想实现扫雷游戏的实现,首先我们要理解它的逻辑:
当我们要进行扫雷,首先我们要有一块雷区。
我们初步定义这块雷区大小为9x9.
接下来,我们随机向里面放置10个雷:
现在,我们有了棋盘,布置了雷,可以进行排雷了。
那么对于我们排雷有两种情况:
1.我们排到0,即无雷区,便展示周围雷的个数;
2.我们排到1,即有雷区
对于第二种情况,我们踩雷了,即结束游戏。
那么来看第一种情况:这时我们将周围雷的个数打印出来。
比如第一次我们选择坐标(3,4):
从图上我们可以看出在坐标(3,4)的周围只有一个雷,这时候我们在棋盘上打印1。
如何计算周围雷的个数?
当我们要计算(6,3)——第六列第三行这个区域周围雷的信息,最简单的方式就是将周围的数值加起来并且输出,即(5,2)+(6,2)+(7,2)+(5,3)+(7,3)+(5,4)+(6,4)+(7,4)=3;
但这时,这个3就占据了原先0的位置,产生混淆。于是我们需要一个新的棋盘——一个专门显示信息给玩家看的棋盘。
这样完成了我们排雷的基本逻辑。
但是,一个很关键的地方:
在边角我们怎么去计算周围雷的个数呢?
为了方便计算,并且避免溢出,这时候我们就需要两个11x11的棋盘。
(为了方便以及游戏体验,我们将展示图的每个区域放上星号)
大概游戏思路我们已经完成,那么如何用程序实现它呢?
- 创建雷区和展示区
我们可以建立两个11x11大小的数组(为了与星号统一格式,0、1都用字符形式)
这里的Rows和Cols大小都为11:
char mine[Rows][Cols] = { 0 };
char show[Rows][Cols] = { 0 };
2.我们再设计函数对其进行初始化
createTable(mine, Rows,Cols,'0');
createTable(show, Rows, Cols, '*');
void createTable(char arr[Rows][Cols], int rows, int cols, char set)
{
int i, j;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
arr[i][j] = set;
}
}
}
3.此时我们已经初始化好了两个区域,现在利用随机数函数在雷区中随机创建10个雷
void creatBoom(char arr[Rows][Cols], int row, int col)
{
int ret = 0;
int i, j;
while (ret<10)
{
i = rand() % 9 + 1;
j = rand() % 9 + 1;
if (arr[i][j] == '0')
{
arr[i][j] = '0' + 1;
ret++;
}
}
}
4.创造好了展示棋盘区以及雷区,现在我们还需要一个函数用来打印棋盘
void displayTable(char arr[Rows][Cols], int row, int col)
{
int i, j;
printf(" ");
for (i = 1; i <= row; 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");
}
}
5.现在就是再设计一个函数用于进行游戏
void startBoom(char arr[Rows][Cols], char arr1[Rows][Cols])
{
int r, c,win=0;
do
{
Sleep(250);
system("cls");
displayTable(arr1, Row, Col);
int select = 0;
printf("请输入您的游戏操作:\n");
printf("1.排雷\n");
printf("2.标记雷区\n");
scanf("%d", &select);
if (select == 1)
{
printf("请输入您要猜的位置:\n");
scanf("%d %d", &r, &c);
if (arr[r][c] == '1')
{
printf("很遗憾,您踩雷了!游戏结束!\n");
printf("现在公布雷区:\n");
displayTable(arr, Row, Col);
break;
}
else if (arr[r][c] = '0')
{
int inf = 0;
inf = arr[r - 1][c - 1] + arr[r - 1][c] + arr[r - 1][c + 1] + arr[r][c - 1] + arr[r][c + 1] + arr[r + 1][c - 1] + arr[r + 1][c] + arr[r + 1][c + 1] - '0' * 8;
arr1[r][c] = inf + '0';
win++;
if (win == 71)
printf("恭喜您!排雷成功!\n");
}
else if (r < 1 || c < 1 || r>9 || c>9)
printf("输入错误,请重新输入!\n");
else
printf("无效输入,请重新输入!\n");
}
else if (select == 2)
{
markBoom(arr1);
}
else
{
printf("输入错误,请重新输入\n");
}
} while (win <71);
}
全部游戏过程讲解完毕,现在附上完整源码,加入了标记雷的函数:
testgame.c源文件代码如下:
#include "game.h"
void menu()
{
printf("---------------------------\n");
printf(" 开始游戏 \n");
printf("---------------------------\n");
}
void game()
{
char mine[Rows][Cols] = { 0 };
char show[Rows][Cols] = { 0 };
createTable(mine, Rows,Cols,'0');
createTable(show, Rows, Cols, '*');
creatBoom(mine, Row, Col);
//displayTable(mine, Row, Col);gameMenu();
startBoom(mine, show);
//displayTable(mine, Row, Col);
//displayTable(show, Row, Col);
}
void midGame() {
char mine1[Rows1][Cols1] = { 0 };
char show1[Rows1][Cols1] = { 0 };
createTable1(mine1, Rows1, Cols1, '0');
createTable1(show1, Rows1, Cols1, '*');
creatBoom1(mine1, Row1, Col1);
//displayTable(mine, Row, Col);gameMenu();
startBoom1(mine1, show1);
//displayTable(mine, Row, Col);
//displayTable(show, Row, Col);
}
void gameTest()
{
srand((unsigned int)time(NULL));
int input=0;
int choose;
do {
menu();
printf("请选择->\n");
printf("选择1开始游戏:\n");
printf("选择0退出游戏:\n");
scanf("%d",&input);
switch (input)
{
case 1:
do
{
choose = 0;
printf("请选择游戏难度:\n");
printf("1.简单\n");
printf("2.中等\n");
printf("3.困难\n");
scanf("%d", &choose);
switch (choose)
{
case 1:
game();
break;
case 2:
midGame();
break;
default:
printf("输出错误,请重新选择!\n");
break;
}
} while (choose == 1 || choose == 2);
printf("正在进入游戏...");
Sleep(1000);
break;
case 0:
break;
default:
printf("输出错误,请重新选择!\n");
break;
}
} while (input);
}
int main()
{
gameTest();
return 0;
}
game.c源文件代码如下:
#include "game.h"
void createTable(char arr[Rows][Cols], int rows, int cols, char set)
{
int i, j;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
arr[i][j] = set;
}
}
}
void displayTable(char arr[Rows][Cols], int row, int col)
{
int i, j;
printf(" ");
for (i = 1; i <= row; 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");
}
}
void creatBoom(char arr[Rows][Cols], int row, int col)
{
int ret = 0;
int i, j;
while (ret<10)
{
i = rand() % 9 + 1;
j = rand() % 9 + 1;
if (arr[i][j] == '0')
{
arr[i][j] = '0' + 1;
ret++;
}
}
}
void startBoom(char arr[Rows][Cols], char arr1[Rows][Cols])
{
int r, c,win=0;
do
{
Sleep(250);
system("cls");
displayTable(arr1, Row, Col);
int select = 0;
printf("请输入您的游戏操作:\n");
printf("1.排雷\n");
printf("2.标记雷区\n");
scanf("%d", &select);
if (select == 1)
{
printf("请输入您要猜的位置:\n");
scanf("%d %d", &r, &c);
if (arr[r][c] == '1')
{
printf("很遗憾,您踩雷了!游戏结束!\n");
printf("现在公布雷区:\n");
displayTable(arr, Row, Col);
break;
}
else if (arr[r][c] = '0')
{
int inf = 0;
inf = arr[r - 1][c - 1] + arr[r - 1][c] + arr[r - 1][c + 1] + arr[r][c - 1] + arr[r][c + 1] + arr[r + 1][c - 1] + arr[r + 1][c] + arr[r + 1][c + 1] - '0' * 8;
arr1[r][c] = inf + '0';
win++;
if (win == 71)
printf("恭喜您!排雷成功!\n");
}
else if (r < 1 || c < 1 || r>9 || c>9)
printf("输入错误,请重新输入!\n");
else
printf("无效输入,请重新输入!\n");
}
else if (select == 2)
{
markBoom(arr1);
}
else
{
printf("输入错误,请重新输入\n");
}
} while (win <71);
}
void markBoom(char arr[Rows][Cols])
{
int i=0,j=0;
printf("请输入您想标记的位置\n");
scanf("%d %d", &i, &j);
if ((i < 1 || i>9) || (j < 1 || j>9))
{
printf("无效输入,请重新输入\n");
}
else if (arr[i][j] == '*')
{
arr[i][j] = '#';
}
}
void createTable1(char arr[Rows1][Cols1], int rows, int cols, char set)
{
int i, j;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
arr[i][j] = set;
}
}
}
void displayTable1(char arr[Rows1][Cols1], int row, int col)
{
int i, j;
printf(" ");
for (i = 1; i <= row; i++)
{
printf("%3d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%3d ", i);
for (j = 1; j <= col; j++)
{
printf("%3c ", arr[i][j]);
}
printf("\n");
}
}
void creatBoom1(char arr[Rows1][Cols1], int row, int col)
{
int ret = 0;
int i, j;
while (ret < 10)
{
i = rand() % 16 + 1;
j = rand() % 16 + 1;
if (arr[i][j] == '0')
{
arr[i][j] = '0' + 1;
ret++;
}
}
}
void startBoom1(char arr[Rows1][Cols1], char arr1[Rows1][Cols1])
{
int r, c, win = 0;
do
{
system("cls");
displayTable1(arr1, Row1, Col1);
char select = 0;
printf("请输入您的游戏操作(输入#标记雷区):\n");
printf("1.排雷\n");
printf("#.标记雷区\n");
scanf("%c", &select);
if (select == '1')
{
printf("请输入您要猜的位置:\n");
scanf("%d %d", &r, &c);
if (arr[r][c] == '1')
{
printf("很遗憾,您踩雷了!游戏结束!\n");
printf("现在公布雷区:\n");
displayTable(arr, Row, Col);
break;
}
else if (arr[r][c] = '0')
{
int inf = 0;
inf = arr[r - 1][c - 1] + arr[r - 1][c] + arr[r - 1][c + 1] + arr[r][c - 1] + arr[r][c + 1] + arr[r + 1][c - 1] + arr[r + 1][c] + arr[r + 1][c + 1] - '0' * 8;
arr1[r][c] = inf + '0';
win++;
if (win == 216)
printf("恭喜您!排雷成功!\n");
}
else if (r < 1 || c < 1 || r>16 || c>16)
printf("输入错误,请重新输入!\n");
else
printf("无效输入,请重新输入!\n");
}
else if (select == '#')
{
markBoom1(arr1);
}
} while (win < 216);
}
void markBoom1(char arr[Rows1][Cols1])
{
int i = 0, j = 0;
printf("请输入您想标记的位置\n");
scanf("%d %d", &i, &j);
if ((i < 1 || i>16) || (j < 1 || j>16))
{
printf("无效输入\n");
}
else if (arr[i][j] == '*')
{
arr[i][j] = '#';
}
}
game.h头文件源码如下:
#include<stdio.h>
#include<stdlib.h>
#define Row 9
#define Col 9
#define Rows Row+2
#define Cols Col+2
#define Row1 16
#define Col1 16
#define Rows1 Row1+2
#define Cols1 Col1+2
void createTable(char arr[Rows][Cols], int rows, int cols, char set);
void displayTable(char arr[Rows][Cols],int row,int col);
void creatBoom(char arr[Rows][Cols], int row, int col);
void startBoom(char arr[Rows][Cols], char arr1[Rows][Cols]);
void markBoom(char arr[Rows][Cols]);
void createTable1(char arr[Rows1][Cols1], int rows, int cols, char set);
void displayTable1(char arr[Rows1][Cols], int row, int col);
void creatBoom1(char arr[Rows1][Cols1], int row, int col);
void startBoom1(char arr[Rows1][Cols1], char arr1[Rows1][Cols1]);
void markBoom1(char arr[Rows1][Cols1]);
如果这篇文章对你有帮助,请留下您的珍贵评论点赞+收藏,这将是我前进的动力!!学海无涯,共勉!