一、扫雷介绍
1.扫雷背景详细
《扫雷》是一款大众类的益智小游戏,于1992年发行。 游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。
2.扫雷规则
盘面上有许多方格,方格中随机分布着一些雷。 你的目标是避开雷,打开其他所有格子。 一个非雷格中的数字表示其相邻8格中的雷数,你可以利用这个信息推导出安全格和雷的位置。 你可以用右键在你认为是雷的地方插旗(称为标雷)。 你可以用左键打开安全的地方,左键打开雷将被判定为失败。
小tips:随机点开一个格子,然后以该格子为中心的九宫格,该格子数字是几,就表示该九宫格中有几个雷。
二、设计思路
一般游戏的实现需要三个文件:game.h game.c test.c进行模块化编程。这样子如果你想要游戏能玩并且不让别人看到重要部分,可以把其中进行隐藏。
从大体上扫雷可以分为三个方面:首先:进行扫雷游戏分析和设计
其次:进行扫雷游戏的代码实现
最后:进行扫雷游戏的扩展
三、代码的实现
3.1.首先创建一个test.c文件(储存主函数)
该文件的作用就是先从大体上对该游戏的时间进行分析,大致对代码进行总体的书写,方便后期对里面细节程序进行加工处理。
注意:该主函数里面的头文件可以先进行书写,然后后期进行处理的话可以把头文件全部放在game.h文件中,然后在test.c和game.c文件中包含game.h的头文件即可,这样子也更加方便对头文件进行规则性的整合。
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void meau()
{
printf("***************************\n");
printf("********* 1.开始游戏 ******\n");
printf("********* 0.结束游戏 ******\n");
printf("***************************\n");
}
void game()
{
//完成扫雷
///mine数组中存放布置好的雷的信息
char mine[ROWS][COLS] = { 0 };//数组全部初始化为0
//show数组中存放排查出的雷的信息
char show[ROWS][COLS] = { 0 };//数组全部初始化为*
//初始化棋盘
InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');
//布置雷
//在9*9随机布置10个雷
SetMain(mine,ROW,COL);
//DisplayBoard(mine, ROW, COL);
//打印棋盘
DisplayBoard(show, ROW, COL);
//排查雷
FindMain(mine,show,ROW,COL);
}
void test()
{
int input = 0;
srand(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);
}
int main()
{
test();
return 0;
}
3.2.然后创建一个game.h文件(存放函数的声明和定义)
该文件的存在主要用于函数的声明和定义,可以让读者从此处得到相应理解
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 9 //行数为9
#define COL 9 //行数为11
#define ROWS ROW+2
#define COLS COL+2
//雷的个数
#define EASY_COUNT 10
//声明函数
void InitBoard(char arr[ROWS][COLS], int rows, int cols);
//打印棋盘
void DisplayBoard(char arr[ROWS][COLS], int row, int col);
//布置雷
void SetMain(char arr[ROWS][COLS], int row, int col);
//排查雷
void FindMain(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
3.3.最后创建一个game.c文件(对游戏的实现)
该文件方便对game.h中定义的函数进行相应的实现,使游戏能实现起来。该文件的存在更有利于读者对代码从大体层面进行理解和掌握。
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void InitBoard(char arr[ROWS][COLS], int rows, int cols,char set)
{
int i = 0;
for (i = 0; i < rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
arr[i][j] = set;
}
}
}
void DisplayBoard(char arr[ROWS][COLS], int row, int col)
{
int i = 0;
//打印列号
printf("------扫雷开始-----\n");
for (i = 0; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
int j = 0;
printf("%d ", i);
for (j = 1; j <= col; j++)
{
printf("%c ", arr[i][j]);
}
printf("\n");
}
}
void SetMain(char arr[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (arr[x][y] = '0')
{
arr[x][y] = '1';
count--;
}
}
}
//static 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';
//}
static int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
int i = 0;
int count = 0;
for (i = x - 1; i <= x + 1; i++)
{
int j = 0;
for (j = y - 1; j <= y + 1; j++)
{
count += (mine[i][j] - '0');
}
}
return count;
}
void FindMain(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 - EASY_COUNT)
{
printf("请输入要排查雷的坐标:");
scanf("%d %d", &x, &y);
//判断坐标的有效性
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (show[x][y] == '*')
{
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("该坐标已被排查,请重新输入\n");
}
}
else
{
printf("坐标非法,请重新输入:\n");
}
}
if (win == row * col - EASY_COUNT)
{
printf("恭喜你,排雷成功\n");
DisplayBoard(mine, ROW, COL);
}
}
4、扫雷游戏的扩展
4.1如果能力足够可以进行更深层次的改变。
4.1.1.首先可以在扫雷难度上进行修改,可以增大棋盘的格子数,增加雷的数量,以此增大玩家的游戏难度。
4.1.2.然后可以对扫雷过程进行时间的控制,可以设置个进行时间计算的功能,记录自己每次完成扫雷游戏的时间。
5.谢谢您的观看,希望此篇文章对你有帮助。如有不足,欢迎评论区留言,我将加以改正,听取各位宝贵的意见。谢谢大家。