非常欢迎对扫雷感兴趣的小伙伴进来学习。
首先我们应该了解一下这些。
二维数组:
我们拿整形数组在举例子:int arr[x][y];
x代表行,y代表列。我们可以将扫雷的棋盘全部储存进二维数组之中,只需要打印数组就可以得到所需要的棋盘。
多个文件操作:
在平日编程时我们可以使用多个文件来完成操作。我门可以把负责不同任务分到多个文件中,这样的好处是可以对程序很好的分类使其逻辑清晰,在我们接下来要完成的扫雷游戏中就需要用到三个文件扫雷.c,game.c,game.h。其中game.h是头文件只要用#include“game.h”声明一下就可以在别的文件中使用其中包含的函数。
了解游戏规则
如图是一个33的扫雷棋盘
如果蓝点代表炸弹那么最中间的格子应该显示自己附近有几个炸弹如图
那么我们如果想要知道某个格子内的数字大小只需要排查其周围有几个地雷,但是我们设置的数组是33的如果我们要知道在边缘的格子内的数字时我们就会排查到黄色的区域如图
这样会导致数组越界那么我们有没有什么好的办法来解决呢?当然有!
我们只需要创建一个55的数组就可以了,这样我们就可以排查黄色区域,只要我们打印棋盘时只打印粉色部分就可以做的和33一个效果。
我们可以根据我们的风格在扫雷.c中用printf打印出来一个游戏菜单。我这里是写了个一个函数来打印菜单。
void meun()
{
if (score <= a)
score = a;
else
a = score;
printf("故事背景:一天邪恶的门酱操控可莉到处扔炸弹,导致提瓦特大陆逐渐崩坏,旅行者大人请您带给我们希望吧!\n");
printf(" *************原神扫雷*************\n");
printf(" ****** 输入1 play ******\n");
printf(" ****** 输入0 exit ******\n");
printf(" **********************************\n");
printf(" 历史最高得分:%d\n", score);
a = score;
}
其中score是积分咱们先不讨论在尾声中我们在解释。
正如上所说输入1开始游戏输入0退出游戏如果摁错了别的键那么应该重新返回该界面那么我们就可以开始写我们的主程序
int main()
{
int answer = 0;
srand((unsigned int)time(NULL));//设置随机起点
//打印菜单
do
{
meun();
answer = 0;
scanf("%d", &answer);
switch(answer)
{
case 1:
system("cls");//可以清除菜单直接进入游戏界面
game(); break;
case 0:
system("cls");
printf("退出游戏!\n"); break;
default :
system("cls");
printf("输入错误,请再试一遍!\n");
Sleep(5000);//使程序停顿五秒
system("cls"); break;
}
} while (answer);
return 0;
}其中Sleep和清屏的头文件时windows.h,设置随机起点的函数的头文件时stdlib.h和time.h
game使我们自己设置的函数那么接下来我们要设计game函数来实现扫雷游戏。
具体我们要将其分成如下五个部分
void game()
{
printf("原神扫雷——启动!\n注意出现数字代表这个位置周围有几个炸弹“9”的意思是炸弹\n请输入坐标寻找地雷\n");
//设置行列个数 其中rows,columns,row,column是我用define定义的定量分别是11,11,9,9
char mineboard[rows][columns];//有地雷的棋盘
char showboard[rows][columns];//展示的棋盘
//填充行列
fillboard(mineboard, rows, columns, '0');//用‘0’来填充
fillboard(showboard, rows, columns, '*');//用‘*’来填充
//可莉扔炸弹
kelidemine(mineboard, row, column);//设置地雷位置
//打印行列
printfboard(showboard, row, column);//打印出来展示棋盘(不打印最外一圈原因在前言中展示过了)让玩家来寻找炸弹
//寻找炸弹!
findmine(mineboard, showboard,row,column);//开始游戏
}我们将每一大块都设计成函数,我们讲这些函数全部塞进game.c文件中方便整理
首先显示填充数组
void fillboard(char arr[rows][columns], int Rows, int Columns, char set)//填充
{
int i = 0;
for (i = 0; i < Rows; i++)//行
{
int j = 0;
for (j = 0; j < Columns; j++)//列
{
arr[i][j] = set;
}
}
}
接下来设置炸弹位置
void kelidemine(char arr[rows][columns],int x,int y)
{
int ci = 10;//扔十个炸弹这里可以自己设置想要多少个炸弹
while (ci)
{
int ROW = rand() % x + 1;//rand是可以生成随机数的函数他的范围是0-rand_max这个范围又编译器来定但是都大于等于32767小于等于2147483647我们想把随机数的范围控制在1-9则只需要%9再+1即可
int COL = rand() % y + 1;
if (arr[ROW][COL] == '0')
{
arr[ROW][COL] = '9';
ci--;
}
}
}
接着设计打印棋盘的函数
void printfboard(char arr[rows][columns], int Rows, int Columns)
{
int i = 0;
for (i = 0; i <= Rows; i++)//打印列数
{
printf("%d ", i);
}
printf("\n");
for (i = 0; i < Rows; i++)
{
printf("%d ", i+1);打印行数
int j = 0;
for (j = 0; j < Columns; j++)
{
printf("%c ", arr[i][j]);
}
printf("\n");
}
printf("勇敢的旅行者哟,前进吧!为了提瓦特!!!\n");
}
最后我们要开始设计如何进行游戏
void getsurroundmine(char arr[rows][columns], char arr2[rows][columns], int x, int y)
{//计算附近有8个格子中有多少个炸弹‘0’的值为48‘1’为49...
arr2[x-1][y-1] = (arr[x - 1][y - 1] + arr[x][y - 1] + arr[x + 1][y - 1] + arr[x - 1][y] + arr[x + 1][y] + arr[x - 1][y + 1] + arr[x][y + 1] + arr[x + 1][y + 1] - 8 * '0') / 9 + '0';
}
void findmine(char arr[rows][columns], char arr2[rows][columns], int r, int c)
{
int paichacishu = r * c - 10;//总格子数-地雷数
score = 0;//积分
while (paichacishu)
{
int x = 0;
int y = 0;
scanf("%d%d", &x, &y);//输入坐标
system("cls");
int n = 0;
if (x > 9 || x == 0 || y == 0 || y > 9)//如果超出范围
{
printf("输入错误!\n");
Sleep(2000);
system("cls");
printfboard(arr2, row, column);//重新打印棋盘
printf("score = %d\n", score);
}
else
{
if (arr[x][y] == '0')
{
getsurroundmine(arr, arr2, x, y);
printfboard(arr2, row, column);//重新打印改变之后的棋盘
paichacishu--;//当其为0时游戏结束
score++;
printf("score = %d\n", score);//可以自己设置奖励
if (score == 10)
printf("获得奖励:??\n");
if (score == 20)
printf("获得奖励:??\n");
if (score == 30)
printf("获得奖励:??\n");
if (score == 40)
printf("获得奖励:??\n");
if (score == 50)
printf("获得奖励:??\n");
if (score == 60)
printf("获得奖励:??\n");
if (score == 70)
printf("获得奖励:带着之前的奖励全家发配到提瓦特大陆\n");
}
if (arr[x][y] == '9')//如果输入的位置有炸弹
{
printf("是炸弹你被炸死了!\n");
printfboard(arr, row, column);//打印出上帝视角让游戏者死而瞑目让他知道自己砸死的
Sleep(10000);
system("cls");
break;
}
}
}if (paichacishu == 0)//成功通关游戏
{
printf("你拯救了逐渐走向崩坏的提瓦特大陆! 获得成就:原神尊者 获得奖励:报送原神大学\n");
Sleep(10000);
system("cls");
}
}
为了方便使用这些函数我们要创一个头文件叫game.h
#pragma once//声明自己所需要使用的函数和定义的常量
#define row 9
#define column 9
#define rows row+2
#define columns column+2
void fillboard(char arr[rows][columns], int Rows, int Columns, char set);
void printfboard(char arr[rows][columns], int y, int z);
void kelidemine(char arr[rows][columns], int x, int y);
void findmine(char arr[rows][columns], char arr2[rows][columns], int r, int c);
void getsurroundmine(char arr[rows][columns], char arr2[rows][columns], int x, int y);
要需要用里头的函数时只需要声明一下这个头文件便可以使用格式:#include“头文件名字”
代码:
扫雷.c
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include"game.h"
#include
#include
extern int score;
int a = 0;
void meun()
{
if (score <= a)
score = a;
else
a = score;
printf("故事背景:一天门酱操控可莉开心的到处扔炸弹,导致提瓦特大陆逐渐崩坏,旅行者大人请您带给我们希望吧!\n");
printf(" *************原神扫雷*************\n");
printf(" ****** 输入1 play ******\n");
printf(" ****** 输入0 exit ******\n");
printf(" **********************************\n");
printf(" 哲学金句:我是神里绫华的狗!——门酱\n");
printf(" 历史最高得分:%d\n", score);
a = score;
}
void game()
{
printf("原神扫雷——启动!\n注意出现数字代表这个位置周围有几个炸弹“9”的意思是炸弹\n请输入坐标寻找地雷\n");
//设置行列个数
char mineboard[rows][columns];
char showboard[rows][columns];
//填充行列
fillboard(mineboard, rows, columns, '0');
fillboard(showboard, rows, columns, '*');
//可莉扔炸弹
kelidemine(mineboard, row, column);
//打印行列
printfboard(showboard, row, column);
//寻找炸弹!
findmine(mineboard, showboard,row,column);
}
int main()
{
int answer = 0;
srand((unsigned int)time(NULL));
//打印菜单
do
{
meun();
answer = 0;
scanf("%d", &answer);
switch(answer)
{
case 1:
system("cls");
game(); break;
case 0:
system("cls");
printf("已退出游戏!"); break;
default :
system("cls");
printf("输错!");
Sleep(5000);
system("cls"); break;
}
} while (answer);
return 0;
}
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
#include
#include
#include
#include
int score = 0;
void fillboard(char arr[rows][columns], int Rows, int Columns, char set)//填充
{
int i = 0;
for (i = 0; i < Rows; i++)//行
{
int j = 0;
for (j = 0; j < Columns; j++)//列
{
arr[i][j] = set;
}
}
}
void kelidemine(char arr[rows][columns],int x,int y)
{
int ci = 10;//扔十个炸弹
while (ci)
{
int ROW = rand() % x + 1;
int COL = rand() % y + 1;
if (arr[ROW][COL] == '0')
{
arr[ROW][COL] = '9';
ci--;
}
}
}
void printfboard(char arr[rows][columns], int Rows, int Columns)
{
int i = 0;
for (i = 0; i <= Rows; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 0; i < Rows; i++)
{
printf("%d ", i+1);
int j = 0;
for (j = 0; j < Columns; j++)
{
printf("%c ", arr[i][j]);
}
printf("\n");
}
printf("勇敢的旅行者哟,前进吧!为了提瓦特!!!\n");
}
void getsurroundmine(char arr[rows][columns], char arr2[rows][columns], int x, int y)
{
arr2[x-1][y-1] = (arr[x - 1][y - 1] + arr[x][y - 1] + arr[x + 1][y - 1] + arr[x - 1][y] + arr[x + 1][y] + arr[x - 1][y + 1] + arr[x][y + 1] + arr[x + 1][y + 1] - 8 * '0') / 9 + '0';
}
void findmine(char arr[rows][columns], char arr2[rows][columns], int r, int c)
{
int paichacishu = r * c - 10;
score = 0;
while (paichacishu)
{
int x = 0;
int y = 0;
scanf("%d%d", &x, &y);
system("cls");
int n = 0;
if (x > 9 || x == 0 || y == 0 || y > 9)
{
printf("输错\n");
Sleep(2000);
system("cls");
printfboard(arr2, row, column);
printf("score = %d\n", score);
}
else
{
if (arr[x][y] == '0')
{
getsurroundmine(arr, arr2, x, y);
printfboard(arr2, row, column);
paichacishu--;
score++;
printf("score = %d\n", score);
if (score == 10)
printf("获得奖励:\n");
if (score == 20)
printf("获得奖励:\n");
if (score == 30)
printf("获得奖励:\n");
if (score == 40)
printf("获得奖励:\n");
if (score == 50)
printf("获得奖励:\n");
if (score == 60)
printf("获得奖励:\n");
if (score == 70)
printf("获得奖励:带着之前的奖励全家发配到提瓦特大陆\n");
}
if (arr[x][y] == '9')
{
printf("??"\n");
printfboard(arr, row, column);
Sleep(10000);
system("cls");
break;
}
}
}if (paichacishu == 0)
{
printf("你拯救了逐渐走向崩坏的提瓦特大陆! 获得成就:原神尊者 获得奖励:报送原神大学\n")
Sleep(10000);
system("cls");
}
}
game.h
#pragma once
#define row 9
#define column 9
#define rows row+2
#define columns column+2
void fillboard(char arr[rows][columns], int Rows, int Columns, char set);
void printfboard(char arr[rows][columns], int y, int z);
void kelidemine(char arr[rows][columns], int x, int y);
void findmine(char arr[rows][columns], char arr2[rows][columns], int r, int c);
void getsurroundmine(char arr[rows][columns], char arr2[rows][columns], int x, int y);
我要说的话
仔细阅读完完整代码之后小伙伴们肯定就知道了我是如何记录最高得分的了,其中不少地方可以加入自己的想想比如积分奖励之类的,你还可以开发一些新功能比如标记地雷(我懒得弄了,要是不会可以私信我),还可以添加个个倒计时系统为游戏增加时间限制。
希望大家喜欢我制作的博客看完的小伙伴赏个三连再走也不迟啊!
还有就是我不是原批!我不是原批!我不是原批!