目录
1、整体代码实现
2、核心代码
2.1初始化棋盘
2.2地雷布置
2.3排雷
3、运行效果
1、整体代码实现
在game.h文件中输入需要的头文件和函数声明。
#pragma once //包含头文件 #include#include #include //符号声明 #define ROW 9 #define COL 9 #define ROWS 11 #define COLS 11 #define EASY_COUNT 10 //函数声明 void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);//初始化棋盘 void PrintBoard(char board[ROWS][COLS], int row, int col);//打印棋盘 void SetMine(char board[ROWS][COLS], int row, int col);//布置地雷 void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//排雷int col);
在game.c中实现各个部分函数。
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
//检查棋盘中未选的坐标
int SumCount(char board[ROWS][COLS], int row, int col)
{
int count = 0;
for (int i = 1; i <= row; i++)
{
for (int j = 1; j <= col; j++)
{
if (board[i][j] == '*')
{
count++;
}
}
}
return count;
}
//周围雷数为0时,进行扩展
void exBoard(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
if (x < 1 || x >9 || y < 1 || y > 9)
{
return;
}
if (show[x][y] == ' ')
{
return;
}
show[x][y] = MineCount(mine, x, y) + '0';
if (show[x][y] == '0')
{
show[x][y] = ' ';
exBoard(mine, show, x - 1, y - 1);
exBoard(mine, show, x, y - 1);
exBoard(mine, show, x + 1, y - 1);
exBoard(mine, show, x - 1, y);
exBoard(mine, show, x + 1, y);
exBoard(mine, show, x - 1, y + 1);
exBoard(mine, show, x, y + 1);
exBoard(mine, show, x + 1, y + 1);
}
}
//得到周围雷的数量
int MineCount(char board[ROWS][COLS], int x, int y)
{
return board[x - 1][y - 1]
+ board[x][y - 1]
+ board[x + 1][y - 1]
+ board[x - 1][y]
+ board[x + 1][y]
+ board[x - 1][y + 1]
+ board[x][y + 1]
+ board[x + 1][y + 1]
- 8 * '0';
}
//初始化棋盘
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;
}
}
}
//打印棋盘
void PrintBoard(char board[ROWS][COLS], int row, int col)
{
for (int i = 0; i <= col; i++)
{
printf("%d ", i);
}
printf("n");
for (int i = 1; i <= row; i++)
{
printf("%d ", i);
for (int j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("n");
}
}
//布置地雷
void SetMine(char board[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int count = 0;
while (count < EASY_COUNT)
{
x = rand() % 9 + 1;//随机生成一个1-9的数字
y = rand() % 9 + 1;//随机生成一个1-9的数字
if (board[x][y] == '0')
{
board[x][y] = '1';
count++;
}
}
}
//排雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
char mine_count = 0;
while (1)
{
printf("请输入坐标:> ");
scanf("%d %d", &x, &y);
if (x < 1 || x > row || y < 1 || y > col || show[x][y] != '*')
{
printf("输入错误,请重输n");
}
else
{
if (mine[x][y] == '1')
{
printf("boom!!!!!n");
return;
}
else
{
exBoard(mine, show, x, y);//当该坐标周围没有雷时,扩展
}
}
if (SumCount(show,row,col) == EASY_COUNT)
{
break;
}
PrintBoard(show, row, col);
}
PrintBoard(mine, row, col);
printf("成功排雷n");
}
整个小游戏的实现
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void game()
{
char mine[ROWS][COLS] = { 0 };//存放布置雷的信息
char show[ROWS][COLS] = { 0 };//存放排雷的信息
//初始化棋盘
InitBoard(mine, ROWS, COLS, '0');//将布置雷的信息的棋盘全部初始化为‘0’
InitBoard(show, ROWS, COLS, '*');//将布排雷的信息的棋盘全部初始化为‘*’
//布置地雷
SetMine(mine, ROW, COL);
PrintBoard(show, ROW, COL);
//排雷
FindMine(mine, show, ROW, COL);
}
void menu()
{
printf("********************************n");
printf("******* 1. play **************n");
printf("******* 0. exit **************n");
printf("********************************n");
}
int main()
{
srand((unsigned int)time(NULL));
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;
}
2、核心代码
2.1初始化棋盘
char mine[ROWS][COLS] = { 0 };//存放布置雷的信息
char show[ROWS][COLS] = { 0 };//存放排雷的信息
//初始化棋盘
InitBoard(mine, ROWS, COLS, '0');//将布置雷的信息的棋盘全部初始化为‘0’
InitBoard(show, ROWS, COLS, '*');//将布排雷的信息的棋盘全部初始化为‘*’
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;
}
}
}
2.2地雷布置
char mine[ROWS][COLS] = { 0 };//存放布置雷的信息
char show[ROWS][COLS] = { 0 };//存放排雷的信息
//初始化棋盘
InitBoard(mine, ROWS, COLS, '0');//将布置雷的信息的棋盘全部初始化为‘0’
InitBoard(show, ROWS, COLS, '*');//将布排雷的信息的棋盘全部初始化为‘*’
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;
}
}
}
2.2地雷布置
EASY_COUNT是总共的地雷数,用字符‘1’来表示地雷。
void SetMine(char board[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int count = 0;
while (count < EASY_COUNT)
{
x = rand() % 9 + 1;//随机生成一个1-9的数字
y = rand() % 9 + 1;//随机生成一个1-9的数字
if (board[x][y] == '0')
{
board[x][y] = '1';
count++;
}
}
}



