基本思路:
首先 如果按照上次我们写三子棋设置game.h game.c work.c 这一次扫雷游戏的编写因为 要用到全局变量 而 为了保证一局游戏结束后 我们再次选择玩游戏这些变量能够被初始化 所以这次我们就只有 game.h 和 game.c了
来看我们的开始操作部分:
开始部分:
我们首先要给玩家在界面上显示一个 选择界面 所以要编写一个menu函数
menu() { printf("**********************\n"); printf("**********1.play******\n"); printf("**********0.exit******\n"); printf("*********请 选 择*****\n"); printf("**********************\n"); }
然后开始:
int main() { srand((unsigned int)time(NULL));//因为后面我们布置雷采用的是一种随机的方式 所以这里要先用 int input; //一下srand函数 因为我们的主函数是一定会执行的 所以我们把 do //这个放在了主函数里面 { memset(arr, 0, sizeof arr); int ret = 0; int A; int B = 1;//这一部分的变量 都是我们后面要用的 放在这里是为了我们完成一次游戏后还能把这些 menu(); //变量变成开始的样子 printf("---------------------------\n"); scanf("%d", &input); switch (input) { case 1: play(); break; case 0: printf("您已经退出游戏\n"); break; default: printf(" 对不起你选择的选项不存在 请重新输入!\n"); } } while (input); return 0; }
因为 1 为真 这里我们选择了玩游戏(1)时 玩完游戏 play()返回来执行break 这时break 跳出的是 switch选择语句 这样程序就会来到do-while的判断部分 我们选的是 1 就会循环 让我们再次下选择 选择的 0 的话 到了do-while的判断部分就会跳出来 结束游戏啦
开始游玩:
我们来理一下思路:
因为 我们后面编写的 插旗(表示你判断这个位置是雷)函数 和 撤旗函数 涉及到了字符的变化
如果把所有的棋盘信息全部塞到一个二维数组里面 这样后面编写起来肯定是更麻烦的
所以 我们就需要增加一个来分担我们的压力:
还有一个要说的点因为我们扫雷嘛 肯定会去排查你选的坐标周围一圈是否有雷 如果我们只是定义的9×9的数组的话 那我们在排查我们的边界时 寻找周围有没有雷这样不就越界了嘛
所以我们就要在行和列上各多加两行 这个时候就需要定义11×11的数组 我们这里用到的ROWS COWS都是11
#define ROW 9 #define COW 9//因为我们后面还有用到行和列的数字所以这个也要define一下 #define ROWS ROW+2//改变数组大小的时候就只需要改变一下ROW COW就可以了 #define COWS COW+2
棋盘所需数组的定义:
//初始化数组 char mine[ROWS][COWS] = { 0 };//这个数组用于存放我们布置雷的信息 char show[ROWS][COWS] = { 0 };//这个数组用于给我们玩家展示玩家选择一些操作后棋盘的变化
之所以采用字符型数组 因为我们后面会用到多种符号 如果用数字来区别的话 会不方便要不好区别出来所以我们就用字符型数组 遇到要用数字的时候也可以用字符数字来表示 只不过要了解字符数字 和 整型数字之间怎样转换 后面我们会讲到的 嘻嘻
数组定义好了 我们肯定就要开始制作棋盘了 在这里首先要说一下这个:
- mine数组里面 我们用字符 '0' 来表示 不是雷 字符 '1'表示 是雷(当然也是可以用其他符号的我们这里说一下这种怎么做)
- show数组里面 我们首先展示给玩家是一个未知的界面 我们用字符 '*'来实现
这就是我们一开始要展示给玩家的界面
初始化棋盘:
在我们初始化棋盘前 我们还是要在我们创建的game.h文件里面声明一下这个函数
void make_borad(char arr[ROWS][COWS], int row, int cow, char ret);//初始化棋盘
void make_borad(char arr[ROWS][COWS], int row, int cow, char ret)//初始化棋盘 { //我们传进去的是一个11×11的数组 肯定也是用11×11的数组去接收 int i; int j; for (i = 0; i < row; i++) { for (j = 0; j < cow; j++) { arr[i][j] = ret; } } } //初始化棋盘 make_borad(show, ROWS, COWS, '*'); make_borad(mine, ROWS, COWS, '0');
这里之所以要用一个ret这个形参 是因为我们本身这两个数组初始化后 里面的内容就是不同的 show函数里面是 '*' mine函数里面是 '0' 所以这个时候我们就只需用不同形参 ret 传进去 这样就可以实现一个函数实现两个数组的初始化
制作棋盘:
我们还是要先在我们创建的game.h里面声明这个函数
void dis_playborad(char mine[ROWS][COWS], int row, int cow);//制作并打印棋盘
然后在我们的game.c里面引用
dis_playborad(show, ROW, COW);//ROW和COW等于9
大家注意到了 那个棋盘的上面还有横坐标和竖坐标这样写是为了方便玩家找坐标
void dis_playborad(char show[ROWS][COWS], int row, int cow)//制作并打印棋盘 { int i; int j; printf("-------------------------\n"); for (i = 0; i <= row; i++) { printf("%d ", i);//打印横坐标 }printf("\n"); //打印完记得换行 for (i = 1; i <= row; i++) { printf("%d ", i);每一行开始打印这一行的竖坐标 for (j = 1; j <= row; j++) { printf("%c ", show[i][j]);//打印%c后面要加一个 空格 不然打印出来会很紧凑 } printf("\n");//一行打印完记得换行 } printf("-------------------------\n"); }
这样我们给玩家展示的界面就打印完了 然后就是给我们的 mine数组 里面布置雷
布置雷:
首先在我们的game.h里面声明
void put_mine(char mine[ROWS][COWS], int row, int cow);//布置雷
然后引用它:
put_mine(mine, ROW, COW);//布置雷
大家来看:
void put_mine(char mine[ROWS][COWS], int row, int cow)//布置雷 { ret = 0; for (int i = 0; i < MINE; ) //这里的MINE是雷的意思 我们在game.h里面给他定义的是10 { //#define MINE 10 int x = rand() % row + 1; int y = rand() % cow + 1; if (mine[x][y] == '0') { mine[x][y] = '1'; i++; } } }
我们设置一个循环 每一次创建的随机值 只要布置成功 i 就加一 直到10个雷全部布置完
这里随机数的设定我给大家说一下是怎么回事:
rand函数 是用来生成一个随机数 头文件是<stdio.h> 返回类型是整型
返回 0~Rand_Max(32767)中的一个数
srand函数相当于是给rand函数生成一个起始点 就是让rang函数不再是从0开始到Rand_max 如果你给rand函数设置的起始点是固定的那么好几次生成的随机数
srand(1); int x = rand(); for (int i = 0; i < 5; i++)//这里五次输出 都是 41 { //如果说你在使用rand函数之前没有使用srand函数 那么结果和srand(1) printf("%d\n", x); //是一样的 }
所以我们要给srand函数里传入 一个变化的值 这个时候就要用到 time函数
time函数:
time函数这样定义的 这个函数的返回的类型是 time_t (就好比是int char)这个类型是一个无符号整型 但是不同平台这个类型的定义是不同的 我用的是 vs 而在vs里面是一个有符号的长整型
所以这里用的时候记得 给time函数进行强制转换 (如果你用的也是vs的话)
因为srand函数要求的是 我们给它传入的数要是一个无符号的数
其中time_t它返回从1970年1月1日零时零分零秒到目前为止所经过的时间
最后有一点 在我们使用这个函数之前 我们还要引用
srand函数:
这个函数他是这样的 void srand(unsigned seed)
他要求传入一个无符号的数
因为我们要让这个随机数是变化的 而rand函数 srand函数 time函数通常结合在一起使用
最终拿出来就是这样的 srand((unsign int)time(NULL) ) NULL的意思就是表示空的意思
你可以写 0
因为我们的主函数是一定会执行的所以我们就把 srand函数放到主函数里面去
对了 在使用它们之前出了 引头文件<time.h>还有一个<stdlib.h>哦!
这里的讲解我就照搬我上一篇文章说的了(转载 昶102的三子棋篇)
这样我们的雷就布置好了 嘻嘻 然后就要开始我们的重头戏 排查雷 了