目录
扫雷思路
若该点是雷则游戏失败,若该点不是雷则统计周围8个坐标中雷的个数并把周围雷的个数显示其中。
扫雷游戏分为2步,1是布置好雷的位置,2是玩家扫雷。
为了布置好雷的位置,就要创建好一个棋盘,这里就拿5X5的游戏棋盘举例,首先是无雷格子填0表示,有雷的格子填1表示,为了方便统计周围8个雷的个数,只用简单加减即可。其次是棋盘选择,考虑到边界雷排查存在越界判断的问题,这里选择创建一个7X7的棋盘。再其次是信息的显示由于雷数1与雷的表示1冲突所有这里选择创建2个棋盘一个存储雷的信息,一个为扫雷显示结果。现在可以开整了。
自定义函数
/* 将棋盘初始化为set */
void InitBoard(char board[ROWS][COLS] , int rows, int cols, char set);
/*
** board[ROWS][COLS] 初始化的棋盘
** rows 初始化的行
** cols 初始化的列
** set 初始化后内容
*/
/*棋盘的打印*/
void DisplayBoard(char board[ROWS][COLS], int row, int col);
/*
** board[ROWS][COLS] 打印的棋盘
** row 打印的行
** col 打印的列
*/
/*雷的设置*/
void SetMine(char mine[ROWS][COLS], int row, int col, int set_count);
/*
** board[ROWS][COLS] 带设置的棋盘
** row 设置行的范围上限
** col 设置列的范围上限
** set_count 设置雷的个数
*/
/*排查雷*/
FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
/*
** mine[ROWS][COLS] 雷的棋盘
** show[ROWS][COLS] 展示的棋盘
** row 排查行的范围
** col 排查列的范围
*/
最终代码
game.h
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 5 /* 棋盘行 */
#define COL 5 /* 棋盘列 */
#define ROWS ROW+2
#define COLS COL+2
#define EASY_SET 3 /* 雷的个数 */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/* 将棋盘初始化为set */
void InitBoard(char board[ROWS][COLS] , int rows, int cols, char set);
/*
** board[ROWS][COLS] 初始化的棋盘
** rows 初始化的行
** cols 初始化的列
** set 初始化后内容
*/
/*棋盘的打印*/
void DisplayBoard(char board[ROWS][COLS], int row, int col);
/*
** board[ROWS][COLS] 打印的棋盘
** row 打印的行
** col 打印的列
*/
/*雷的设置*/
void SetMine(char mine[ROWS][COLS], int row, int col, int set_count);
/*
** board[ROWS][COLS] 带设置的棋盘
** row 设置行的范围上限
** col 设置列的范围上限
** set_count 设置雷的个数
*/
/*排查雷*/
FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
/*
** mine[ROWS][COLS] 雷的棋盘
** show[ROWS][COLS] 展示的棋盘
** row 排查行的范围
** col 排查列的范围
*/
game.c
#include "game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set){
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
void DisplayBoard(char board[ROWS][COLS], int row, int col){
int i = 0;
int j = 0;
for (i = 1; i <= row; i++)
{
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void SetMine(char mine[ROWS][COLS], int row, int col, int set_count){
int count = set_count;
while (set_count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
set_count--;
}
}
}
int FindMineCount(char mine[ROWS][COLS], int x, int y){
/* 返回坐标周围雷的个数*/
return mine[x + 1][y] +
mine[x + 1][y + 1] +
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] -
'0' * 8;
}
int ExpendMine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int* p_end){
/* 排查成功返回1 排查失败返回0 排查越界返回-1 */
if (show[x][y] != '?')
{
return 0;
}
else if (x < 1 || x> ROW || y < 1 || y > COL)
{
return -1;
}
else
{
int count = FindMineCount(mine, x, y);
show[x][y] = '0' + count;
(*p_end)--;
if (0 == count)
{
ExpendMine(mine, show, x + 1, y + 1, p_end);
ExpendMine(mine, show, x + 1, y, p_end);
ExpendMine(mine, show, x + 1, y - 1, p_end);
ExpendMine(mine, show, x, y + 1, p_end);
ExpendMine(mine, show, x, y - 1, p_end);
ExpendMine(mine, show, x - 1, y + 1, p_end);
ExpendMine(mine, show, x - 1, y, p_end);
ExpendMine(mine, show, x - 1, y - 1, p_end);
}
return 1;
}
}
FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col){
int end = ROW * COL - EASY_SET;
int x = 0;
int y = 0;
while (end)
{
printf("请输入排查坐标>:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col && show[x][y] == '?')
{
if (mine[x][y] == '1')
{
printf("踩雷了!游戏结束!\n");
DisplayBoard(mine, ROW, COL);
break;
}
else
{
ExpendMine(mine, show, x, y, &end);
DisplayBoard(show, ROW, COL);
}
}
else
{
printf("坐标非法!!!\n");
}
}
if (0 == end)
{
printf("恭喜!扫雷成功!\n");
DisplayBoard(mine, ROW, COL);
}
}
test.c
#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 };
InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '?');
SetMine(mine , ROW, COL, EASY_SET);
//DisplayBoard(mine, ROW, COL);
DisplayBoard(show, ROW, COL);
FindMine(mine, show, ROW, COL);
}
int main()
{
srand((unsigned)time(NULL));
int choice = 0;
do
{
menu();
printf("请选择>:");
scanf("%d", &choice);
switch (choice){
case 1:
game();
break;
case 0:
printf("退出游戏!!!\n");
break;
default:
printf("输入错误!!!请重新输入!!!\n");
break;
}
} while (choice);
return 0;
}