IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 《扫雷》游戏初始化数据算法分析 -> 正文阅读

[数据结构与算法]《扫雷》游戏初始化数据算法分析

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

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);
        // 为避免雷的位置会出现重复,导致数量方格内的雷的数量不达标,因此在生成随机数后需要对该位置进行判断是否已经是雷。如果是雷那么+1
        if (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;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:22:01  更:2022-03-06 13:24:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:50:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码