今天跟着老师完成了扫雷,是C语言学习以来第三个小游戏了。整个代码也算是把学过的知识进行了综合吧。这里也只是记录一下自己出现的问题。
1. 首先是关于三个分项目的创建
tset.c : 用于游戏逻辑的调试
game.c : 用于游戏函数的实现
game.h:用于头文件的包含,符号的定义,函数的声明
这一步的目的主要是让代码更加清晰有逻辑性,方便,更重要的是让代码具有可移植性。
#define EASY 10 // 简单模式10个雷
个游比如这一步是关于游戏雷的个数的定义,它在整戏代码中多次使用,而需要改变时,只需要在我的game.h文件中更改就可以,其他地方会随之改变。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
这里是代码所用到的几个头文件,而只需要在game.h中包含这几个头文件,在另外两个文件(game.c,test.c)中包含game.h即可
#include"game.h" --- 这里包含自己创建的头文件时用的是双引号
2 // 统计周围有几个雷
static int get_mine(char mine[ROWS][COLS], int x, int y)
这里有一个关于选定一个坐标后,统计以该坐标为中心,周围有几个雷的函数,这里复习一下 static的相关知识点。
static修饰 全局变量,局部变量和函数。
static修饰局部变量,局部变量的生命周期变长,不销毁
static修饰全局变量,改变全局变量的作用域,使其只能在当前源文件使用
static修饰函数时,使其只能在当前文件下使用
这里get_mine函数只是作为Findmain中的一步,所以并没有放在game.h文件中定义
3 关于随机数生成的知识点一个小方法
随机数生成需要用到rand()函数,但他生成的随机数范围是0-32767,
这里我需要生成的0-9的随机数(因为要在9*9的棋盘中布置雷),用生成的随机数对9(row)取模,得到的一定是0-8的数字,再加一
也就是说,当我需要生成一个0-9的随机数时,我可以讲rand对10取模。
随机数需要用到一下两个头文件
#include<stdlib.h>
#include<time.h>
srand((unsigned int)time(NULL)) 这个语句的意思是,将time函数作为返回值给到srand,NULL是空指针的意思。
(unsigned int)表示将值强制转换为int类型,因为time本身是一个longlong类型,这一步可以避免出现警告。
4 一个函数初始化两个数组
这里我需要将一个数组全部初始化为0,而另一个全部初始化为 *
// 初始化数组,棋盘
Initboard(mine, ROWS, COLS, '0');
Initboard(show, ROWS, COLS, '*');
void Initboard(char board[ROWS][COLS], int row, int col, char set)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
board[i][j] = set;
}
}
可以将我需要初始化的值作为一个参数传给函数,然后再将其一一赋值给元素。
当mine数组进入这个函数时, ‘0’也随着传给了函数形参set, 而后循环时,mine数组的每一项都等于set
同样,当show数组进入函数时, * 传给了函数形参set。