game.c :
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void restart(char arr[ROWS][COLS],int rows,int cols, char n)//二维数组的初始化
{
int i = 0;
for (i = 0; i < rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
arr[i][j] = n;
}
}
}
void display(char arr[ROWS][COLS], int rows, int cols)//打印数组
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf(" %d ", i);//对于列的坐标的数字提示,以0开始,防止错位
}
printf("\n");
for (i = 1; i < rows - 1; i++)
{
printf(" %d ", i);//每行开头的数字提示
int j = 0;
for (j = 1; j < cols - 1; j++)
{
printf(" %c ", arr[i][j]);
}
printf("\n");
}
}
void set(char arr[ROWS][COLS], int row, int col,int lei)//放雷
{
int s = lei;
while (s)
{
int x = rand() % row + 1;//随机生成坐标,用到rand,并且srand初始随机起点的生成一次程
//序一个就行,所以放在了main函数里
int y = rand() % col + 1;
if (arr[x][y] == '0')
{
arr[x][y] = '1';
s--;
}
}
}
int find(char arr[ROWS][COLS],int x,int y)//对于玩家输入的坐标的周围的8个坐标的雷的个数排查
{
return arr[x][y - 1] +
arr[x][y + 1] +
arr[x - 1][y] +
arr[x - 1][y - 1] +
arr[x - 1][y + 1] +
arr[x + 1][y] +
arr[x + 1][y - 1] +
arr[x + 1][y + 1] -
8 * '0';//将‘0’或是‘1’相加变成整形返回去。
}
void mid(int x, int y, char arr[ROWS][COLS],int rows,int cols,char pp[ROWS][COLS])
{//arr就是mine,pp就是player,连爆我是分8个方向独自爆开
if (x + 1 < rows && y + 1 < cols && x - 1 >= 0 && y - 1 >= 0)
{
a_enlarge(x, y - 1, arr,pp);//左
b_enlarge(x, y + 1, arr,pp);//右
c_enlarge(x + 1, y - 1, arr,pp);//左上
d_enlarge(x + 1, y, arr,pp);//上
e_enlarge(x + 1, y + 1, arr,pp);//右上
f_enlarge(x - 1, y + 1, arr,pp);//左下
g_enlarge(x - 1, y - 1, arr,pp);//下
h_enlarge(x - 1, y, arr,pp);//右下
}
}
//函数的嵌套调用。具体找雷的思想大致相同,就是这些连爆都是分开的从一个方向找雷的,即,左方向
//的,在排查它周围8个坐标后,如果没雷,就再调用此函数,传过去的坐标是连爆的坐标的左方。直到周
// 围有雷,就不再调用了。应该算是递归吧。
void a_enlarge(int x, int y, char arr[ROWS][COLS], char pp[ROWS][COLS])
{
int i;//这里的i就是用来限制条件的如果连爆的的坐标合法,走if那么一切好说(我是直接在if里赋值
//了哦),自会判断递归是否继续,如果这里要连爆的的坐标非法了,那么就会走else,使i等于1,使递归 //停下来,因为这时的坐标非法是证明它都已经超过最外圈即我们多加的那一圈,再递归也没有意义了。
//最后还有一个判断胜负的函数哦!!!!!!!!!!!!!!!!!!!!!!
if (x + 1 < ROWS && y + 1 < COLS && x - 1 >= 0 && y - 1 >= 0)
{
i = arr[x][y - 1] +
arr[x][y + 1] +
arr[x - 1][y] +
arr[x - 1][y - 1] +
arr[x - 1][y + 1] +
arr[x + 1][y] +
arr[x + 1][y - 1] +
arr[x + 1][y + 1] -
8 * '0';
pp[x][y] = i + '0';
}
else
i = 1;
if (i == 0)
{
a_enlarge(x, y - 1, arr, pp);
}
}
void b_enlarge(int x, int y, char arr[ROWS][COLS], char pp[ROWS][COLS])
{
int i;
if (x + 1 < ROWS && y + 1 < COLS && x - 1 >= 0 && y - 1 >= 0)
{
i = arr[x][y - 1] +
arr[x][y + 1] +
arr[x - 1][y] +
arr[x - 1][y - 1] +
arr[x - 1][y + 1] +
arr[x + 1][y] +
arr[x + 1][y - 1] +
arr[x + 1][y + 1] -
8 * '0';
pp[x][y] = i + '0';
}
else
i = 1;
if (i == 0)
{
b_enlarge(x, y + 1, arr, pp);
}
}
void c_enlarge(int x, int y, char arr[ROWS][COLS], char pp[ROWS][COLS])
{
int i;
if (x + 1 < ROWS && y + 1 < COLS && x - 1 >= 0 && y - 1 >= 0)
{
i = arr[x][y - 1] +
arr[x][y + 1] +
arr[x - 1][y] +
arr[x - 1][y - 1] +
arr[x - 1][y + 1] +
arr[x + 1][y] +
arr[x + 1][y - 1] +
arr[x + 1][y + 1] -
8 * '0';
pp[x][y] = i + '0';
}
else
i = 1;
if (i == 0)
{
c_enlarge(x-1, y, arr, pp);
}
}
void d_enlarge(int x, int y, char arr[ROWS][COLS], char pp[ROWS][COLS])
{
int i;
if (x + 1 < ROWS && y + 1 < COLS && x - 1 >= 0 && y - 1 >= 0)
{
i = arr[x][y - 1] +
arr[x][y + 1] +
arr[x - 1][y] +
arr[x - 1][y - 1] +
arr[x - 1][y + 1] +
arr[x + 1][y] +
arr[x + 1][y - 1] +
arr[x + 1][y + 1] -
8 * '0';
pp[x][y] = i + '0';
}
else
i = 1;
if (i == 0)
{
d_enlarge(x - 1, y - 1, arr, pp);
}
}
void e_enlarge(int x, int y, char arr[ROWS][COLS], char pp[ROWS][COLS])
{
int i;
if (x + 1 < ROWS && y + 1 < COLS && x - 1 >= 0 && y - 1 >= 0)
{
i = arr[x][y - 1] +
arr[x][y + 1] +
arr[x - 1][y] +
arr[x - 1][y - 1] +
arr[x - 1][y + 1] +
arr[x + 1][y] +
arr[x + 1][y - 1] +
arr[x + 1][y + 1] -
8 * '0';
pp[x][y] = i + '0';
}
else
i = 1;
if (i == 0)
{
e_enlarge(x - 1, y + 1, arr, pp);
}
}
void f_enlarge(int x, int y, char arr[ROWS][COLS], char pp[ROWS][COLS])
{
int i;
if (x + 1 < ROWS && y + 1 < COLS && x - 1 >= 0 && y - 1 >= 0)
{
i = arr[x][y - 1] +
arr[x][y + 1] +
arr[x - 1][y] +
arr[x - 1][y - 1] +
arr[x - 1][y + 1] +
arr[x + 1][y] +
arr[x + 1][y - 1] +
arr[x + 1][y + 1] -
8 * '0';
pp[x][y] = i + '0';
}
else
i = 1;
if (i == 0)
{
f_enlarge(x + 1, y, arr, pp);
}
}
void g_enlarge(int x, int y, char arr[ROWS][COLS], char pp[ROWS][COLS])
{
int i;
if (x + 1 < ROWS && y + 1 < COLS && x - 1 >= 0 && y - 1 >= 0)
{
i = arr[x][y - 1] +
arr[x][y + 1] +
arr[x - 1][y] +
arr[x - 1][y - 1] +
arr[x - 1][y + 1] +
arr[x + 1][y] +
arr[x + 1][y - 1] +
arr[x + 1][y + 1] -
8 * '0';
pp[x][y] = i + '0';
}
else
i = 1;
if (i == 0)
{
g_enlarge(x + 1, y - 1, arr, pp);
}
}
void h_enlarge(int x, int y, char arr[ROWS][COLS], char pp[ROWS][COLS])
{
int i;
if (x + 1 < ROWS && y + 1 < COLS && x - 1 >= 0 && y - 1 >= 0)
{
i = arr[x][y - 1] +
arr[x][y + 1] +
arr[x - 1][y] +
arr[x - 1][y - 1] +
arr[x - 1][y + 1] +
arr[x + 1][y] +
arr[x + 1][y - 1] +
arr[x + 1][y + 1] -
8 * '0';
pp[x][y] = i + '0';
}
else
i = 1;
if (i == 0)
{
h_enlarge(x + 1, y + 1, arr, pp);
}
}
int is_win(char arr[ROWS][COLS], char n)//判断是否排雷成功
{
int i = 0;
int w = ROW * COL - LEI;//除去雷之外的所有坐标,如果这些坐标都变成的雷的个数,即都不
//是‘*’,就可以说把所有不是雷的坐标都找出来了,You 're win!
for (i = 0; i < ROWS; i++)
{
int j = 0;
for (j = 0; j < COLS; j++)
{
if (arr[i][j] != n)
{
w--;//有一个非'*'坐标,就使总数少一个。
}
if (!w)//如果w = 0,就可以说把所有不是雷的坐标都找出来了,那就返回w了,再经test.c
//中的判断,就完事一局排雷了,否则返回1,再经test.c中的判断,游戏继续。
{
return w;
}
}
}
return 1;
}
非常感谢大家能看到这里!!!!!!!!!!!!!!!!!!!!!!
欢迎多提意见,共同进步。