game.h:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define cout 20//雷的个数
#define ROW 19 //棋盘展示行数
#define COL 19 //棋盘展示列数
#define ROWS ROW+2 //考虑边界问题的行数
#define COLS COL+2 //考虑边界问题的列数
void initable(char table[ROWS][COLS], int rows, int cols,char set); //初始化棋盘(前两个都初始化,布置的雷为1,没布置的为0;展示的初始化全为*)
void showtable(char table[ROWS][COLS], int row, int col);//打印棋盘
void set_mine(char table[ROWS][COLS], int row, int col);//布置雷
void get_mine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col);//排查雷
get_mine.c
拓展无雷区域的代码有点长,我把它和game.c分开了,这部分代码命名为get_mine.c:
//#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
char check(char mine[ROWS][COLS], int x, int y)//返回雷或者周围雷的个数的字符
{
if (mine[x][y] == '1')
{
return '#';
}
if ((mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] +
mine[x - 1][y] + mine[x + 1][y] + mine[x - 1][y + 1] + mine[x][y + 1] + mine[x + 1][y + 1] - 7 * '0') == '0')
{
return ' ';
}
else
{
return mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] +
mine[x - 1][y] + mine[x + 1][y] + mine[x - 1][y + 1] + mine[x][y + 1] + mine[x + 1][y + 1] - 7 * '0';
}
}
void see(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)//拓展周围无雷的区域
{
int number = check(mine, x, y);
if ((mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] +
mine[x - 1][y] + mine[x + 1][y] + mine[x - 1][y + 1] + mine[x][y + 1] + mine[x + 1][y + 1] - 7 * '0') == '0' && show[x][y] != ' ')
{
show[x][y] = ' ';
see(mine, show, x - 1, y - 1);
see(mine, show, x, y - 1);
see(mine, show, x + 1, y - 1);
see(mine, show, x - 1, y);
see(mine, show, x + 1, y);
see(mine, show, x - 1, y + 1);
see(mine, show, x, y + 1);
see(mine, show, x + 1, y + 1);
}
else
{
show[x][y] = number;
}
}
void get_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)//排查雷
{
int flag = 1;
int input = 0;
char number = 0;
do
{
int win = 0;
printf("0.标记 1.排查\n");
scanf("%d", &input);
switch (input)
{
case 0:
{
int x = 0;
int y = 0;
printf("请输入标记雷的坐标:->");
scanf("%d %d", &x, &y);
if (x > 0 && x <= row && y > 0 && y <= col)
{
show[x][y] = '@';
showtable(show, ROW, COL);//打印棋盘
}
}
break;
case 1:
{
int x = 0;
int y = 0;
printf("请输入排查雷的坐标:->");
scanf("%d %d", &x, &y);
if (x > 0 && x <= row && y > 0 && y <= col)
{
number = check(mine, x, y);
if (number == '#')
{
show[x][y] = '#';
printf("你被炸死了\n");
showtable(show, ROW, COL);//打印棋盘
flag = 0;
break;
}
else
{
see(mine, show, x, y);//拓展无雷区域
}
showtable(show, ROW, COL);//打印棋盘
for (x = 1;x <= row;x++)
{
for (y = 1;y <= col;y++)
{
if (mine[x][y] == '0' && show[x][y] != '*')
{
win++;
}
}
}
if (win == row * col - cout)
{
printf("你赢了\n");
flag = 0;
break;
}
}
else
{
printf("输入错误,请重新选择\n");
}
}
break;
default:
{
printf("输入错误,请重新选择\n");
}
break;
}
} while (flag);
}
game.c:
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void initable(char table[ROWS][COLS], int rows, int cols, char set) //初始化棋盘(前两个都初始化,布置的雷为1,没布置的为0;展示的初始化全为*)
{
int i = 0;
int j = 0;
for (i = 0;i < rows;i++)
{
for (j = 0;j < cols;j++)
{
table[i][j] = set;
}
}
}
void showtable(char table[ROWS][COLS], int row, int col)//打印棋盘
{
printf("--------------扫雷游戏---------------\n");
int i = 1;
int j = 1;
for (i = 0;i <= row;i++)
{
if (i < 10)
{
printf(" %d ", i);
}
else
{
printf("%d ", i);
}
}
printf("\n");
for (i = 1;i <= row;i++)
{
if (i < 10)
{
printf(" %d ", i);
}
else
{
printf("%d ", i);
}
for (j = 1;j <= col;j++)
{
printf(" %c ", table[i][j]);
}
printf("\n");
}
printf("--------------扫雷游戏---------------\n");
}
void set_mine(char table[ROWS][COLS], int row, int col)//布置雷
{
srand((unsigned int)time(NULL));
int co = cout;
while (co)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (table[x][y] == '0')
{
table[x][y] = '1';
co--;
}
}
}
text.c:
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void menu()
{
printf("**********************************\n");
printf("********** 1.play **********\n");
printf("********** 0.exit **********\n");
printf("**********************************\n");
}
void game()
{
char mine[ROWS][COLS] = { 0 };//制作布置雷的棋盘
char show[ROWS][COLS] = { 0 };//制作展示雷个数的棋盘
initable(mine,ROWS,COLS,'0'); //初始化棋盘(前两个都初始化,布置的雷为1,没布置的为0;展示的初始化全为*)
initable(show, ROWS, COLS,'*'); //初始化棋盘(前两个都初始化,布置的雷为1,没布置的为0;展示的初始化全为*)
set_mine(mine, ROW, COL);//布置雷
// showtable(mine, ROW, COL);//打印棋盘
showtable(show, ROW, COL);//打印棋盘
get_mine(mine,show, ROW, COL);//排查雷
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择:->");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("搞错了,重来\n");
break;
}
} while (input);
return 0;
}