1.思路讲解
2.注意事项
3.代码展示
思路讲解:扫雷与三子棋准备十分相似,都需要先创建二维数组,初始化,打印棋盘,设置雷,找雷
细节讲解:1.创建二维数组时要设置得大一些,防止玩家在输入时出现越界。例如创建一个11*11的棋盘,只需要到9*9,单独留给外围一圈
2.创建二维数组的棋盘时,要创建两个,一个用于设置雷,另一个用于展示已经选定的坐标。因为如果只用一个棋盘的话,容易混乱
代码展示:
game.h
#include<stdio.h>
#include<stdlib.h>
#define Hangs 11
#define Lies 11
#define hang Hangs-2
#define lie Lies-2
#define Count 10
void Initboard(char mine[Lies][Hangs],int lies,int hangs,char set);
void DisplayBoard(char mine[Lies][Hangs],int lies,int hangs);
void Setmine(char mine[Lies][Hangs], int lies, int hangs);
void Findmine(char mine[Lies][Hangs], char show[Lies][Hangs], int lies, int hangs);
int Getmine(char mine[Lies][Hangs],int x,int y);
test.c
#include"game.h"
void meun()
{
printf("************************\n");
printf("********* 1.开始游戏****\n");
printf("********* 0.退出游戏****\n");
}
void game()
{
char mine[Lies][Hangs];
char show[Lies][Hangs];
Initboard(mine, Lies, Hangs,'*');//初始化棋盘
Initboard(show, Lies, Hangs,'+');
DisplayBoard(show, lie, hang);//打印棋盘
Setmine(mine, lie, hang);//设置雷
Findmine(mine, show, lie, hang);//找雷
}
int main()
{
meun();
srand((unsigned int)time(NULL));
int input;
do
{
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误\n");
break;
}
} while (input);
return 0;
}
game.c
#include"game.h"
void Initboard(char mine[Lies][Hangs], int lies, int hangs, char set)
{
for (int i = 0; i < lies; i++)
{
for (int j = 0; j < hangs; j++)
{
mine[i][j] = set;
}
}
}
void DisplayBoard(char mine[Lies][Hangs], int lies, int hangs)
{
for (int i = 0; i <= hang; i++)
{
printf("%d ", i);
}
printf("\n");
for (int i = 1; i <= lies; i++)
{
printf("%d ", i);
for (int j = 1; j <= hangs; j++)
{
printf("%c ", mine[i][j]);
}
printf("\n");
}
}
void Setmine(char mine[Lies][Hangs], int lies, int hangs)
{
int x = 0;
int y = 0;
int flag = Count;
while (flag)
{
x = rand() % lies + 1;
y = rand() % hangs + 1;
if (mine[x][y] != '0')
{
mine[x][y] = '1';
flag--;
}
}
}
void Findmine(char mine[Lies][Hangs], char show[Lies][Hangs], int lies, int hangs)
{
printf("请输入坐标\n");
int x, y;
int lei = 0;
while (lei<lies*hangs-Count)
{
scanf("%d %d", &x, &y);
if (x >= 1 && x <= lies && y >= 1 && y <= hangs)
{
if (show[x][y] == '*')
{
if (mine[x][y] == '1')
{
printf("中雷,游戏结束\n");
DisplayBoard(mine, lie, hang);
break;
}
else
{
int count = Getmine(mine, x, y);
show[x][y] = count + '0';
DisplayBoard(show, lie, hang);
lei++;
}
}
else
printf("该坐标已被排查\n");
}
else
{
printf("输入错误,请重新输入\n");
}
}
if (lei == lies * hangs - Count)
{
printf("恭喜你,游戏胜利\n");
}
}
int Getmine(char mine[Lies][Hangs], int x, int y)//因为0+字符0=字符0,1+字符1=字符1
{
int count;
count = mine[x - 1][y - 1] +
mine[x - 1][y] +
mine[x - 1][y + 1] +
mine[x][y - 1] +
mine[x][y + 1] +
mine[x + 1][y - 1] +
mine[x + 1][y] +
mine[x + 1][y + 1] - 8 * '0';
return count;
}