当前位置: 首页 > article >正文

【番外篇】鸿蒙扫雷天纪:运混沌灵智勘破雷劫天局

在这里插入图片描述

大家好啊,我是小象٩(๑òωó๑)۶
我的博客:Xiao Xiangζั͡ޓއއ

很高兴见到大家,希望能够和大家一起交流学习,共同进步
在这里插入图片描述
这一节课我们不学习新的知识,我们来做一个扫雷小游戏

目录

  • 扫雷小游戏概述
  • 一、扫雷游戏分析和设计
    • 1.1 扫雷游戏的功能说明
    • 1.2 设计思路总结:
  • 二、扫雷游戏代码的实现
    • game.h
    • game.c
    • test.c
  • 三、扫雷游戏的扩展
  • 四、结尾

扫雷小游戏概述

扫雷是一款极具趣味性和挑战性的逻辑解谜游戏,玩家需要在一个布满方块的网格中,根据数字提示推理出隐藏地雷的位置,并标记或避开它们。这款游戏历史悠久,许多操作系统都将其作为自带游戏,因其简单易上手却又充满策略性而深受玩家喜爱。

一、扫雷游戏分析和设计

1.1 扫雷游戏的功能说明

• 使用控制台实现经典的扫雷游戏
• 游戏可以通过菜单实现继续玩或者退出游戏
• 扫雷的棋盘是9*9的格子
• 默认随机布置10个雷
• 可以排查雷

◦ 如果位置不是雷,就显示周围有几个雷
◦ 如果位置是雷,就炸死游戏结束
◦ 把除10个雷之外的所有非雷都找出来,排雷成功,游戏结束

1.2 设计思路总结:

首先,利用控制台打造经典扫雷游戏,含菜单可选择继续或退出。棋盘为 9×9,默认随机布置 10 个雷。玩家排查雷,若选中非雷位置,显示周围雷数;选中雷则游戏结束;找出所有非雷位置,游戏胜利。
然后我们可以采用两个 11×11 的字符数组,mine数组存放布置好的雷信息(初始为’0’,布置雷处改为’1’),show数组存放排查出的雷的信息(初始为’*') ,以此避免信息混淆,同时扩大数组防止排查雷时越界。
最后再通过多文件形式开发,test.c编写测试逻辑,game.c实现游戏函数,game.h声明数据类型和函数,使代码结构清晰,便于维护。

二、扫雷游戏代码的实现

之前学习了多文件的形式对函数的声明和定义,这里我们实践⼀下,我们设计三个文件:

test.c //⽂件中写游戏的测试逻辑 
game.c //⽂件中写游戏中函数的实现等
game.h //⽂件中写游戏需要的数据类型和函数声明等

game.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define EASY_COUNT 10
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
	//初始化棋盘
	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 board[ROWS][COLS], int row, int col);
	//排查雷
	void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

这是一个头文件,主要用于声明函数和定义常量,为其他源文件提供必要的接口和信息,以实现模块化编程。

前面包含了标准输入输出库 <stdio.h>、标准库 <stdlib.h> 和时间库
<time.h>,这些库提供了后续代码中使用的基本函数,如 printf、scanf、rand 和 time 等。

宏定义:EASY_COUNT 定义了简单难度下雷的数量为 10 个。 ROW 和 COL 分别定义了游戏棋盘的实际行数和列数,这里是 9x9的棋盘。 ROWS 和 COLS 分别是在实际棋盘基础上增加了两行两列的扩展棋盘大小,用于方便处理边界情况。

声明了四个函数,这些函数的具体实现将在 game.c 文件中完成。
InitBoard 用于初始化棋盘,将棋盘的每个元素设置为指定的字符。
DisplayBoard 用于打印棋盘,方便玩家查看游戏状态。
SetMine 用于在棋盘上随机布置雷。
FindMine用于玩家排查雷,根据玩家输入的坐标判断是否踩到雷,并更新游戏状态。

game.c

