想要做出这个游戏,我们需要先了解游戏的玩法。就是在一个棋盘上面有若干个雷(隐藏的),当点击棋盘空格区域时,会显示相邻1格的雷的个数,若点中了雷,则游戏结束。
接下来让我们看看该如何做到这个扫雷游戏的实现。
还是一样,我们把这游戏的代码分成三个文件来完成,一个game.h用来存放游戏实现的各种函数声明以及头文件,game.c用来放游戏的实现函数定义,test.c用来存放游戏的界面打印和运行过程代码。
首先我们需要打印出游戏菜单来让玩家选择,代码如下:
void menu()
{
printf("***************************\n");
printf("******* 1.play **********\n");//选择1进行游戏
printf("******* 0.exit **********\n");//0退出游戏
printf("***************************\n");
}
然后让我们看一下主函数的代码:
int main()
{
int in = 0;
srand((unsigned int)time(NULL));//设置随机数
do
{
menu();//打印菜单
printf("请选择\n");
scanf_s("%d", &in);
switch (in)//接收输入的数,进行判断
{
case 1:
printf("开始游戏\n");
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误");
break;
}
} while (in);//循环,只要不选择退出游戏就可以一直玩
return 0;
}
然后给大家看一下game.h中的代码
接下来就是这个游戏的核心部分,game.c的代码该如何设置:
首先我们来分析一下该如何做,先我们需要一个棋盘来设置雷,但是我们又不能够将雷直接放给玩家看,所以我们需要在设置一个棋盘,展示给玩家看,让他们进行扫雷。我们将设置雷的棋盘上全部放上 0 ,然后雷设置为 1 ,展示给玩家的棋盘全部设为 * ,让玩家进行扫雷,下面是代码:
char mine[ROWS][COLS] = { 0 };//定义的设置雷的棋盘
char show[ROWS][COLS] = { 0 };//玩游戏的棋盘
InitBoard(mine, ROWS, COLS, '0');//将棋盘中放上 0
InitBoard(show, ROWS, COLS, '*');//将棋盘全部放上 *
void InitBoard(char board[ROWS][COLS], int rs, int cs,char set)//这个函数是给棋盘赋上值
{
int i, j;
for (i = 0; i < rs; i++)
{
for (j = 0; j < cs; j++)
{
board[i][j] = set;
}
}
}
接下来打印展示的游戏棋盘,同时为了美观和游戏体验,我们将棋盘设置成大两行的数列,便于操作,并在棋盘上下划线便于区分:
void show_board(char board[ROWS][COLS], int r, int c)
{
int i, j;
printf("-----------扫雷-----------\n");
for (i = 0; i <= c; i++)//这一步是将每一列的列数打印出来
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= r;i++)
{
printf("%d ", i);//将每一行的行数打印出来
for (j = 1; j <= c; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("-----------扫雷-----------\n");
}
然后就是布置雷了,这里我们要用到rand函数,随机设置雷的分布,并要注意不能重复设置:
void set_mine(char board[ROWS][COLS], int r, int c)
{
int x, y;
int count = COUNT;//雷的个数
while (count)//当雷不为0时进入循环
{
x = rand() % r + 1;//在1到r中取随机数坐标
y = rand() % r + 1;
if (board[x][y] == '0')//当没有设置过雷时才能进入设置雷,否则重新循环
{
board[x][y] = '1';
count--;//当设置了一个雷后,雷的数量减一
}
}
}
接下来让我们开始扫雷:
int get_mine_count(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 find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int r, int c)
{
int x, y, win = 0;//win为排查非雷的个数
while (win < r * c - COUNT)
{
printf("请输入要排查的坐标:\n");
scanf_s("%d%d", &x, &y);
if (x >= 1 && x <= r && y >= 1 && y <= c)
{
if (mine[x][y] == '1')//如果输入的坐标有雷,进入
{
printf("很遗憾,被炸死了。\n");
show_board(mine, ROW, COL);//将设置雷的棋盘打印出来
break;
}
else
{
int count = get_mine_count(mine, x, y);//将排查的非雷坐标附近的八个坐标的雷的数量打印出来
show[x][y] = count + '0';
show_board(show, ROW, COL);
win++;
}
}
else
{
printf("坐标非法,重新输入\n");
}
}
if (win == r * c - COUNT)//当非雷数与棋盘的格数减去雷数相等时,则游戏胜利
{
printf("恭喜你,排雷成功\n");
show_board(mine, ROW, COL);
}
}
然后这游戏的主要代码已经写完了,给你们整合一下game.h和test.c的代码:
game.h
#pragma once
#include
#include
#include
#define COL 9
#define ROW 9
#define ROWS 11
#define COLS 11
#define COUNT 10
void InitBoard(char board[ROWS][COLS], int r, int c,char set);
void show_board(char board[ROWS][COLS],int r,int c);
void find_mine(char mine[ROWS][COLS],char show[ROWS][COLS],int r, int c);
void set_mine(char board[ROWS][COLS], int r, int c);
test.c
#include"game.h"
void menu()
{
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, '*');
set_mine(mine, ROW, COL);
show_board(show, ROW, COL);
find_mine(mine, show, ROW, COL);
}
int main()
{
int in = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择\n");
scanf_s("%d", &in);
switch (in)
{
case 1:
printf("开始游戏\n");
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误");
break;
}
} while (in);
return 0;
}
好了,这一次的扫雷游戏就结束了,快点写完去玩两把吧,自己做到游戏玩起来可是有不同的成就感哦!
看到这里了还不三连吗!!!