数据初始化,可以分为两个步骤。第一个步骤就是随即生成雷的位置,第二个步骤就是根据雷的位置计算每一个非雷的方格的雷的数量。

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)之绘制九宫格,并初始化数据

    <数独游戏>之绘制九宫格,并初始化数据 1.在工程里的res/values目录下新建一个colors.xml来存放具体颜色值,已供程序通过R.color.颜色名 来调用 this.getR ...

  2. java扫雷雷区的统计数据代码_java实现扫雷游戏控制台版

    本文实例为大家分享了java实现扫雷游戏控制台版,供大家参考,具体内容如下 扫雷游戏 a.游戏的分析 在游戏中需要存在对象包含哪些. 格子对象(Grid): 属性:内容(content).状态(typ ...

  3. 用c语言写扫雷游戏倒计时代码,课内资源 - 基于VS2013实现的扫雷小游戏

    1.任务概述 1.1 系统总体目标 本项目的目的在于开发一个扫雷软件,该软件面向游戏玩家用户,具有进行扫雷游戏的功能.游戏玩家将使用系统中的如下功能: 进行游戏 使用自定义游戏规格功能 使用计时器功能 ...

  4. [安全攻防进阶篇] 一.什么是逆向分析、逆向分析应用及经典扫雷游戏逆向

    从2019年7月开始,我来到了一个陌生的专业--网络空间安全.初入安全领域,是非常痛苦和难受的,要学的东西太多.涉及面太广,但好在自己通过分享100篇"网络安全自学"系列文章,艰难 ...

  5. 一文教你从零开始设计并实现一个Java扫雷游戏

    背景:扫雷这款游戏有着很长的历史,从扫雷被开发出来到现在进行了无数次的优化,这款游戏变得越来越让人爱不释手了,简单的玩法在加上一个好看的游戏界面,每一处的细节都体现了扫雷的魅力.以JAVA语言作为开发 ...

  6. 数据结构课程设计------扫雷游戏(升级版,可展开)

    本程序由团队中的一个人所写,本人看懂并写下此文章 题目:扫雷 3.1问题描述 扫雷游戏 [基本要求] (1)完成棋盘的初始化并在标准显示器中显示 (2)通过输入行列值确定用户输入 (3)游戏进行给出提 ...

  7. Unity2017 经典游戏开发教程 算法分析与实现 (张帆 著)

    https://meta.box.lenovo.com/link/view/82c451b41ce34e81a4b34cb46747d3d5 第1章 熟悉Unity软件的操作 第2章 打地鼠 (已看) ...

  8. 微信小程序实验四 —— 扫雷游戏

    实验小提醒,打开微信小程序模板时,一定要看清楚,要选js模板,不要选ts模板,因为ts中对数据类型检查更严格,同样的代码在ts中可能无法运行! 实验内容: 编写如下扫雷游戏,基本要求如下: (1)方块 ...

  9. Java Swing扫雷游戏demo分享

    好多年前写过简略的扫雷游戏,模拟windows的. 后来由于多次搬迁环境,弄丢了,遗憾不已啊. 于是趁着这两年还在编程的道路上,趁热再次编写了一次,同时也扩展了功能,更接近windows的扫雷. 此次 ...

最新文章

  1. python中notebook_Jupyter Notebook--学习python必不可少的工具
  2. 【数据库】MySQL乱码解决(存入数据乱码和查询输出乱码)
  3. 大话WiFi省电模式
  4. python3 随机数函数
  5. [Stardust]星尘配置中心
  6. 判断ROS版本号-ubuntu20.04安装ROS_noetic-修改镜像源
  7. URL生成方式性能优化结果
  8. python 投票计数器全班50人3个候选人_Python程序为STV投票系统,为每个人加上所有的第一偏好票...
  9. ShardingSphere UI 初步体验
  10. python 动态类型性能_动态且强类型的Python
  11. 过滤器在图纸上的符号_看不懂电气图纸?资深级老师傅教你如何识图,学会后受用一生...
  12. Android 9.0 10.0 Launcher3 时钟动态图标的定制化(时钟动态图标)
  13. AsposeCells Excel转Pdf时异常
  14. Java之spilt()函数,trim()函数
  15. 【简易爬虫】找回B站“已失效视频”的相关信息
  16. Python OpenCV 裁剪身份证正反面
  17. 求部门最高工资(Mysql多表查询)
  18. **.Eet Framework win7系统安装失败报 时间戳和日期不符**
  19. QPS、TPS、并发用户数、吞吐量关系
  20. Mento Carlo方法

热门文章

  1. Hivesql去除最大值和最小值,计算平均salary
  2. 对手机丢失后可能产生的危害的思考
  3. 查询速度慢的原因很多(转载)
  4. 微信小程序中报错:TypeError: Cannot read property ‘openid‘ of null
  5. 科研绘图--pdf图像去除空白
  6. C#,图论与图算法,二分图(Bipartite Graph)最佳二分匹配(Maximum Bipartite Matching)算法与源程序
  7. pop3协议的几种状态
  8. elementUI radio选中样式修改为勾勾
  9. xtu寒假做题1月6日题解
  10. 华硕笔记本U盘启动BIOS设置方法