一,游戏规则
1.输入9*9的格的坐标(*显示其坐标未被选择过)(共有10颗雷)
2.如果是雷,游戏结束
3.如果不是,将显示所点击的位置相邻八个位置有几颗雷
4.若除了雷位未选后,玩家胜利
例:(有80颗雷)
-------------------------------
-------------------------------
----1.play 0.exit--------
-------------------------------
-------------------------------
请输入(0/1):3
输入错误,请重新输入
-------------------------------
-------------------------------
----1.play 0.exit--------
-------------------------------
-------------------------------
请输入(0/1):1
扫雷游戏开始
0 1 2 3 4 5 6 7 8 9
1 * * * * * * * * *
2 * * * * * * * * *
3 * * * * * * * * *
4 * * * * * * * * *
5 * * * * * * * * *
6 * * * * * * * * *
7 * * * * * * * * *
8 * * * * * * * * *
9 * * * * * * * * *
//有雷的为1
0 1 2 3 4 5 6 7 8 9
1 1 1 1 1 1 1 1 1 1
2 1 1 1 1 1 1 1 1 1
3 1 1 1 1 1 1 1 1 1
4 1 1 1 1 1 1 1 1 1
5 1 1 1 1 1 1 1 1 1
6 1 1 1 1 1 1 1 1 1
7 1 1 1 1 1 1 1 1 1
8 1 1 1 1 1 1 1 1 1
9 1 1 1 1 1 1 1 1 0
请输入坐标(行 列):9 9
0 1 2 3 4 5 6 7 8 9
1 1 1 1 1 1 1 1 1 1
2 1 1 1 1 1 1 1 1 1
3 1 1 1 1 1 1 1 1 1
4 1 1 1 1 1 1 1 1 1
5 1 1 1 1 1 1 1 1 1
6 1 1 1 1 1 1 1 1 1
7 1 1 1 1 1 1 1 1 1
8 1 1 1 1 1 1 1 1 1
9 1 1 1 1 1 1 1 1 0
恭喜你游戏成功
-------------------------------
-------------------------------
----1.play 0.exit--------
-------------------------------
-------------------------------
请输入(0/1):1
扫雷游戏开始
0 1 2 3 4 5 6 7 8 9
1 * * * * * * * * *
2 * * * * * * * * *
3 * * * * * * * * *
4 * * * * * * * * *
5 * * * * * * * * *
6 * * * * * * * * *
7 * * * * * * * * *
8 * * * * * * * * *
9 * * * * * * * * *
0 1 2 3 4 5 6 7 8 9
1 1 1 1 1 1 1 1 1 1
2 1 1 1 1 1 1 1 1 1
3 1 1 1 1 1 1 0 1 1
4 1 1 1 1 1 1 1 1 1
5 1 1 1 1 1 1 1 1 1
6 1 1 1 1 1 1 1 1 1
7 1 1 1 1 1 1 1 1 1
8 1 1 1 1 1 1 1 1 1
9 1 1 1 1 1 1 1 1 1
请输入坐标(行 列):8 7
很遗憾,你被炸死了,游戏结束
0 1 2 3 4 5 6 7 8 9
1 1 1 1 1 1 1 1 1 1
2 1 1 1 1 1 1 1 1 1
3 1 1 1 1 1 1 0 1 1
4 1 1 1 1 1 1 1 1 1
5 1 1 1 1 1 1 1 1 1
6 1 1 1 1 1 1 1 1 1
7 1 1 1 1 1 1 1 1 1
8 1 1 1 1 1 1 1 1 1
9 1 1 1 1 1 1 1 1 1
-------------------------------
-------------------------------
----1.play 0.exit--------
-------------------------------
-------------------------------
请输入(0/1):0
退出游戏
二,游戏代码分析
1.设置游戏菜单,让玩家选择
输入1,游戏开始
输入0,游戏结束
输入其他值,提示输入错误,重新输入
void mnue()
{
printf("-------------------------------\n");
printf("-------------------------------\n");
printf("----1.play 0.exit--------\n");
printf("-------------------------------\n");
printf("-------------------------------\n");
}
void test()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
mnue();
printf("请输入(0/1):");
scanf("%d", &input);
switch (input)
{
case 1:
printf("游戏开始\n");
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
游戏效果:
2.由于输入坐标后,如果没踩雷,要显示周围八个位置共有几颗雷,为了防止数组的溢出选用11*11的棋盘
将字符‘0’放入不是雷的位置中
将字符‘1’放入是雷的位置中
所以将创造两个数组
1.一个数组将存储雷的信息
2.另一个数组排查出的雷的信息
一个数组初始化为‘0’
一个数组初始化为‘*’
函数的初始化
注意:设置一个变量用来接收初始化的结果,可以使不同的二维数组初始化为不同的值
void InitBoard(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;
}
}
}
3.函数的打印函数
注意打印的是9*9的棋盘
为了便于阅读,将坐标也打印了出来
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
for (i = 0; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
int j = 0;
for (j = 1; j <= col; j++)
{
printf("%c ",board[i][j]);
}
printf("\n");
}
}
4.随机布置10个雷
将有10个雷要布置
将雷设为字符‘1’
一个数%9那么这个数在0到8之间
若再加一那么这个数将在1-9之间
void SetMine(char board[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int count = EASY_COUNT;
while (count)
{
x = rand() % row + 1;//1-8+1//1-9
y = rand() % col + 1;//1-8+1//1-9
if (board[x][y] == '0')
{
board[x][y] = '1';
count--;
}
}
}
5.扫雷
字符3与字符0差数字3
计算周围8个(炸弹)数组元素为1的方法:
将8个字符元素相加-8个字符0得到的就是字符1的个数
因为返回值是int,所以需要加上字符0,转化为char
//'3'-'0'=3
//'4'-'0'=4
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
return 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';
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
printf("请输入坐标(行 列):");
int x = 0;
int y = 0;
scanf("%d%d", &x, &y);
int win = 0;//从0开始计数
while (win
{
//坐标合法
if (x > 1 && x <= row && y > 1 && y <= col)
{
if (mine[x][y] == '1')//踩雷
{
printf("很遗憾,你被炸死了,游戏结束\n");
DisplayBoard(mine, ROW, COL);
break;
}
else//计算周围八个位置的雷数
{
int count = get_mine_count(mine, x, y);
show[x][y] = count+'0';//存的是字符,返回值是int
DisplayBoard(mine, ROW, COL);
win++;
}
}
//坐标非法
else
printf("输入错误坐标,请重新输入:\n");
}
//两个情况
//1.break;
//2. win == col * row - EASY_COUNT
if (win == col * row - EASY_COUNT)
printf("恭喜你游戏成功\n");
}
三,用文件实现
test.c源文件中的内容
调用函数时记得要引头文件(函数的声明一般放在相应的头文件中)
菜单函数
游戏的流程控制
游戏的流程
game.h头文件的内容
1.行,列
2.雷的个数
3.所用到的头文件
4.函数的声明
game.c源文件中的内容
调用函数时记得要引头文件(函数的声明一般放在相应的头文件中)
函数的初始化
棋盘的打印
雷设置的位置
周围8个位置中雷数的总和
扫雷流程