目录
第二步:游戏功能的实现:MineSweeping()函数介绍和实现:
步骤:
第一步:主函数部分
1.创造一个主函数main:
#include<stdio.h>
int main()
{
return 0;
}
2.编写游戏菜单和判断用户的选择:
游戏菜单的实现(代码块):
void menu()
{
printf("****************************************\n");
printf("****************扫雷游戏****************\n");
printf("************* *************\n");
printf("*********** 1.Play ***********\n");
printf("*********** 0.Exit ***********\n");
printf("************* *************\n");
printf("****************扫雷游戏****************\n");
printf("****************************************\n");
}
放在主函数里面:
#include<stdio.h>
int main()
{
menu();
return 0;
}
运行结果为:
下一步为判断用户的选择的代码块:
int input = 0;//用来储存用户输入的选项数据,结合下方的scanf函数来观看
//在这里用do...while循环的好处就是do...while循环是先运行,再判断的
//因为这个游戏不需要登陆密码什么的,所以就可以先直接运行,再判断
//如果你想设置登录密码,这里建议使用先判断,再运行的语句,比如while循环或者别的循环语句
do
{
menu();
printf("请选择:");//提示用户选择游戏模式
scanf("%d", &input);//输入函数,使用户来输入选择模式,数据存储在上面定义的input里
switch (input)//根据用户输入的选项来决定游戏模式
{
case 1:
MineSweeping();//游戏的所有重要功能部分——下文有详细介绍和实现方法
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("警告:未知选项!\n");
break;
}
} while (input);
第二步:游戏功能的实现:MineSweeping()函数介绍和实现:
MineSweeping()函数的介绍:
首先来介绍MineSweeping()函数的作用:
game函数里包含了实现整个游戏功能的所有函数,同时它将会单独放置在另一个名为Game_Function.c文件里(该文件名由自己命名),这样如果以后你想要更新游戏功能,就会方便许多。
接下来我们来对MineSweeping()函数进行实现:
上文已经说明MineSweeping()函数里放置的是实现整个游戏功能的所有函数。
MineSweeping()函数的实现(附代码):
在这里我的实现思路时,创造两个区域,一个区域用来放雷,一个区域用来实施反应雷区,因为总不可能把埋雷的位置给用户观看吧。只有这样我们才能更好的操作游戏。
1.创建雷区和显示区:
void MineSweeping()
{
char minefield[ROWS][ACROSSS];//雷区
char Display_Space[ROWS][ACROSSS];//显示区
}
为了方便实现改变扫雷区域的大小和雷的数量我们用
define来定义几个常量:
#define ACROSSS 11
#define ACROSS 9
#define ROWS 11
#define ROW 9
#define MINE 10 //雷的数量
2.初始化区域:
当我们把区域创建后,就要先初始化好,所以我们要封装一个初始化函数,对两个区域都要初始化:
void MineSweeping()
{
char minefield[ROWS][ACROSSS];//雷区
char Display_Space[ROWS][ACROSSS];//显示区
Initialize(minefield, ROWS, ACROSSS, '0');//初始化雷区,1为雷,0为空
Initialize(Display_Space, ROWS, ACROSSS, '*');//初始化显示区
}
Initialize()为初始化区域的函数:
void Initialize(char area[ROWS][ACROSSS], int rows, int acrosss, char s)
{
int i = 0, j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < acrosss; j++)
{
area[i][j] = s;
}
}
}
2.布置雷:
当两个区域初始化好后,就要开始偷偷的布置雷了,此时我们就要封装一个布置雷的函数了
void MineSweeping()
{
char minefield[ROWS][ACROSSS];//雷区
char Display_Space[ROWS][ACROSSS];//显示区
Initialize(minefield, ROWS, ACROSSS, '0');//初始化雷区
Initialize(Display_Space, ROWS, ACROSSS, '*');//初始化显示区
Layout(minefield, ROW, ACROSS);//布置雷
}
Layout()为悄悄的布置雷的函数:
由于雷的位置是随机的,所以我们需要调用rand()库函数来生成随机数。
而使用rand()函数之前我们还需要调用srand():
srand((unsigned int)time(NULL));//生成游戏所需随机数的起点.
她的位置最好放在游戏的开始:
void Layout(char area[ROWS][ACROSSS], int row, int across)
{
int z = 0;
while (z < MINE)
{
int x = rand() % row + 1;
int y = rand() % across + 1;
if (area[x][y] == '0')
{
area[x][y] = '1';
z++;
}
}
}
3.打印显示区
当雷布置好就给玩家打印出区域:
void MineSweeping()
{
char minefield[ROWS][ACROSSS];//雷区
char Display_Space[ROWS][ACROSSS];//显示区
Initialize(minefield, ROWS, ACROSSS, '0');//初始化雷区
Initialize(Display_Space, ROWS, ACROSSS, '*');//初始化显示区
Layout(minefield, ROW, ACROSS);//布置雷
Show(Display_Space, ROW, ACROSS);//显示给玩家看
}
Show()为打印显示区域的函数:
void Show(char area[ROWS][ACROSSS], int row, int across)
{
int i = 0, j = 0;
for (i = 0; i <= row; i++)
{
for (j = 0; j <= across; j++)
{
if (i == 0)
{
printf("%d ", j);
}
else
{
if (j == 0)
{
printf("%d ", i);
}
else
{
printf("%c ", area[i][j]);
}
}
}
printf("\n");
}
}
4.扫雷功能:
并封装一个扫雷功能的函数,让玩家着手开始扫雷:
void MineSweeping()
{
char minefield[ROWS][ACROSSS];//雷区
char Display_Space[ROWS][ACROSSS];//显示区
Initialize(minefield, ROWS, ACROSSS, '0');//初始化雷区
Initialize(Display_Space, ROWS, ACROSSS, '*');//初始化显示区
Layout(minefield, ROW, ACROSS);//布置雷
Show(Display_Space, ROW, ACROSS);//显示给玩家看
Probe(minefield,Display_Space,ROW,ACROSS);//开始扫雷
}
Probe()为扫雷函数:
void Probe(char area[ROWS][ACROSSS], char area1[ROWS][ACROSSS], int row, int across)
{
int x = 0, y = 0;
int ret = 0;
while (ret < ROW * ACROSS - MINE)
{
printf("输入要扫描的坐标:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= across)
{
if (area[x][y] == '1')
{
printf("\n有雷,任务失败!\n");
break;
}
else
{
int count = Internal_detection(area, x, y);//下文有详细解释
area1[x][y] = count + '0';
Show(area1, ROW, ACROSS);//显示给玩家看
ret++;
}
}
else
{
printf("坐标所指为无效区域.\n");
}
if (ret == ROW * ACROSS - MINE)
{
printf("\n任务完成,大吉大利!\n\n");
break;
}
}
}
其中Internal_detection()函数是告诉我们这个地方周围有几颗雷的函数:
int Internal_detection(char area[ROWS][ACROSSS], int x, int y)
{
int i = 0, j = 0;
int sum = 0;
for (i = x - 1; i <= x + 1; i++)
{
for (j = y - 1; j <= y + 1; j++)
{
sum = sum + (area[i][j] - '0');
}
}
return sum;
}
以上就是扫雷游戏的基本实现思路了。
总结:
Game_Function.h 文件:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ACROSSS 11
#define ACROSS 9
#define ROWS 11
#define ROW 9
#define MINE 10
void menu();//菜单函数
void MineSweeping();//扫雷主函数
void Initialize(char Dispaly_Space[ROWS][ACROSSS], int row, int across, char s);//初始化函数
void Show(char area[ROWS][ACROSSS], int row, int across);//显示给玩家看的函数
void Probe(char area[ROWS][ACROSSS],char area1[ROWS][ACROSSS], int row, int across);//开始扫雷
void Layout(char area[ROWS][ACROSSS], int row, int across);//布置雷
Game_Function.c 文件:
#include"Game_Function.h"
void menu()
{
printf("****************************************\n");
printf("****************扫雷游戏****************\n");
printf("************* *************\n");
printf("*********** 1.Play ***********\n");
printf("*********** 0.Exit ***********\n");
printf("************* *************\n");
printf("****************扫雷游戏****************\n");
printf("****************************************\n");
}
void MineSweeping()
{
char minefield[ROWS][ACROSSS];//雷区
char Display_Space[ROWS][ACROSSS];//显示区
Initialize(minefield, ROWS, ACROSSS, '0');//初始化雷区
Initialize(Display_Space, ROWS, ACROSSS, '*');//初始化显示区
Layout(minefield, ROW, ACROSS);//布置雷
Show(Display_Space, ROW, ACROSS);//显示给玩家看
Probe(minefield,Display_Space,ROW,ACROSS);//开始扫雷
}
static int Internal_detection(char area[ROWS][ACROSSS], int x, int y)
{
int i = 0, j = 0;
int sum = 0;
for (i = x - 1; i <= x + 1; i++)
{
for (j = y - 1; j <= y + 1; j++)
{
sum = sum + (area[i][j] - '0');
}
}
return sum;
}
//开始扫雷
void Probe(char area[ROWS][ACROSSS], char area1[ROWS][ACROSSS], int row, int across)
{
int x = 0, y = 0;
int ret = 0;
while (ret < ROW * ACROSS - MINE)
{
printf("输入要扫描的坐标:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= across)
{
if (area[x][y] == '1')
{
printf("\n有雷,任务失败!\n");
break;
}
else
{
int count = Internal_detection(area, x, y);
area1[x][y] = count + '0';
Show(area1, ROW, ACROSS);//显示给玩家看
ret++;
}
}
else
{
printf("坐标所指为无效区域.\n");
}
if (ret == ROW * ACROSS - MINE)
{
printf("\n任务完成,大吉大利!\n\n");
break;
}
}
}
//布置雷
void Layout(char area[ROWS][ACROSSS], int row, int across)
{
int z = 0;
while (z < MINE)
{
int x = rand() % row + 1;
int y = rand() % across + 1;
if (area[x][y] == '0')
{
area[x][y] = '1';
z++;
}
}
}
//初始化区域
void Initialize(char area[ROWS][ACROSSS], int rows, int acrosss, char s)
{
int i = 0, j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < acrosss; j++)
{
area[i][j] = s;
}
}
}
//显示区域给玩家
void Show(char area[ROWS][ACROSSS], int row, int across)
{
int i = 0, j = 0;
for (i = 0; i <= row; i++)
{
for (j = 0; j <= across; j++)
{
if (i == 0)
{
printf("%d ", j);
}
else
{
if (j == 0)
{
printf("%d ", i);
}
else
{
printf("%c ", area[i][j]);
}
}
}
printf("\n");
}
}
主文件 test.c
#include"Game_Function.h"
int main()
{
srand((unsigned int)time(NULL));//生成游戏所需随机数的起点.
int input = 0;//储存选项
do
{
menu();//游戏菜单函数
printf("请选择:>");
scanf("%d", &input);//输入选项函数
switch (input)
{
case 1:
MineSweeping();//扫雷游戏核心函数
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("警告:未知选项!\n");
break;
}
} while (input);
return 0;
}