1 text.c
#include"game.h"
void mean() { //开始的菜单
printf("1 开始游戏\n");
printf("0 结束游戏\n");
}
void game() {
char mine[ROWS][COLS];//存放布置了的雷
char show[ROWS][COLS];//存放排查出雷的信息,展示的棋盘
InitBoard(mine, ROWS, COLS, '0');//mine开始全部为‘0’‘1’表示雷
InitBoard(show, ROWS, COLS, '*');//show开始全部为‘*’
SetMine(mine, ROW, COL);//布置雷
system("cls");//清屏函数
DispalyBoard(show, ROW, COL);//打印棋盘
//DispalyBoard(mine, ROW, COL);//打印棋盘
//排查雷
FindMine(mine, show, ROW, COL);
}
int main() {
int input = 0;
srand((unsigned int)time(NULL));//设置随机数种子
do
{
mean();
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while (input);
return 0;
}
2 game.h
#pragma once
#include<stdio.h>
#include<stdlib.h>//srand()
#include<time.h>//time()
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define MINE 10 //布置雷数量
//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set);
//打印棋盘
void DispalyBoard(char board[ROWS][COLS],int row,int col);
//布置雷
void SetMine(char boad[ROWS][COLS], int row, int col);
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
3 game.h
#include"game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set) {//遍历数组来初始化
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++) {
board[i][j] = set;//set 表示要初始化的字符
}
}
}
void DispalyBoard(char board[ROWS][COLS], int row, int col) {
printf("----------扫雷游戏---------\n");
//打印排列号
for (int i = 0; i <= col; i++)//每一列
{
printf("%d ", i);
}
printf("\n");
for (int i = 1; i <=row; i++)//1--9
{
printf("%d ", i);//打印行号
for (int j = 1; j <=col ; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
//设置地雷
void SetMine(char boad[ROWS][COLS], int row, int col) {
int count = MINE;
while (count)//count 为0是全部设置完成,跳出循环
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (boad[x][y]=='0')//判断坐标是否放雷
{
boad[x][y] = '1';
count--;
}
}
}
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
//把3×3方格内所有的字符(‘1’或‘0’)加起来,然后再统一减去9个字符‘0’,得到的结果就是地雷的个数
int sum = 0;
for (int i = x - 1; i <= x + 1; i++)
{
int j = 0;
for (j = y - 1; j <= y + 1; j++)
{
sum += mine[i][j];
}
}
return (sum - 9 * '0');
}
//展示所有的雷
void show_all_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) {
for (int i = 1; i <= row; i++)
{
for (int j = 1; j <= col; j++) {
if (mine[i][j]=='1')//在show展示中,将mine的替换成@
{
show[i][j] = '@';
}
}
}
}
//炸金花式展开函数
void explode_spread(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int x, int y)
{
//限制非法坐标的展开
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
//计算该位置附近四周地雷的个数
int count = get_mine_count(mine, x, y);
//若四周没有一个地雷,则需要向该位置的四周展开,直到展开到某个位置附近存在地雷为止
if (count == 0)
{
//把附近没有地雷的位置变成字符 “空格”
show[x][y] = ' ';
//向四周共8个位置递归调用
for (int i = x - 1; i <= x + 1; i++)
{
for (int j = y - 1; j <= y + 1; j++)
{
//限制对点位置的重复展开调用,使得每一个位置只能向四周展开一次
if (show[i][j] == '*')
{
explode_spread(mine, show, row, col, i, j);
}
}
}
}
//若四周存在地雷则应该在这个位置上标注上地雷的个数
else
{
show[x][y] = count + '0';//数字加字符转变成字符
}
}
}
//标记雷
void Sign_Mine(char show[ROWS][COLS], int row, int col) {
int x = 0;
int y = 0;
while (1)
{
printf("输入要标记的坐标\n");
scanf("%d %d", &x, &y);
if (x>=1 && x<=row && y>=1 && y<=col)//判断坐标合法
{
if (show[x][y] == '*')//判断坐标是否能标记
{
show[x][y] = '!';//标记用‘!’表示
break;
}
else
{
printf("坐标不能标记,请重新输入\n");
}
}
else
{
printf("坐标非法,请重新输入\n");
}
}
system("cls");//清屏函数
DispalyBoard(show, row, col);
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) {
int x = 0;
int y = 0;
int win = 0;//记录找到雷的个数
char ch = 0;
while (win<row*col-MINE)
{
printf("请输入要查找坐标:\n");
scanf("%d %d", &x, &y);
if (x>=1 && x<=row && y>=1 && y<=col)//判断输入坐标是否合法
{
if (mine[x][y] == '1') { //点到雷了
break;
}
else
{
//炸金花展开
explode_spread(mine, show, row, col, x, y);
system("cls");
DispalyBoard(show, row, col);
printf("输入Y标记地雷,不标注了输入N\n");
while ((ch = getchar()) != '\n');//清理缓存区
scanf("%c", &ch);
switch (ch)
{
case 'Y':
Sign_Mine(show, row, col);
break;
default:
break;
}
}
}
else
{
printf("坐标非法,亲重新输入\n");
}
}
show_all_mine(mine, show, row, col);
system("cls");
DispalyBoard(show, row, col);
if (win >= row * col - MINE)
{
printf("恭喜,排雷成功\n");
DispalyBoard(mine, ROW, COL);
}
else
{
printf("扫雷失败,你被炸死了!!!\n");
}
}