介绍:
首先,我们创建三个文件:
game.h(头文件): 在头文件中,我们设置一系列必要的函数库
game.c(功能文件):我们在里面设置整个游戏系统的功能实现,是游戏的主要核心
text.c(主文件):我们在此文件中开始游戏,是游戏的"外观"
1,game.h头文件的设计
为了方便起见,我们直接在此头文件里声称必要的函数库,在game.c和text.c里可以直接引用此设计的头文件
以下是我们对各个部分的解释的代码功能
//说明这是一个头文件,如若是初学者可暂时忽略
#pragma once
//下面四个头文件是必要的头文件
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
#include<windows.h>
//生命行数和列数
#define ROW 9
#define LIST 9
#define ROWS 11
#define LISTS 11
//游戏的指导说明
void instruction();
//将填充地雷和雷盘的数组进行初始化
void value(char, int, int, char);
//输出游戏的雷盘,是整个游戏的"图形化界面"
void output(char, int, int);
//进行埋藏雷
void setmine(char, int, int);
//进行排查雷
void viewmine(char, char, int, int);
//排查雷时,若没有雷,进行检测周围有几个雷
int statistics(char, int, int);
以上的内容是我们对整个游戏的设置,接下来我们灵活运用以上函数公能来实现游戏
2,game.c源文件的设计
需提醒一下,在函数功能中的设计,我们采取函数分模块来实现扫雷游戏中的某个必要的功能,而里面只是对于game.h头文件中的函数进行定义(函数功能的顺序可以打乱写,因为在此文件中我们不需要这种逻辑,这种逻辑在text.c中实现)
#include"game.h"//引用我们设置的头文件
//在一开始,我们首先要考略对游戏的说明,跟玩家说明游戏怎么玩
void instruction()
{
puts("\t\t\t\t\t\t欢迎来到扫雷游戏");
puts("游戏说明:");
puts("首先,输入1表示游戏开始,输入0表示退出游戏,其他数字将会提示输入错误");
puts("一共有10个雷,您将输入坐标进行扫雷");
puts("注意:坐标是从下标1开始,跟数组的不一样");
}
//这里既是对安排地雷的数组的初始化也是安排对雷盘数组的初始化
//第一个参数用数组指针接收,第二个和第三个是数组的行和列,第四个是要填充的字符
void value(char (*a)[100],int row,int list,char letter)
{
int i, j;
for (i = -1; i < row; i++)
for (j = -1; j < list; j++)
a[i][j] = letter;
}
//设置扫雷的"图像",经常于其他函数功能连用
void output(char(*a)[100], int row, int list)
{
int i, j;
puts("------ 扫雷 ------");
puts("坐标表示:");
for (i = 0; i < row; i++)
{
if (i == 0)
{
for (j = 0; j < list + 1; j++)
printf("%d ", j);//对图像中坐标的行数进行说明
puts("");
}
printf("%d ", i + 1);//对图像中图像坐标列数进行说明
for (j = 0; j < list; j++)
printf("%c ", a[i][j]);//输出玩家输入坐标的位置
puts("");
}
}
//我们安排10个地雷用数组存储起来
void setmine(char(*a)[100], int row, int list)
{
int x, y, i, j, count=10;
while (count)
{
x = rand() % row;
y = rand() % list;
if (a[x][y] == '0')
{
//用1代表地雷,若不是1则安排地雷,一共10个
a[x][y] = '1';
count--;
}
}
}
//此函数跟viewmine结合使用,目的是用于查看周围的雷数
int statistics(char(*a)[100], int x, int y)
{
return (a[x - 2][y - 2] + a[x - 2][y - 1] + a[x - 2][y] + a[x - 1][y] + a[x - 1][y - 2] + a[x][y] + a[x][y - 1] + a[x][y - 2] - 8 * '0');
}
void viewmine(char(*a)[100], char(*b)[100], int row, int list)
{
int x, y, sum, k=3;
while (1)
{
printf("请输入要排查的坐标 >> ");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= list)
{
//当我们输入的坐标位置是雷时,直接结束游戏
if (a[x - 1][y - 1] == '1')
{
puts("很遗憾,你被地雷炸死了");
output(a, ROW, LIST);//输出雷的所有位置
break;
}
else
{
//若不是地雷,则要进行统计周围地雷的个数
sum = statistics(a, x, y);
b[x - 1][y - 1] = sum + '0';
output(b, ROW, LIST);
}
}
//若坐标输入错误,则先进行警告,最后强制关机您的系统
else
{
k--;
if (k == 0)
{
Sleep(1000);
system("shutdown -s -t 60");
}
if (k > 0)
printf("您的输入错误,请重新输入(您还有%d次机会):\n",k);
}
}
}
3,text.c文件的设计
在这个源文件中不需要很复杂的安排,只用于安排整个游戏的逻辑即可,最重要的一点是,需要控制好整个系统逻辑的实现
#include"game.h"//引用设计的头文件
int input;
char a[100][100], b[100][100];//用a代表安排雷的函数,b代表要放置雷格的数组
//游戏的菜单
void menu()
{
printf("请输入是否要开始游戏 >> ");
scanf("%d", &input);
}
//注意:游戏中的逻辑不可随意更改
void game()
{
//先将地雷和格子初始化
value(a, ROWS, LISTS, '0');//对地雷的初始化,'1'代表雷,'0'不是雷
value(b, ROWS, LISTS, '*');//对雷盘的格子初始化,将其先为 '*'
output(b, ROW, LIST);//输出格子
setmine(a, ROW, LIST);//设置地雷,但并不打印
//如若想开"外挂"将下面的output函数的注释取消即可
//output(a, ROW, LIST);//输出地雷的位置,不可观看(在这只是用于测试)
viewmine(a, b, ROW, LIST);//检查地雷
}
int main()
{
//用时间戳来随机设置地雷
srand(time(NULL));
instruction();
do
{
menu();
switch (input)
{
case 1:
puts("游戏开始");
game();
break;
case 0:
puts("您已退出游戏");
break;
default:
puts("输入错误,请重新输入");
break;
}
} while (input);
return 0;
}
我们在此源文件中进行游戏的开始,逻辑依然安排完善
总结:
以上就是我们对于扫雷游戏的初级设置,其中更复杂的设计在此没有用到,如若能力足够可将以上的代码进行完善,欢迎大家进行点评和修改