第一步需要创建三个文件:game.h,game.c和test.c文件
game.h:存放函数声明
game.c:存放函数定义
test.c:存放主函数,和代码运行
准备好文件之后,我们就需要滤清思路:
第一步:在game.h中进行需要函数的声明和头文件的书写
int rand(void);
stdlib.h是使用rand()函数所需要的头文件
rand()函数用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的。rand()会返回一个范围在0到RAND_MAX(至少是32767)之间的伪随机数(整数)。
void srand(unsigned int seed);
在调用rand()函数之前,可以使用srand()函数设置随机数种子,如果没有设置随机数种子,rand()函数在调用时,自动设计随机数种子为1,如srand(1)则是用1来初始化种子。随机种子相同,每次产生的随机数也会相同。
想要生成1~100的数字:
int num =rand()%100+1
产生0~99的数字:int num = rand()%100
time函数会返回当前的日历时间,其实返回的是1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒。time函数返回的这个时间差也被叫做:时间戳。
time函数需要用到的头文件:include<time.h>
完成前面的操作,要开始对test.c文件的编译
test.c文件是我们对游戏开始界面的编写,需要有游戏入口,”开始游戏“,”结束游戏“等等的选项入口,便可开始游戏。同时可以作为对函数的测试的入口。
头文件为include"game.h",可以将game.h中包含的头文件进行运用。
打印选择目录,进入游戏的入口。
设置种子srand()函数,并使用do whlie循环和switch选择语句来进行编译,使用定义input变量来进行选择进入game()函数开始游戏还是退出游戏。我额外添加了一个”选择错误,重新选择“的选项,增加游戏多选性。
则是对game.h和game.c文件中函数的声明和定义的测试运行。
并在game.h中用define来定义所需变量的数值,如我就是用ROW和COL来进行所需二维数组的行列,这样方便修改对变量的定义。
在game.h头文件中还可以对需要使用到的函数进行声明,便于后面在game.c文件中对函数进行定义使用。
第一个函数声明,InitBoard函数初始化棋盘,初始化show和mine棋盘,show棋盘用来存放雷的信息,mine棋盘用来设置雷。
第二个函数声明,DisplayBoard函数用来打印show和和mine棋盘
第三个函数声明,SetMine函数用来设置雷
GetMineCount函数用来计算排除类所在位置附近8个位置雷的个数,返回类型为int
最后一个函数声明,FindMine函数有寻找雷的作用
以上是在头文件中对所需要的函数的声明
需要引入game.h的头文件
初始化棋盘,需要用到到两个循环来初始化棋盘,用set字符来初始化棋盘,不会与整形冲突,也便于观察。
对于棋盘的打印,可以打印一个"------扫雷------“的标题。
然后再进行棋盘的打印,先打印一行序列,再换行,用嵌套循环,边打印序列,便往棋盘每个空格中放一个字符。
设置雷的实现,也需要用到在头文件game.h中的宏定义,创建一个EASY_COUNT变量来进行雷个数的设置,当雷个数为0时,则跳出while循环,雷则设置完成。在为雷的位置放一个字符’1‘。
对排查位置附近雷的数量进行统计,同样也是字符型,利用排查位置附近的坐标位置来进行统计。定义一个count变量,来进行累加,减去字符’0‘,来将其转化为字符型,统计完成返回count。
FindMine()函数的实现较为复杂,需要用到while循环和if判断语句。
定义三个变量,x,y,win
x为行坐标,y为列坐标,win为记录已排查数。
if用来判断输入的坐标合法性,合法则进入if语句,不符则跳出。
坐标为雷,则退出,不为则继续游戏。
需要调用DisplayBoard函数。
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);//初始化棋盘A
void DisplayBoard(char borad[ROWS][COLS], int rows, int cols);//打印棋盘
void SetMine(char mine[ROWS][COLS], int rows, int cols);//设置雷
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS], int rows, int cols);//排查雷
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set) {
int i = 0;
for (i = 0; i < rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
void DisplayBoard(char board[ROWS][COLS], int rows, int cols) {
printf("-------- 扫雷 --------\n");
int i = 0;
for (i = 0; i <= cols; i++) {
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= rows; i++) {
printf("%d ", i);
int j = 0;
for (j = 1; j <=cols; j++) {
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void SetMine(char mine[ROWS][COLS], int rows, int cols) {
int count = EASY_COUNT;
int x = 0;
int y = 0;
while (count)
{
x = rand() % rows + 1;
y = rand() % cols + 1;
if (mine[x][y] != '1') {
mine[x][y] = '1';
count--;
}
}
}
int GetMineCount(char mine[ROWS][COLS],int x,int y) {
int i = 0;
int count = 0;
for (i = -1; i <= 1; i++) {
int j = 0;
for (j = -1; j <= 1; j++) {
count += (mine[x + i][y + j] - '0');
}
}
return count;
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols) {
int x = 0;
int y = 0;
int win = 0;
while (win < cols * rows - EASY_COUNT)
{
printf("请输入坐标位置:");
scanf_s("%d %d", &x, &y);
if (x >= 1 && x <= rows && y >= 1 && y <= cols)
{
if (mine[x][y] =='1')
{
printf("很可惜,你踩雷了");
DisplayBoard(mine, rows, cols);
break;
}
else
{
int count = GetMineCount(mine, x, y);
show[x][y] = count + '0';
DisplayBoard(show, rows, cols);
win++;
}
}
else
{
printf("输入的坐标有误,请重新输入");
}
}
if (win == cols * rows - EASY_COUNT) {
printf("恭喜你,扫雷成功");
DisplayBoard(mine, rows, cols);
}
}
#include"game.h"
void meum()
{
printf("*************************\n");
printf("***********1.play********\n");
printf("***********0.exit********\n");
printf("*************************\n");
}
void game()
{
char mine[ROWS][COLS] = { 0 };//设置雷
char show[ROWS][COLS] = { 0 };//存放雷的消息
InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');
SetMine(mine, ROW, COL);
DisplayBoard(show, ROW, COL);
DisplayBoard(mine, ROW, COL);
FindMine(mine, show, ROW, COL);
}
void test()
{
int input = 0;
srand((unsigned int)time(NULL));
do {
meum();
printf("请选择:>");
scanf_s("%d", &input);
switch (input) {
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}