【经典小游戏】用C语言实现扫雷


在这里插入图片描述

个人主页:C_GUIQU

在这里插入图片描述

前言

各位小伙伴,你们好!
下面小编讲解一下用C语言中的数组和函数实现扫雷!

在这里插入图片描述

1. 游戏介绍

【概述】扫雷是在最短的时间内根据点击格子出现的数字找出所有非地雷的格子,同时避免踩到地雷,踩到一个地雷全盘皆输。

【游戏过程】玩家需要在雷区中,将所有地雷一 一排查出来。

2. 游戏代码实现

2.1 game.h 讲解

#include <stdio.h> // 包含标准输入输出库
#include <stdlib.h> // 包含标准库,用于动态内存分配
#include <time.h> // 包含时间库,用于获取当前时间
// 定义棋盘的行数和列数
#define ROW 9
#define COL 9
// 定义棋盘加上边界后的行数和列数
#define ROWS ROW + 2
#define COLS COL + 2
// 定义简易模式下的雷的数量
#define EASY_COUNT 10
// 初始化棋盘的函数声明
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
// 打印棋盘的函数声明
void DisplayBoard(char board[ROWS][COLS], int row, int col);
// 布置雷的函数声明
void SetMine(char mine[ROWS][COLS], int row, int col);
// 排查雷的函数声明
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

这段代码定义了一些宏来表示棋盘的大小、雷的数量以及一些初始化棋盘和显示棋盘的函数。以下是这些函数的详细注释:

  1. InitBoard 函数:
    • 参数:char board[ROWS][COLS]:棋盘的二维字符数组。
    • 参数:int rows:棋盘的行数。
    • 参数:int cols:棋盘的列数。
    • 参数:char set:用来设置棋盘的初始状态。
    • 功能:初始化棋盘,设置棋盘上每个格子的状态。
  2. DisplayBoard 函数:
    • 参数:char board[ROWS][COLS]:棋盘的二维字符数组。
    • 参数:int row:棋盘的行数。
    • 参数:int col:棋盘的列数。
    • 功能:打印出当前棋盘的状态。
  3. SetMine 函数:
    • 参数:char mine[ROWS][COLS]:棋盘的二维字符数组,用于存储雷的位置。
    • 参数:int row:棋盘的行数。
    • 参数:int col:棋盘的列数。
    • 功能:在棋盘上随机布置雷。
  4. FindMine 函数:
    • 参数:char mine[ROWS][COLS]:棋盘的二维字符数组,用于存储雷的位置。
    • 参数:char show[ROWS][COLS]:棋盘的二维字符数组,用于显示玩家的视角。
    • 参数:int row:棋盘的行数。
    • 参数:int col:棋盘的列数。
    • 功能:根据玩家选择的格子,在显示棋盘上排查雷。
      请注意,这些函数的具体实现没有提供,但是从函数名称可以推断出它们的功能。如果您需要帮助实现这些函数的具体功能,或者有其他编程相关的问题,请提供更多的信息或者具体的请求。

2.2 test.c 讲解

这段代码实现了一个简单的扫雷游戏。以下是对代码的详细注释:

#define _CRT_SECURE_NO_WARNINGS 1
// 防止编译器发出安全警告,例如函数不安全地使用了标准输入输出库
#include"game.h" // 假设有一个名为 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'); // 初始化棋盘,所有位置都是'0'
	InitBoard(show, ROWS, COLS, '*'); // 初始化显示棋盘,所有位置都是'*'
	DisplayBoard(show, ROW, COL); // 打印显示棋盘的初始状态
	SetMine(mine, ROW, COL); // 在棋盘上布置雷
	FindMine(mine, show, ROW, COL); // 开始排查雷
}
int main() {
	srand((unsigned int)time(NULL)); // 使用当前时间作为随机数生成的种子
	int input = 0; // 定义一个变量来存储玩家的输入
	// do...while 循环用于不断地显示菜单和处理玩家输入
	do {
		menu(); // 调用菜单函数显示菜单
		printf("请输入选项>"); // 提示玩家输入选项
		scanf("%d", &input); // 从键盘读取玩家的输入
		// switch 语句用于根据玩家的选择执行不同的操作
		switch (input) {
		case 1: // 如果玩家选择1,则调用游戏函数开始游戏
			game();
			break; // 结束switch语句
		case 0: // 如果玩家选择0,则打印退出消息并结束循环
			printf("退出游戏\n");
			break; // 结束switch语句
		default: // 如果玩家输入其他值,则提示错误并要求重新选择
			printf("输入错误,请重新输入\n");
			break; // 结束switch语句
		}
	} while (input); // 当玩家选择0时,循环结束
	return 0; // 程序结束
}

这段代码定义了一个简单的扫雷游戏。menu 函数用于显示游戏菜单,玩家可以选择开始游戏或退出游戏。game 函数包含了游戏的主要逻辑,包括初始化棋盘、布置雷和排查雷。main 函数是程序的入口点,它使用do...while 循环来不断地显示菜单和处理玩家的输入。当玩家选择退出时,循环结束,程序结束。

2.3 game.c 讲解

这段代码是扫雷游戏的一部分,包括几个函数的实现,用于初始化棋盘、显示棋盘、布置雷以及排查雷。以下是代码的详细注释:

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h" // 假设有一个名为 game.h 的头文件,包含了游戏相关的定义和声明
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
    // 初始化棋盘,将所有位置设置为 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)
{
    // 打印显示棋盘
    printf("------------扫雷------------\n");
    for (int i = 0; i <= row; 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");
    }
    printf("------------扫雷------------\n");
}
void SetMine(char board[ROWS][COLS], int row, int col)
{
    // 在棋盘上布置雷
    int count = EASY_COUNT;
    while (count)
    {
        int x = rand() % row + 1;
        int y = rand() % col + 1;
        if (board[x][y] == '0')
        {
            board[x][y] = '1'; // 设置雷
        }
        count--;
    }
}
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
    // 计算指定位置周围雷的数量
    return mine[x + 1][y] + mine[x - 1][y] +
           mine[x][y + 1] + mine[x][y - 1] +
           mine[x + 1][y + 1] + mine[x - 1][y + 1] +
           mine[x - 1][y - 1] + mine[x + 1][y - 1] - 8 * '0';
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    // 开始排查雷
    int x = 0;
    int y = 0;
    int win = 0;
    while (win < row * col - EASY_COUNT)
    {
        printf("请输入排查坐标>");
        scanf("%d %d", &x, &y);
        if (x >= 1 && x <= row && y >= 1 && y <= col)
        {
            if (show[x][y] != '*')
            {
                printf("输入坐标重复,请重新输入\n");
            }
            else if (mine[x][y] == '1')
            {
                printf("很遗憾,你被炸死了\n");
                DisplayBoard(mine, ROW, COL);
                break;
            }
            else
            {
                // 不是雷,就统计x,y坐标周围有几个雷
                int c = GetMineCount(mine, x, y);
                show[x][y] = c + '0';
                DisplayBoard(show, ROW, COL);
                win++;
            }
        }
        else
        {
            printf("输入坐标错误,请重新输入\n");
        }
    }
    if (win == row * col - EASY_COUNT)
    {
        printf("排雷成功\n");
        DisplayBoard(mine, ROW, COL);
    }
}

game.c用于实现扫雷。

结语

以上就是小编对扫雷游戏的讲解。
如果觉得小编讲的还可以,还请一键三连。互三必回!
持续更新中~!
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值