C语言扫雷简单版

扫雷思路

在这里插入图片描述
若该点是雷则游戏失败,若该点不是雷则统计周围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;
}

猜你喜欢

转载自blog.csdn.net/E_Diligent/article/details/114123547