打印菜单
首先我们需要一个简易的游戏菜单,以供玩家选择;
这里我选择用do-while语句来实现:
void meau()
{
printf("******************\n");
printf("******1.play******\n");
printf("******0.exit******\n");
printf("******************\n");
}
int main()
{
int input;
srand((unsigned int)time(NULL));
do
{
meau();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误\n");
break;
}
} while (input);
}
其中之所以采用数字0和1来进行选择,是因为当玩家选择0时,do-while语句为假,就能够退出游戏;选择1时,就能够进入游戏;选择其他数,就能够让玩家重新选择,直到进入或者退出游戏。
运行结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/51ba165063a2ff7d4ada065e7215b636.png)
初始化棋盘
我们需要创建两个11*11的二维数组,一组用于安置雷,全部初始化为’0‘,另一组用于展示,全部初始化为’*‘,但只在中间9*9的数组里进行操作,目的是为了方便玩家输入常规坐标,也方便电脑统计坐标周围雷的数量。
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i, j;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
其中如果传入数组为安置雷的,set则为’0‘,如果为展示的,set则为’*‘。
打印棋盘
为了让玩家能够清楚的知道每一个点的坐标,我在每行每列前加上了对应的数字。展示数组为第一个,雷数组为第二个(还未安置雷),但在进行游戏时雷数组是不会显示出来的,扫雷成功或者扫雷失败则会出现。
void Display(char board[ROWS][COLS], int row, int col)
{
int i, j;
printf("\n*******扫雷*******\n");
for (j = 0; j <= row; j++)
{
printf("%d ", j);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
运行结果为:
![](https://i-blog.csdnimg.cn/blog_migrate/3703bbb3ed0959ef252a2963e46e8d81.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7152f9d4209b87cd6b5784394b3a085e.png)
安置雷
电脑需要随机生成坐标来安置雷,故需要一个随机数生成器,即rand( ),但在调用rand( )之前,需要在主函数中调用srand( ),引用的库函数为<stdlib.h>,还需要在头文件中定义一个雷的数量,以便控制游戏的难易程度。
void SetMine(char mine[ROWS][COLS], int row, int col)
{
int count = Easy_Count;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
其中我用1来代替0,即1就为雷。因为控制了雷的数量为10个,故在棋盘中间9*9的格子里共有10个雷,即有10个1。
![](https://i-blog.csdnimg.cn/blog_migrate/a22bb40179b4cd23a0b6120bf8ffddb8.png)
扫雷
玩家输入一个要搜索的坐标,然后判断该位置是否已经被搜索,如果被搜索过,则需要重新选择坐标搜索,如果未被搜索,则需要统计以自身为中心周围一圈所存在的雷的个数,并填入坐标内,重复操作,直到将所有不是雷的坐标搜索了,才能扫雷成功。
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x, y;
int win = 0;
while (win < row*col - Easy_Count)
{
printf("请输入要排查的坐标:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '1')
{
printf("\n很遗憾,你被炸死了\n");
Display(mine, ROW, COL);
break;
}
else
{
//该坐标不是雷,则统计其周围雷的个数
int count = GetMineCount(mine, x, y);
show[x][y] = count + '0';
Display(show, ROW, COL);
win++;
}
}
else
{
printf("坐标错误,请重新输入\n");
}
}
if (win == row * col - Easy_Count)
{
printf("\n恭喜你,扫雷成功\n");
}
}
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
return(mine[x - 1][y]
+ mine[x - 1][y - 1]
+ mine[x][y - 1]
+ mine[x + 1][y - 1]
+ mine[x + 1][y]
+ mine[x + 1][y + 1]
+ mine[x][y + 1]
+ mine[x - 1][y + 1] - 8 * '0');
}
下面是我把雷的个数调为了80个,并将雷数组打印了出来,所得到的游戏结果。
![](https://i-blog.csdnimg.cn/blog_migrate/90d0760fd3930d831344991244a9acf5.png)
完整代码
//game.h头文件里的代码
#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
#define Easy_Count 80
//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
//打印棋盘
void Display(char board[ROWS][COLS], int row, int col);
//安置雷
void SetMine(char mine[ROWS][COLS], int row, int col);
//扫雷
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col);
//test.c文件里的代码
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void meau()
{
printf("******************\n");
printf("******1.play******\n");
printf("******0.exit******\n");
printf("******************\n");
}
void game()
{
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
//初始化棋盘
InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');
//打印棋盘
Display(show, ROW, COL);
//布置雷
SetMine(mine, ROW, COL);
//Display(mine, ROW, COL);
//排查雷
FindMine(mine, show, ROW, COL);
}
int main()
{
int input;
srand((unsigned int)time(NULL));
do
{
meau();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误\n");
break;
}
} while (input);
}
//game.c里的代码
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i, j;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
void Display(char board[ROWS][COLS], int row, int col)
{
int i, j;
printf("\n*******扫雷*******\n");
for (j = 0; j <= row; j++)
{
printf("%d ", j);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void SetMine(char mine[ROWS][COLS], int row, int col)
{
int count = Easy_Count;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
return(mine[x - 1][y]
+ mine[x - 1][y - 1]
+ mine[x][y - 1]
+ mine[x + 1][y - 1]
+ mine[x + 1][y]
+ mine[x + 1][y + 1]
+ mine[x][y + 1]
+ mine[x - 1][y + 1] - 8 * '0');
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x, y;
int win = 0;
while (win < row*col - Easy_Count)
{
printf("请输入要排查的坐标:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '1')
{
printf("\n很遗憾,你被炸死了\n");
Display(mine, ROW, COL);
break;
}
else
{
//该坐标不是雷,则统计其周围雷的个数
int count = GetMineCount(mine, x, y);
show[x][y] = count + '0';
Display(show, ROW, COL);
win++;
}
}
else
{
printf("坐标错误,请重新输入\n");
}
}
if (win == row * col - Easy_Count)
{
printf("\n恭喜你,扫雷成功\n");
}
}
以上就是这个小游戏的全部代码,大家还有什么不懂的或者建议都可以在评论区中发出来,我们可以共同讨论学习,共同进步。最后还请各位多多点赞,谢谢大家了!