用c语言编写扫雷程序
test.c文件
1.头文件(本游戏所用到的头文件均一写入game.h中):
#include"game.h"
void menu()
{
printf("***************************************************\n");
printf("************* 1.play 0.exist *********\n");
printf("***************************************************\n");
}
2.此函数用一个变量接收玩家选择的值,决定游戏是否开始
void test()
{
int input;
do
{
menu();
printf("请选择:> ");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("输入错误,请重新选择:\n");
}
} while (input);
}
3.main()函数:
调用test()函数实现是否开始游戏的功能
int main()
{
srand((unsigned)time(NULL));
test();
system("pause");
return 0;
}
4.若要开始游戏,调用test()函数中的game()函数
(本函数具体功能,详见注释)
void game()
{
char Mine[ROWS][COLS];//定义准备设置雷的数组
char Show[ROWS][COLS];//定义显示的数组
Init_board(Mine, ROWS, COLS, '0');//初始化准备设置雷的数组,全为‘0’
Init_board(Show, ROWS, COLS, '*');//初始化排雷的数组
Set_mine(Mine, ROW, COL);//设置雷
print_board(Show, ROW, COL);//打印要排查雷的数组
print_board(Mine, ROW, COL);//打印已知雷位置的数组
Find_mine(Mine,Show, ROW, COL);//排雷
}
game.h文件
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY 10
void Init_board(char arr[ROWS][COLS],int rows,int cols,char ret);//初始化准备设置雷和排雷的数组,全为‘0’
void game();
void Set_mine(char arr[ROWS][COLS], int row, int col);//设置雷
void print_board(char arr[ROWS][COLS], int row, int col);//打印要排查雷的数组,打印已知雷位置的数组
void Find_mine(char Mine[ROWS][COLS],char Show[ROWS][COLS], int row, int col);//排雷
void open_white(char Mine[ROWS][COLS],char Show[ROWS][COLS], int x,int y);//点非雷位置,展开一片空白
game.c文件
#include"game.h"
//初始化数组的函数,ret接收传过来的字符
void Init_board(char arr[ROWS][COLS], int rows, int cols, char ret)
{
int i, j;
for (i = 0; i < rows; i++)
{
for(j = 0; j < cols; j++)
{
arr[i][j] = ret;
}
}
}
//设置雷的函数
void Set_mine(char arr[ROWS][COLS], int row, int col)
{
int x, y;
int count = EASY;//共设置EASY个雷,循环次EASY次
while (count)
{
x = rand() % row + 1;
y = rand() % col + 1;
//使雷设置在数组Mine_board[ROWS][ROWS]1-9列和1-9行,最外面一圈不必设置雷
if ((x > 0 && x <=row) && (y > 0 && y <=col))
{
if (arr[x][y] == '0')//保证设雷的位置不重复
{
arr[x][y] = '1';
count--;
}
}
}
}
//打印ROW*COL
void print_board(char arr[ROWS][COLS], int row, int col)
{
int i, j;
for (i = 0; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <=row; i++)
{
printf("%d", i);
for (j = 1; j <=col; j++)
{
printf(" %c", arr[i][j]);
}
printf("\n");
}
printf("\n\n");
}
//计算输入坐标周围8个位置的雷的个数,返回值为个数
int Get_mine(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 + 1][y - 1] +
Mine[x + 1][y] +
Mine[x + 1][y + 1] +
Mine[x][y + 1] - 8 * '0';//由于数组类型为字符型,雷的个数为整型,这8个坐标的字符均需减去字符‘0’
}
//排雷函数
void Find_mine(char Mine[ROWS][COLS], char Show[ROWS][COLS], int row, int col)
{
int win = 0;
int x, y;
while (win < row*col - 10)//win不超过除去10个雷的所有非雷的位置个数,表示雷未排完
{
printf("请输入要排查的坐标:>");
scanf("%d%d", &x, &y);
if ((x > 0 && x <= row) && (y > 0 && y <= col))
{
if (Mine[x][y] != '1')
{
int count = Get_mine(Mine, x, y);//将此处周围雷的个数赋给count
Show[x][y] = count + '0';//转换为字符型,赋给此处的数组元素
open_white(Mine,Show, x, y);
print_board(Show, ROW, COL);//打印棋盘
win++;//以此判断是否全部排雷完成
}
else
{
printf("很遗憾!你被炸死了,游戏结束\n");
Show[x][y] = '1';
print_board(Show, ROW, COL);
break;
}
}
else
{
printf("输入错误,请重新输入!\n");
}
}
if (win >= row * col - 10)
{
printf("扫雷成功!\n");
}
}
//点非雷位置,展开一片空白的函数
void open_white(char Mine[ROWS][COLS], char Show[ROWS][COLS],int x, int y)
{
if (Get_mine(Mine, x, y) == 0)
{
Show[x][y] = ' ';
if ((x - 1) > 0 && (y - 1) > 0 && (Show[x - 1][y - 1] == '*'))
open_white(Mine, Show, x - 1, y - 1);
if ((x - 1) > 0 && (y) > 0 && (Show[x - 1][y] == '*'))
open_white(Mine, Show, x - 1, y);
if ((x - 1) > 0 && (y + 1) > 0 && (Show[x - 1][y + 1] == '*'))
open_white(Mine, Show, x - 1, y + 1);
if ((x) > 0 && (y - 1) > 0 && (Show[x][y - 1] == '*'))
open_white(Mine, Show, x, y - 1);
if ((x) > 0 && (y + 1) > 0 && (Show[x][y + 1] == '*'))
open_white(Mine, Show, x, y + 1);
if ((x + 1) > 0 && (y - 1) > 0 && (Show[x + 1][y - 1] == '*'))
open_white(Mine, Show, x + 1, y - 1);
if ((x + 1) > 0 && (y) > 0 && (Show[x + 1][y] == '*'))
open_white(Mine, Show, x + 1, y);
if ((x + 1) > 0 && (y + 1) > 0 && (Show[x + 1][y + 1] == '*'))
open_white(Mine, Show, x + 1, y + 1);
}
else
Show[x][y] = Get_mine(Mine,x,y) + '0';
}