开篇先解释一下本游戏代码所定义和用到的头文件
1.#include<stdio.h>//输入输出头文件
2.#include<stdlib.h>//rand函数头文件
3.#include<time.h>//srand里调用time函数头文件
4.#define ROW 9
5.#define COL 9
6.#define ROWS ROW+2
7.#define COLS COL+2
8.#define shu 10
4和5表示arr[ROW][COL]等价为arr[9][9]
7和8表示arr[ROWS][COLS]等价为arr[ROW+2][COL+2],即为arr[11][11]
shu 10也是同理,相当于用shu这个符号来代替10
思路
1.设计游戏开头先设计游戏的开始界面。代码如下
void menu()
{
printf("***********************\n");
printf("***********************\n");
printf("******1.开始游戏*******\n");
printf("******0.结束游戏*******\n");
printf("***********************\n");
printf("***********************\n");
}
int main()
{
int input = 0;
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("出错了\n");
break;
}
} while (input);
}
2.建立一个数组arr2用来存放雷的信息,用字符‘1’来表示雷,有雷就存放1,没有雷就存放0。但是扫雷游戏的数字1也可能表示这个地方周围有1个雷,和我们用‘1’来表示雷有歧义。因此会另外建立一个数组arr1来存放排查出周围雷的数量,此数组全用‘*’表示,同时此数组也是玩家开始游戏能看到的界面。
值得注意的是扫雷排查雷的信息是一自己为中心排查周围一圈剩余八个格子有没有雷,但是到最后一行排查雷的时候,会越界报错,因此要将数组扩大一圈防止越界,但是布置雷还是布置在9*9的坐标上。所以数组要建11*11大小的数组防止越界。
前期显示的数组和构建的初始两个数组代码如下
显示数组函数为xianshi(),初始化构建两个数组函数为chushi
void chushi(char board[ROWS][COLS], int row, int col, char set)//利用变量set来接受‘0’和‘1’,当然你建两个chushi函数来分别构建数组arr1和arr2数组也是可以的
{
int i = 0;
for (i = 0; i < row; i++)//确定行
{
int j = 0;
for (j = 0; j < col; j++)//确定列
{
board[i][j] = set;
}
}
}
void xianshi(char board[ROWS][COLS], int row, int col)
{
int i = 0;
for (i = 0; i <= row; i++)
{
printf("%d ", i);//打印行号
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);//打印列号
int j = 0;
for (j = 1; j <= col; j++)//数组下标列行都是从零开始,但是棋盘必须有一个列或者行是从1开始
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void game()//game函数
{
char arr1[ROWS][COLS];//在开头就已经定义了,同arr1[11][11]
char arr2[ROWS][COLS];//在开头就已经定义了,同arr1[11][11]
chushi(arr1, ROWS, COLS, '0');//专门放雷位置的数组,'1'为雷
chushi(arr2, ROWS, COLS, '*');//要显示给别人看的就是*数组,掩盖雷的位置
xianshi(arr2, ROW, COL);//显示排放雷的信息界面
xianshi(arr1, ROW, COL);//显示存放雷的信息界面,一般开始玩的时候要把此句屏蔽掉
}
此时代码运行为
完成以上两步就可以开始布雷了
3.布雷
布雷函数bu()
当然在game函数中你要先定义bu()函数
布雷是随机位置布雷,因此可以利用rand函数来设置随机坐标,利用srand函数和time函数来实现真随机数,srand((unsigned int)time(NULL))
bu()函数和修改后的game()函数代码如下
void bu(char board[ROWS][COLS], int row, int col)
{
int count = shu;
while (count)
{
int x = rand() % row + 1;//每次都得不同的x,y坐标,所以rand函数要放到循环里面
int y = rand() % col + 1;
if (board[x][y] == '0')
{
board[x][y] = '1';
count--;
}
}
}
void game()
{
char arr1[ROWS][COLS];
char arr2[ROWS][COLS];
chushi(arr1, ROWS,COLS ,'0');//专门放雷位置的数组,'1'为雷
chushi(arr2, ROWS, COLS, '*');//要显示给别人看的就是*数组,掩盖雷的位置
xianshi(arr2, ROW, COL);
bu(arr1,ROW, COL);//布置雷
xianshi(arr1, ROW, COL);
}
srand((unsigned int)time(NULL))随机值函数是放在main函数中,头文件需加上#include <stdlib.h>才能使用srand函数,加上<"time.h>才能使用time函数
修改后的头文件和main函数如下
#include<stdio.h>//输入输出头文件
#include<stdlib.h>//rand函数头文件
#include<time.h>//srand里调用time函数头文件
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
scanf_s("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("出错了\n");
break;
}
} while (input);
}
安插完雷的代码运行如下
10颗雷已经布置完毕,可以开始下一步排雷了
5.排雷
排雷函数我设置为find()函数
排雷逻辑思路
(1)输入x,y坐标,先在arr1函数中去核对这个坐标,如果为字符‘1’,那么就是这个坐标是雷的坐标,直接跳出循环,打印被炸死了
(2)在第一步的基础上,如果这个坐标不是‘1’,那么就说明,此时不是雷。那么就得显示周围八个坐标有雷的个数,个数放到arr1数组中显示的是字符型。而字符型个数=数字+字符0
单独设置一个get()函数来计算雷的个数 ,另外八个坐标为arr1[x-1][y] arr1[x-1][y-1] arr1[x][y- 1] arr1[x+1][y-1] arr1[x+1][y] arr1[x+1][y+1] arr1[x][y+1] arr1[x-1][y+1] ,用这八个坐标值相加就知道有多少个雷,再分别减‘0’就可以显示几个雷了
find()函数和get()函数以及改变过的game()函数代码如下
int get( char arr1[ROWS][COLS],int x, int y)
{
return arr1[x-1][y] + arr1[x-1][y-1] + arr1[x][y- 1] + arr1[x+1][y-1] + arr1[x+1][y] + arr1[x+1][y+1] +arr1[x][y+1] +arr1[x-1][y+1] - 8 * '0';
}
void find(char arr1[ROWS][COLS], char arr2[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (win < row * col - shu)
{
printf("请输入坐标\n");
scanf_s("%d%d", &x, &y);
if (x <= row && x >= 1 && y <= col && y >= 1)
{
if (arr1[x][y] == '1')
{
printf("你被炸死了\n");
xianshi(arr1, ROW, COL);
break;
}
else
{
int count = get(arr1, x, y);
arr2[x][y] = count + '0';//把周围有几个雷统计数量显示在界面上
xianshi(arr2, ROW, COL);
win++;
}
}
else
{
printf("坐标错误\n");
break;
}
}
if (win == row * col - shu)
{
printf("恭喜你,排雷成功\n");
xianshi(arr1, ROW, COL);
}
}
void game()
{
char arr1[ROWS][COLS];
char arr2[ROWS][COLS];
chushi(arr1, ROWS,COLS ,'0');//专门放雷位置的数组,'1'为雷
chushi(arr2, ROWS, COLS, '*');//要显示给别人看的就是*数组,掩盖雷的位置
xianshi(arr2, ROW, COL);
bu(arr1,ROW, COL);//布置雷
//xianshi(arr1, ROW, COL);
find(arr1, arr2, ROW, COL);
}
附上扫雷完整代码
#include<stdio.h>//输入输出头文件
#include<stdlib.h>//rand函数头文件
#include<time.h>//srand里调用time函数头文件
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define shu 10
int get( char arr1[ROWS][COLS],int x, int y)
{
return arr1[x-1][y] + arr1[x-1][y-1] + arr1[x][y- 1] + arr1[x+1][y-1] + arr1[x+1][y] + arr1[x+1][y+1] +arr1[x][y+1] +arr1[x-1][y+1] - 8 * '0';
}
void bu(char board[ROWS][COLS], int row, int col)
{
int count = shu;
while (count)
{
int x = rand() % row + 1;//每次都得不同的x,y坐标,所以rand函数要放到循环里面
int y = rand() % col + 1;
if (board[x][y] == '0')
{
board[x][y] = '1';
count--;
}
}
}
void chushi(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;
}
}
}
void xianshi(char board[ROWS][COLS],int row,int col)
{
int i = 0;
for (i = 0; i <= row; i++)
{
printf("%d ", i);//打印行号
}
printf("\n");
for(i=1;i<=row;i++)
{
printf("%d ", i);//打印列号
int j = 0;
for (j = 1; j <= col; j++)//数组下标列行都是从零开始,但是棋盘必须有一个列或者行是从1开始
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void find(char arr1[ROWS][COLS], char arr2[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (win < row * col - shu)
{
printf("请输入坐标\n");
scanf_s("%d%d", &x, &y);
if (x <= row && x >= 1 && y <= col && y >= 1)
{
if (arr1[x][y] == '1')
{
printf("你被炸死了\n");
xianshi(arr1, ROW, COL);
break;
}
else
{
int count = get(arr1, x, y);
arr2[x][y] = count + '0';//把周围有几个雷统计数量显示在界面上
xianshi(arr2, ROW, COL);
win++;
}
}
else
{
printf("坐标错误\n");
break;
}
}
if (win == row * col - shu)
{
printf("恭喜你,排雷成功\n");
xianshi(arr1, ROW, COL);
}
}
void menu()
{
printf("***********************\n");
printf("***********************\n");
printf("******1.开始游戏*******\n");
printf("******0.结束游戏*******\n");
printf("***********************\n");
printf("***********************\n");
}
void game()
{
char arr1[ROWS][COLS];
char arr2[ROWS][COLS];
chushi(arr1, ROWS,COLS ,'0');//专门放雷位置的数组,'1'为雷
chushi(arr2, ROWS, COLS, '*');//要显示给别人看的就是*数组,掩盖雷的位置
xianshi(arr2, ROW, COL);
bu(arr1,ROW, COL);//布置雷
//xianshi(arr1, ROW, COL);
find(arr1, arr2, ROW, COL);
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
scanf_s("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("出错了\n");
break;
}
} while (input);
}