目录
推荐阅读顺序(不建议跳过)
扫雷小游戏的游戏规则——> 程序实现的步骤 ——> test.c部分 ——> 在test.c中找到main()函数 ——> 从main函数的第一步开始看 ——> 遇到自定义函数到game.h源文件中找到相应函数的详情。
辅助阅读:
game.h文件中 —— 函数的声明(引用头文件)
game.c文件中 —— 函数的详情(怎么用代码实现相应步骤的)
test.c文件中 —— 整体的大致思路
用不同文件分装代码是为了:能够让自己的代码更有条理,思路更加的清晰,别人也更容易看懂
如果觉得翻来翻去太过于麻烦:请打开自己现在的编译器 —— 把代码先拷贝一份(按照不同的文件进行分装,也可以放在同一个文件中(test.c)) —— 遇到自定义函数时(把鼠标放在函数名上面、右击、转到定义)(这样编译器可以直接转到game.c文件中的函数详情)
扫雷小游戏的游戏规则
我所实现的扫雷小游戏是比较简单的版本(利用基础的C语言来实现的),其中会涉及数组,循环语句,选择语句,函数的基础知识,不会太难,目的就是为了让每个看这个文章的人都能理解扫雷小游戏实现的计算机思想是什么样的:
游戏规则:
界面上会出现一个都是字符 * 的正方形界面 —— 输入坐标 —— 如果输入的坐标放的是雷就是被炸死(如果放的不是雷,就会显示坐标周围有几个雷) —— 如果71个不是雷的坐标被全部排完就赢了(否则就会被炸死)
小游戏界面:
程序实现的步骤:
1、在屏幕上打印菜单(提示你要选择的内容)
2、定义两个数组,初始化数组( 一个数组替换成‘ * ’,另一个数组替换成‘ 0 ’)
解释:为什么要定义两个数组,并且数组是11*11二维数组的
第一个数组中放 0(坐标放的不是炸弹) 和 1(坐标放的是炸弹),第二个数组中放 ‘ * ’和坐标周围炸弹的个数(炸弹的个数是利用第一个数组中坐标周围数字相加所得)
定义两个数组是能够对数字 1 做出区分:如果使用一个数组,就无法判断 1 表示的是周围雷的个数,还是1本身就是雷
数组是11*11二维数组是为了不让数组越界:这个扫雷小游戏是简单版的(9*9),但是为了计算周围雷的个数要把坐标周围的数字相加,如果选择的坐标是(1.1),计算坐标周雷的个数,就会出现数组越界的情况。所以我定义了比9*9大一圈的数组11*11的(只在中间9*9的数组上创建 雷(1))。
3、把扫雷小游戏的棋盘打印出来。
4、系统随机放置10个炸弹,在初始化全是0的数组中放入10个 1 (1 就表示炸弹)
5、玩家排雷
6、判断输入坐标是否是炸弹(如果是被炸死,如果不是就在全放‘ * ’的数组中显示周围有几个雷)。判断周围雷的个数,用数组初始化全是0的数组,周围的数字相加就得到了,周围雷的个数。
7、然后重复上述的过程,直到游戏结束。
8、可以多次玩这个游戏。
game.h(头文件)
头文件是用来声明函数的,函数放在主函数main的后面就要先声明函数,然后才能使用函数。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define Hangs 11 //define定义的标识符常量
#define Lies 11
#define Hang Hangs - 2
#define Lie Lies - 2
#define easy_count 10
#include<stdlib.h>
#include<time.h>
//初始化数组
void init_board(char board[Hangs][Lies], int hangs, int lies, char set);
//打印棋盘
void display_board(char board[Hangs][Lies], int hang, int lie);
//布置雷
void set_hide(char board[Hangs][Lies], int hang, int lie);
//找到坐标周围有几个雷
void find_hide(char hide[Hangs][Lies], char show[Hangs][Lies], int hang, int lie);
test.c(源文件)
整体的大致思路 —— game()函数中的函数放在了game.c文件中
菜单函数
—— 打印简易菜单供你选择:
void menu()
{
printf("###############################\n");
printf("######### 1、玩游戏 #########\n");
printf("######### 0、退出游戏 #########\n");
printf("###############################\n");
}
游戏实现函数
—— 实现扫雷的主要功能
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void game()
{
//定义数组
//Hangs —— 请翻到头文件 —— 表示数字11
//同理,Lies —— 11,Hang —— 9, Lie —— 9
char hide[Hangs][Lies] = { 0 }; //存放雷的信息
char show[Hangs][Lies] = { 0 }; //排查雷的信息
//初始化数组
//一个数组放0(表示无雷的坐标)和1(表示雷的坐标) —— 这个数组不显示不打印
init_board(hide, Hangs, Lies, '0');
//下面这个数组放数字 —— 这个数字表示坐标周围有几个雷 —— 显示打印这个数字
init_board(show, Hangs, Lies, '*');
//打印棋盘 —— 调试的时候可以用到
//display_board(hide, Hang, Lie);
//display_board(show, Hang, Lie);
//电脑随机布置雷
set_hide(hide, Hang, Lie);
//display_board(hide, Hang, Lie);
display_board(show, Hang, Lie);
//找雷
find_hide(hide, show, Hang, Lie);
}
主函数(main)
—— 程序的入口,实现菜单选择界面的循环
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
//生成随机数要用到rand()
//用rand()要调用srand()
//srand()其中()中要用到不断变化的量 —— 用时间戳来做不断变化的量 —— 时间戳可以用time()函数来展现
//(unsigned int) —— 是强制类型转换
//srand()函数不用引用多次,所以放在循环的前面就可以了
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input); //输入1开始游戏,输入0退出游戏
return 0;
}
game.c(源文件)
实现前面过程中用的函数
初始化数组函数
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//初始化数组
void init_board(char board[Hangs][Lies], int hangs, int lies, char set)
//传入四个变量,数组,行数,列数,和要初始化成的字母
{
int i = 0;
for (i = 0; i < hangs; i++)
{
int j = 0;
for (j = 0; j < lies; j++)
{
board[i][j] = set;
}
}
}
打印棋盘
—— 把棋盘中现在的状态打印出来
//打印数组
void display_board(char board[Hangs][Lies], int hang, int lie)
{
int i = 0;
printf("--------------------\n");
for (i = 0; i <= hang; i++) //打印周围的第一行0 1 2 3 4 5 6 7 8 9
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= hang; i++)
{
printf("%d ", i); //打印第一列 1 2 3 4 5 6 7 8 9
int j = 0;
for (j = 1; j <= lie; j++)
{
printf("%c ", board[i][j]); //打印中间9*9数组中的内容
}
printf("\n");
}
printf("--------------------\n");
}
电脑随机布置雷
—— 利用生成随机数来实现
void set_hide(char board[Hangs][Lies], int hang, int lie)
{
int x = 0;
int y = 0;
int count = 0;
while (count < easy_count)
{
x = rand() % hang + 1; //生成1到9的随机下标
y = rand() % lie + 1;
if (board[x][y] != '1')
{
board[x][y] = '1'; //把生成的随机坐标放上雷(1)
count++;
}
}
}
找雷
void find_hide(char hide[Hangs][Lies], char show[Hangs][Lies], int hang, int lie)
{
int x = 0;
int y = 0;
int count = 0;
while (count < hang * lie - easy_count) //如果循环了71次就跳出循环(赢了)
//easy_count —— 请翻到头文件 —— 表示数字10
{
printf("请输入:");
scanf("%d %d", &x, &y);
if (x>0 && x<=hang && y>0 && y<=lie)
{
if (hide[x][y] != '1') //计算坐标周围雷的个数
{
show[x][y] = hide[x][y - 1] +
hide[x + 1][y - 1] +
hide[x + 1][y] +
hide[x + 1][y + 1] +
hide[x][y + 1] +
hide[x - 1][y + 1] +
hide[x - 1][y] +
hide[x - 1][y - 1] - 8 * '0' + '0'; //因为是字符1,所以要减去字符0
display_board(show, Hang, Lie); //得到数字1
count++;
}
else
{
printf("很遗憾,你输了:");
display_board(hide, Hang, Lie);
break;
}
}
else
{
printf("输入错误请重新输入:");
}
}
if (count == hang * lie - easy_count)
{
printf("恭喜你,排完了所有雷");
}
}