#include <stdlib.h>
#include <time.h>
#include "game.h"
	void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
	{
		int i = 0;
		for (i = 0; i < rows; i++)
		{
			int j = 0;
			for (j = 0; j < cols; j++)
			{
				board[i][j] = set;
			}
		}
	}
	void DisplayBoard(char board[ROWS][COLS], int row, int col)
	{
		int i = 0;
		printf("--------扫雷游戏-------\n");
		for (i = 0; i <= col; i++)
		{
			printf("%d ", i);
		}
		printf("\n");
		for (i = 1; i <= row; i++)
		{
			printf("%d ", i);
			int j = 0;
			for (j = 1; j <= col; j++)
			{
				printf("%c ", board[i][j]);
			}
			printf("\n");
		}
	}
	void SetMine(char board[ROWS][COLS], int row, int col)
	{
		//布置10个雷
		//⽣成随机的坐标,布置雷
		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 - 1] + mine[x][y - 1] + mine[x + 1][y-1] + mine[x + 1][y] +
		mine[x + 1][y + 1] + mine[x][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 (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else
			{
				//该位置不是雷,就统计这个坐标周围有⼏个雷
				int count = GetMineCount(mine, x, y);
				show[x][y] = count + '0';
				DisplayBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("坐标⾮法,重新输⼊\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
		DisplayBoard(mine, ROW, COL);
	}
}

这是一个源文件,主要实现了 game.h 中声明的函数,是扫雷游戏的核心功能实现文件。
InitBoard 函数:使用双重循环遍历棋盘的每个元素,将其初始化为指定的字符 set。
DisplayBoard 函数:打印棋盘的行列编号,并输出棋盘的每个元素,方便玩家查看游戏状态。
SetMine 函数:利用 rand 函数生成随机坐标,在棋盘上随机布置 EASY_COUNT 个雷,直到布置完成。
GetMineCount 函数:计算指定坐标周围 8 个格子中雷的数量,通过字符 ‘1’ 和 ‘0’ 的 ASCII 码差值来统计。
FindMine 函数:处理玩家排查雷的操作,根据玩家输入的坐标判断是否踩到雷。如果踩到雷,游戏结束;否则,统计周围雷的数量并更新显示棋盘,直到所有非雷格子都被排查完,玩家获胜。

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];//存放布置好的雷
		char show[ROWS][COLS];//存放排查出的雷的信息
		//初始化棋盘
		//1. mine数组最开始是全'0'
		//2. show数组最开始是全'*'
		InitBoard(mine, ROWS, COLS, '0');
		InitBoard(show, ROWS, COLS, '*');
		//打印棋盘
		//DisplayBoard(mine, ROW, COL);
		DisplayBoard(show, ROW, COL);
		//1. 布置雷
		SetMine(mine, ROW, COL);
		//DisplayBoard(mine, ROW, COL);
		//2. 排查雷
		FindMine(mine, show, ROW, COL);
	}
	int main()
	{
		int input = 0;
		srand((unsigned int)time(NULL));
		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;
	}

这也是一个源文件,主要负责游戏的流程控制和用户交互,是游戏的入口文件。
主函数main是程序的入口点,使用 srand 函数初始化随机数种子,以确保每次游戏的雷布局不同。通过 do-while 循环不断显示菜单,根据用户的选择调用相应的函数,直到用户选择退出游戏。

综上所述,game.h 提供了游戏的接口和常量定义,game.c 实现了游戏的核心功能,test.c 负责游戏的流程控制和用户交互,三个文件协同工作,实现了一个简单的扫雷游戏。

三、扫雷游戏的扩展

• 是否可以选择游戏难度

简单 99 棋盘,10个雷
中等 16
16棋盘,40个雷
困难 30*16棋盘,99个雷

• 如果排查位置不是雷,周围也没有雷,可以展开周围的一片
• 是否可以标记雷
• 是否可以加上排雷的时间显示

四、结尾

这一课的内容就到这里了,下节课继续学习指针的其他一些知识
如果内容有什么问题的话欢迎指正,有什么问题也可以问我!
在这里插入图片描述


http://www.kler.cn/a/523144.html

相关文章:

  • Kiwi 安卓浏览器本月停止维护,扩展功能迁移至 Edge Canary
  • 2025春招 SpringCloud 面试题汇总
  • three.js用粒子使用canvas生成的中文字符位图材质
  • 【apt源】RK3588 平台ubuntu20.04更换apt源
  • C++并发编程指南04
  • CTF-web: Python YAML反序列化利用
  • 深入探索 HTML5 拖拽效果 API:打造流畅交互体验
  • 27.收益的定义是什么?
  • 2024年终总结——今年是蜕变的一年
  • 砥砺奋进,展望新程0114
  • Webpack 打包性能优化全解
  • 2025数学建模美赛|D题成品论文
  • 第四节 MATLAB变量
  • BurpSuite--暴力破解
  • Redis 集合(Set)
  • java多线程学习笔记
  • golang中的包管理-上--简介
  • 视频拼接,拼接时长版本
  • JavaScript反爬技术解析与应对
  • 蓝桥杯练习日常|递归-进制转换
  • SpringBoot或SpringAI对接DeekSeek大模型
  • Baklib数字化内容管理打破传统束缚提升企业效能
  • 内置序列,专业版已破!
  • 【cran Archive R包的安装方式】
  • 开源先锋DeepSeek-V3 LLM 大语言模型本地调用,打造自己专属 AI 助手
  • 1688平台数据深度挖掘:商品详情与关键词搜索实战指南