1.扫雷棋盘
2.游戏实现
目录
一.棋盘
思路:对于扫雷游戏来说,整个游戏就是在基于棋盘上实现的,棋盘的重要性不言而喻。
我们打开市面上的一款扫雷游戏:
从此图中可以看出棋盘为9 * 9的,棋盘上的数字代表它的四周有多少雷。所以此时我们则需要思考一个问题,就是位于边界的棋位,它的四周如果为9 * 9的,那么就会出现越界访问,所以,真实的棋盘应该为11 * 11的,而出现在玩家眼前的还是9 * 9的棋盘,这样就不会出现数组越界访问的问题,还能使用户保持观感。
扫雷实现的方法有很多,在这里我们用两个二维数组的方法,一个存放我们布置好的雷的棋盘,另一个存放每个棋位周围雷的个数,所以第二个二维数组是我们展现给用户的棋盘。
在第一个二维数组中我们用字符0表示非雷,字符1表示雷,第二个二维数组我们全用字符 * 表示,每选择了一个棋位就将周围雷的个数赋给该位置的字符 * ,展现给用户。
所以,思路有了,下面就是代码的实现
先将准备工作做好:
//表示行和列
#define Hang1 9
#define Lie1 9
#define Hang2 Hang1+2
#define Lie2 Lie1+2
#define Lei 10 //总的雷的个数
//表示2个二维数组
char mine[Hang2][Lie2];//存放布置的雷
char show[Hang2][Lie2];//存放点击后周围的雷
1.初始化棋盘:
因为我们此时还没有布置雷,所以我们只需要将2个二维数组初始化全没有雷即可。
//1.初始化棋盘
Chushi(mine, Hang2, Lie2, '0');
Chushi(show, Hang2, Lie2, '*');
void Chushi(char board[Hang2][Lie2], int hang, int lie, char c)
{
int i = 0, j = 0;
for (i = 0; i < hang; i++)
{
for (j = 0; j < lie; j++)
{
board[i][j] = c;
}
}
}
2.打印棋盘:
因为我们只需要展现9 * 9的棋盘给用户就可,而我们实际数组是11 * 11的,所以需要行和列的下标都从1出发一直到9。另外我们在打印整个数组前,应先把行和列坐标先打印出来,这样用户也就好进行输入其想要的坐标了。
//2.打印棋盘
//Dayin(mine, Hang1, Lie1);
Dayin(show, Hang1, Lie1);
void Dayin(char board[Hang2][Lie2], int hang, int lie)
{
int i = 0, j = 0;
printf("**** 扫雷游戏 ****\n");
for (i = 0; i <= lie; i++)
{
printf("%d ", i);//打印列标
}
printf("\n");
for (i = 1; i <= hang; i++)
{
printf("%d ", i);//打印行标
for (j = 1; j <= lie; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
二.游戏实现
思路:我们应首先用随机数来布置雷,然后再对用户输入的坐标的四周进行排查出看有几个雷,并且展现给用户,思路很清晰,这一部分的实现直接看代码。
1.布置雷
这一部分的实现主要注意一点随机数的使用就可以。
//3.布置雷
Buzhi(mine, Hang1, Lie1);
void Buzhi(char board[Hang2][Lie2], int hang, int lie)
{
int count = Lei;
while (count)
{
int x = rand() % hang + 1;//1 到 9
int y = rand() % lie + 1;//1 到 9
if (board[x][y] == '0')
{
board[x][y] = '1';
count--;
}
}
}
2.排查雷
做排查雷的时候,那么这时候第一个二维数组用字符0和1表示的优势就体现出来了,具体实现看代码。
//4.排查雷
Pailei(mine, show,Hang1, Lie1);
int pc(int a, int b, char board[Hang2][Lie2])
{
return board[a - 1][b] + board[a][b - 1] + board[a + 1][b] + board[a][b + 1] + board[a - 1][b - 1] + board[a + 1][b + 1] + board[a + 1][b - 1]
+ board[a - 1][b + 1] - 8 * '0'; //利用了字符0的ASCII码值,这也就是其优势所在
}
void Pailei(char board1[Hang2][Lie2], char board2[Hang2][Lie2], int hang1, int lie1)
{
int a = 0, b = 0;
int win = 0;
while (1)
{
printf("请输入想要排查的坐标:>>");
scanf("%d %d", &a, &b);
if (a >= 1 && a <= hang1 && b >= 1 && b <= lie1)
{
if (board1[a][b] == '1')
{
printf("很遗憾,你被炸死了\n");
break;
}
else
{
int ret = pc(a, b, board1);//找出排查到的雷的个数
board2[a][b] = ret + '0';
Dayin(board2, hang1, lie1);//展现给用户
win++;
}
}
else
{
printf("您输入的坐标有误,请重新输入\n");
}
if (win == Hang1 * Lie1 - Lei)
{
printf("恭喜你获得了胜利\n");
Dayin(board1, hang1, lie1);
break;
}
}
}
以上就是简单扫雷游戏的实现,后续我将继续完善其展开一片的效果,请持续关注噢!!!