在自己的路上狂奔吧
目录
前言
一、效果展示
二、具体实现
1.菜单打印
2.定义数组并初始化(用宏定义控制行列)
3.放雷
4.打印
5.玩家选择排雷
6.雷数统计,递归大片清除
7.最后组合一下
总结
前言
一个由两个二维数组(一个放雷,一个用来显示)二维数组为基础,通过输入坐标控制,可以定义棋盘大小雷个数,有大片清除的扫雷游戏。比较困难的部分则是运用递归进行大规模消除。
一、效果展示
这里为了方便展示,只设记了三颗雷
二、具体实现
1.菜单打印
do-while循环
int main()
{
do {
int input = 0;
printf("*************扫雷*************n");
printf("*****1.开始********0.退出*****n");
printf("******************************n");
printf("请选择>:");
scanf("%d", &input);
switch (input)
{
case 0:
printf("退出游戏n");
break;
case 1:
game();
break;
default:
printf("重新输入n");
break;
}
if (input == 0)
break;
} while (1);
return 0;
}
2.定义数组并初始化(用宏定义控制行列)
一个初始化打空格,一个初始打*把空格和星当参数传过去就好
代码如下(示例):
#define COL COL1+2
#define ROW ROW1+2
#define COL1 9
#define ROW1 9
char lei[ROW][COL] = { 0 };
char show[ROW][COL] = { 0 };//在game函数中定义这里只是拿出来展示
void initboard(char a[ROW][COL], int row, int col, char b)//只用一个函数就行
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
a[i][j]=b;
}
}
3.放雷
用rand函数控制行列放‘*“就行(记得用srand初始化)
void set(char lei[ROW][COL], int row, int col)
{
int count =LEI;
while(count)
{
int a = rand() % row + 1;
int b = rand() % col + 1;
if (lei[a][b] == '0')
{
lei[a][b] = '1';
count--;
}
}
4.打印
void print(char a[ROW][COL], int row, int col)
{
int r = 0;
int l = 0;
printf(" ");
for (int i = 0; i < row; i++)//打印1到9方便玩家
{
printf("%d ", ++r);
}
printf("n");
for (int i = 1; i <=row; i++)
{
printf("%d ", ++l);
for (int j = 1; j <=col; j++)
{
printf("%c ",a[i][j]);
}
printf("n");
}
}
5.玩家选择排雷
void find(char lei[ROW][COL], char show[ROW][COL], int row, int col)
{
int a = 0;
int b = 0;
int win1 = 0;
while (1)
{
printf("请输入查找坐标>:");
scanf("%d%d", &a, &b);
if (a >= 1 && a <= row && b >= 1 && b <= col&&show[a][b]=='*')//注意限制范围
{
if (lei[a][b] == '1')
{
printf("你被炸死了n");
print(lei, ROW1, COL1);
break;
}
if (lei[a][b] == '0')
{
minesum(lei, show, a, b);//将数组show的a,b变成周围雷数和
print(show, ROW1, COL1);
}
}
else
{
printf("输入非法,请重新输入");
}
win1 = iswin(show, ROW1, COL1);
if (win1 == ROW1 * COL1 - LEI)//判断获胜即统计所有能走的格都走完了
{
printf("你赢了n");
break;
}
}
}
6.雷数统计,递归大片清除
void minesum(char lei[ROW][COL],char show[ROW][COL], int a, int b)
{
int sum = 0;
for (int i = -1; i <= 1; i++)//将其加和
{
for (int j= -1; j <= 1;j++)
{
if ((a + i) != a || (j + b) != b)//扫描到本身会越界
{
sum = sum + lei[a + i][b + j] - '0';
}
}
}
show[a][b] = sum+'0';
if (show[a][b] == '0')
{
show[a][b] = ' ';
for (int i = -1; i <= 1; i++)//递归
{
for (int j = -1; j <= 1; j++)
{
if (((a + i) != a || (j + b) != b)&&show[a + i][j +b]=='*'&&a+i>0&&a+i0&&b+j
7.最后组合一下
void game()
{
int win1 = 0;
char lei[ROW][COL] = { 0 };
char show[ROW][COL] = { 0 };
srand((unsigned)time(NULL));
initboard(lei, ROW, COL, '0');
initboard(show, ROW, COL, '*');
print(show, ROW1, COL1);
set(lei, ROW1, COL1);
//用来测试时使用
find(lei, show, ROW1, COL1);
}
总结
递归得分情况,不能乱用return,否则达不到效果。
void find(char lei[ROW][COL], char show[ROW][COL], int row, int col)
{
int a = 0;
int b = 0;
int win1 = 0;
while (1)
{
printf("请输入查找坐标>:");
scanf("%d%d", &a, &b);
if (a >= 1 && a <= row && b >= 1 && b <= col&&show[a][b]=='*')//注意限制范围
{
if (lei[a][b] == '1')
{
printf("你被炸死了n");
print(lei, ROW1, COL1);
break;
}
if (lei[a][b] == '0')
{
minesum(lei, show, a, b);//将数组show的a,b变成周围雷数和
print(show, ROW1, COL1);
}
}
else
{
printf("输入非法,请重新输入");
}
win1 = iswin(show, ROW1, COL1);
if (win1 == ROW1 * COL1 - LEI)//判断获胜即统计所有能走的格都走完了
{
printf("你赢了n");
break;
}
}
}
6.雷数统计,递归大片清除
void minesum(char lei[ROW][COL],char show[ROW][COL], int a, int b)
{
int sum = 0;
for (int i = -1; i <= 1; i++)//将其加和
{
for (int j= -1; j <= 1;j++)
{
if ((a + i) != a || (j + b) != b)//扫描到本身会越界
{
sum = sum + lei[a + i][b + j] - '0';
}
}
}
show[a][b] = sum+'0';
if (show[a][b] == '0')
{
show[a][b] = ' ';
for (int i = -1; i <= 1; i++)//递归
{
for (int j = -1; j <= 1; j++)
{
if (((a + i) != a || (j + b) != b)&&show[a + i][j +b]=='*'&&a+i>0&&a+i0&&b+j
7.最后组合一下
void game()
{
int win1 = 0;
char lei[ROW][COL] = { 0 };
char show[ROW][COL] = { 0 };
srand((unsigned)time(NULL));
initboard(lei, ROW, COL, '0');
initboard(show, ROW, COL, '*');
print(show, ROW1, COL1);
set(lei, ROW1, COL1);
//用来测试时使用
find(lei, show, ROW1, COL1);
}
总结
递归得分情况,不能乱用return,否则达不到效果。
7.最后组合一下
void game()
{
int win1 = 0;
char lei[ROW][COL] = { 0 };
char show[ROW][COL] = { 0 };
srand((unsigned)time(NULL));
initboard(lei, ROW, COL, '0');
initboard(show, ROW, COL, '*');
print(show, ROW1, COL1);
set(lei, ROW1, COL1);
//用来测试时使用
find(lei, show, ROW1, COL1);
}
总结
递归得分情况,不能乱用return,否则达不到效果。



