《扫雷》游戏初始化数据算法分析
数据初始化,可以分为两个步骤。第一个步骤就是随即生成雷的位置,第二个步骤就是根据雷的位置计算每一个非雷的方格的雷的数量。
LeiStatus:雷的状态,在整个方格中他只有两种可能,要么他是雷,要么他是数字。如果什么都不显示,其实他是数字0.
数据结构说明
struct Block {int x;int y;
};enum LeiStatus { isNum = 0, isLei };enum ShowStatus {hideNum = 0,showNum,isOk, // 确认这个是雷,即给这个格子标上小旗isAsk // 不确定这个是什么,给这个格子标上问号};/*** @brief The Cell 每一个格子的结构体*/
struct Cell : Block {LeiStatus leiStatus;ShowStatus showStatus;int num; // 表示每个位置的上下左右八个位置的雷的数据,如果雷的状态是Cell(){leiStatus = isNum;num = 0;showStatus = hideNum;}
};
第一步:初始化化雷的位置。
// 1.根据横纵坐标的最大值生成,方格。 for (int i = 0; i < m_max_block_y; i++) {for (int j = 0; j < m_max_block_x; j++) {Cell lei;lei.x = i;lei.y = j;m_cells.push_back(lei);}}// 2. 初始化雷的位置int sum = 0;int size = m_cells.size();do {int ran = getRandom(size);// 为避免雷的位置会出现重复,导致数量方格内的雷的数量不达标,因此在生成随机数后需要对该位置进行判断是否已经是雷。如果是雷那么+1if (m_cells.at(ran).leiStatus != isLei) {sum++;m_cells[ran].leiStatus = isLei;}} while (sum < m_sum_lei);
第二步:计算每个方格的雷的总数
// 初始化个个数据for (int i = 0; i < m_cells.size(); i++) {// 如果这个位置是雷就不需要统计了if (m_cells[i].leiStatus == isLei) continue;int sum = sumLeiStatus(m_cells[i].x, m_cells[i].y, isLei);m_cells[i].num = sum;}// 根据当前位置计算当前位置的8个角的总数。
int QGameWidget::sumLeiStatus(int block_x, int block_y, LeiStatus leiStatus)
{int sum = 0;int b_x = block_x;int b_y = block_y;// 左上角if (b_x - 1 >= 0 && b_y - 1 >= 0) {if (m_cells.at(getIndex(b_x - 1, b_y - 1)).leiStatus == leiStatus) {sum++;}}// 正上if (b_y - 1 >= 0) {if (m_cells.at(getIndex(b_x, b_y - 1)).leiStatus == leiStatus) {sum++;}}// 右上角if (b_x + 1 < m_max_block_x && b_y - 1 >= 0) {if (m_cells.at(getIndex(b_x + 1, b_y - 1)).leiStatus == leiStatus) {sum++;}}// 正右if (b_x + 1 < m_max_block_x) {if (m_cells.at(getIndex(b_x + 1, b_y)).leiStatus == leiStatus) {sum++;}}// 右下if (b_x + 1 < m_max_block_x && b_y + 1 < m_max_block_y) {if (m_cells.at(getIndex(b_x + 1, b_y + 1)).leiStatus == leiStatus) {sum++;}}// 正下if (b_y + 1 < m_max_block_y) {if (m_cells.at(getIndex(block_x, block_y + 1)).leiStatus == leiStatus) {sum++;}}//左下if (b_x - 1 >= 0 && b_y + 1 < m_max_block_y) {if (m_cells.at(getIndex(b_x - 1, b_y + 1)).leiStatus == leiStatus) {sum++;}}// 左if (b_x - 1 >= 0) {if (m_cells.at(getIndex(b_x - 1, b_y)).leiStatus == leiStatus) {sum++;}}return sum;
}
以上代码可以优化成
int QGameWidget::sumLeiStatus(int block_x, int block_y, LeiStatus leiStatus)
{int sum = 0;int b_x = block_x;int b_y = block_y;for (int i = -1; i <= 1; i++) {for (int j = -1; j <= 1; j++) {if (i == 0 && j == 0) {continue;}int index = getIndex(b_x - i, b_y - j);if (index < 0) {continue;}if (m_cells.at(index).leiStatus == leiStatus) {sum++;}}}return sum;
}
int QGameWidget::getIndex(int block_x, int block_y)
{if (block_x < 0 || block_y < 0) return -1;if (block_x >= m_max_block_x || block_y >= m_max_block_y) return -2;return block_x * m_max_block_x + block_y;
}
全部开发:
C++实现《扫雷》游戏(入门经典)_啊渊的博客-CSDN博客
《扫雷》游戏初始化数据算法分析相关推荐
- 数独游戏(1)之绘制九宫格,并初始化数据
<数独游戏>之绘制九宫格,并初始化数据 1.在工程里的res/values目录下新建一个colors.xml来存放具体颜色值,已供程序通过R.color.颜色名 来调用 this.getR ...
- java扫雷雷区的统计数据代码_java实现扫雷游戏控制台版
本文实例为大家分享了java实现扫雷游戏控制台版,供大家参考,具体内容如下 扫雷游戏 a.游戏的分析 在游戏中需要存在对象包含哪些. 格子对象(Grid): 属性:内容(content).状态(typ ...
- 用c语言写扫雷游戏倒计时代码,课内资源 - 基于VS2013实现的扫雷小游戏
1.任务概述 1.1 系统总体目标 本项目的目的在于开发一个扫雷软件,该软件面向游戏玩家用户,具有进行扫雷游戏的功能.游戏玩家将使用系统中的如下功能: 进行游戏 使用自定义游戏规格功能 使用计时器功能 ...
- [安全攻防进阶篇] 一.什么是逆向分析、逆向分析应用及经典扫雷游戏逆向
从2019年7月开始,我来到了一个陌生的专业--网络空间安全.初入安全领域,是非常痛苦和难受的,要学的东西太多.涉及面太广,但好在自己通过分享100篇"网络安全自学"系列文章,艰难 ...
- 一文教你从零开始设计并实现一个Java扫雷游戏
背景:扫雷这款游戏有着很长的历史,从扫雷被开发出来到现在进行了无数次的优化,这款游戏变得越来越让人爱不释手了,简单的玩法在加上一个好看的游戏界面,每一处的细节都体现了扫雷的魅力.以JAVA语言作为开发 ...
- 数据结构课程设计------扫雷游戏(升级版,可展开)
本程序由团队中的一个人所写,本人看懂并写下此文章 题目:扫雷 3.1问题描述 扫雷游戏 [基本要求] (1)完成棋盘的初始化并在标准显示器中显示 (2)通过输入行列值确定用户输入 (3)游戏进行给出提 ...
- Unity2017 经典游戏开发教程 算法分析与实现 (张帆 著)
https://meta.box.lenovo.com/link/view/82c451b41ce34e81a4b34cb46747d3d5 第1章 熟悉Unity软件的操作 第2章 打地鼠 (已看) ...
- 微信小程序实验四 —— 扫雷游戏
实验小提醒,打开微信小程序模板时,一定要看清楚,要选js模板,不要选ts模板,因为ts中对数据类型检查更严格,同样的代码在ts中可能无法运行! 实验内容: 编写如下扫雷游戏,基本要求如下: (1)方块 ...
- Java Swing扫雷游戏demo分享
好多年前写过简略的扫雷游戏,模拟windows的. 后来由于多次搬迁环境,弄丢了,遗憾不已啊. 于是趁着这两年还在编程的道路上,趁热再次编写了一次,同时也扩展了功能,更接近windows的扫雷. 此次 ...
最新文章
- python中notebook_Jupyter Notebook--学习python必不可少的工具
- 【数据库】MySQL乱码解决(存入数据乱码和查询输出乱码)
- 大话WiFi省电模式
- python3 随机数函数
- [Stardust]星尘配置中心
- 判断ROS版本号-ubuntu20.04安装ROS_noetic-修改镜像源
- URL生成方式性能优化结果
- python 投票计数器全班50人3个候选人_Python程序为STV投票系统,为每个人加上所有的第一偏好票...
- ShardingSphere UI 初步体验
- python 动态类型性能_动态且强类型的Python
- 过滤器在图纸上的符号_看不懂电气图纸?资深级老师傅教你如何识图,学会后受用一生...
- Android 9.0 10.0 Launcher3 时钟动态图标的定制化(时钟动态图标)
- AsposeCells Excel转Pdf时异常
- Java之spilt()函数,trim()函数
- 【简易爬虫】找回B站“已失效视频”的相关信息
- Python OpenCV 裁剪身份证正反面
- 求部门最高工资(Mysql多表查询)
- **.Eet Framework win7系统安装失败报 时间戳和日期不符**
- QPS、TPS、并发用户数、吞吐量关系
- Mento Carlo方法
热门文章
- Hivesql去除最大值和最小值,计算平均salary
- 对手机丢失后可能产生的危害的思考
- 查询速度慢的原因很多(转载)
- 微信小程序中报错:TypeError: Cannot read property ‘openid‘ of null
- 科研绘图--pdf图像去除空白
- C#,图论与图算法,二分图(Bipartite Graph)最佳二分匹配(Maximum Bipartite Matching)算法与源程序
- pop3协议的几种状态
- elementUI radio选中样式修改为勾勾
- xtu寒假做题1月6日题解
- 华硕笔记本U盘启动BIOS设置方法