cocos2d-x3.6 连连看随机地图实现

简介:

我的博客:http://blog.csdn.net/dawn_moon

这一节来讲地图初始化实现。

连连看地图初始化有非常多实现方式,大概会有下面几种:

  1. 每一格的位置随机取图片放上去
  2. 随机取图片放到随机的位置上去
  3. 把图片铺满地图。随机打乱位置

我们採用第三种方式。

要注意的是。为了保证最后全部的图片都被消掉,那么全部的图片都要是偶数个。我们採用逐格绘制。每次放两张同样的图片,铺满地图以后,随机打乱。

初始例如以下:

0 0 0 0 0 0 0 0 0 0
0 1 1 2 2 3 3 4 4 0
0 5 5 6 6 7 7 8 8 0
0 9 9 10 10 11 11 12 12 0
0 13 13 14 14 15 15 16 16 0
0 0 0 0 0 0 0 0 0 0

然后随机打乱就能够了,注意仅仅随机打乱非零的位置。

代码里面怎样实现呢。非常easy。

定义一个二维数组。地图每一格相应一个值。 其值为0表示是一个空格,其它数字就是图片的id。 
数组初始化都是0。然后遍历一遍,四个边框还是零,里面的位置按图片id,成对赋值。

我把地图数组赋值和图片绘制分成两部分,先初始化地图数组。然后再画棋盘。看代码:

void GameScene::initMap()
{
    // 这里x用来控制地图数组的每格的值,y用来控制两次反转。即每两个格标记同一个值
    int x = 1;
    int y = 0;
    // 数组下标从0開始。这里从1開始遍历,那么最外面一圈就是0不变
    for (int i = 1; i < xCount - 1; i++) {
        for (int j = 1; j < yCount - 1; j++) {
            // 地图数组赋值
            mMap[i][j] = x;
            // y控制反转。x控制每格值添加。增大到图片总数后从再1開始递增
            if (y == 1) {
                x++;
                y = 0;
                if ( x == iconCount) {
                    x = 1;
                }
            }else{
                y = 1;
            }
        }
    }

    change();

    drawMap();

}

上面的 change()函数就是随机打乱地图数组,drawMap()函数就是绘制棋盘,讲地图数组相应的图标绘制出来。

接下来看下change()函数:

// 随机改变一下棋局位置
void GameScene::change()
{
    // 随机种子
    srand((unsigned int)time(NULL));

    // 暂时变量,用来交换两个位置的数据
    int tempX, tempY, tempM;

    // 遍历地图数组,随机交换位置
    for (int x = 1; x < xCount - 1 ; x++)
        for (int y = 1; y < yCount - 1; y++) {
            tempX = 1 + (int)(CCRANDOM_0_1() * (xCount - 2));
            tempY = 1 + (int)(CCRANDOM_0_1() * (yCount - 2));
            tempM = mMap[x][y];
            mMap[x][y] = mMap[tempX][tempY];
            mMap[tempX][tempY] = tempM;
    }
}

非常easy是吧,不说了。

接着看drawMap()函数:

void GameScene::drawMap()
{
    // 绘制棋盘上精灵
    for (int x = 0; x < xCount; x++) {
        for (int y = 0; y < yCount; y++) {
            if (mMap[x][y] > 0) {
                char iconName[64] = {0};
                // 格式化图片名
                sprintf(iconName, "%d.png", mMap[x][y]);
                auto position = indextoScreen(x, y);
                // 全部图片已经加到帧缓存,这里直接用名字取一帧。创建一个精灵
                auto icon = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(iconName));
//                icon->setAnchorPoint(Vec2(0, 0));
                icon->setPosition(position);
                // 设置一个tag,方便兴许识别点击的是那个图标
                int tag = (yCount - 2) * ( x - 1 ) + y;
                // 这是Z序和tag值,Z序设置大一些确保图标在其它精灵的前面
                addChild(icon, 100, tag);
            }
        }
    }
}

代码都加了非常多凝视。应该非常好理解。只是里面有一行凝视掉的代码,是设置锚点的。精灵的默认锚点是(0.5。0.5),也就是中心位置。可是我一開始想把它设为左下角,这样地图铺起来就比較直观。

做到后来做点击连线的时候发现从中间连线会非常麻烦,所以就把这行凝视掉了,直接用默认锚点。

这样做的话,后面的屏幕坐标和地图数组坐标转换就要做一下处理了。后面再讲。

好了。到这里地图就绘制完毕了。


这里写图片描写叙述








本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5210009.html,如需转载请自行联系原作者

相关文章
|
缓存 前端开发 API
API接口封装系列
API(Application Programming Interface)接口封装是将系统内部的功能封装成可复用的程序接口并向外部提供,以便其他系统调用和使用这些功能,通过这种方式实现系统之间的通信和协作。下面将介绍API接口封装的一些关键步骤和注意事项。
|
缓存 API Android开发
Jetpack-Compose 学习笔记(一)—— Compose 初探(下)
Jetpack-Compose 学习笔记(一)—— Compose 初探(下)
213 0
|
算法 定位技术
连连看核心算法与基本思想(附全部项目代码链接与代码详细注释)
连连看核心算法与基本思想(附全部项目代码链接与代码详细注释)
666 0
|
5月前
|
存储 分布式计算 监控
ClickHouse简介
ClickHouse是一款专注于OLAP(联机分析处理)的列式存储数据库,以其极致的查询性能、高压缩率和实时分析能力著称。它通过列式存储、向量化查询引擎及分布式架构,满足大规模数据复杂聚合需求,适用于实时日志分析、用户行为分析等场景。然而,ClickHouse不支持事务(ACID),JOIN性能较弱,且对单行更新/删除效率低,不适合OLTP场景。其丰富的表引擎(如MergeTree系列)和数据类型(如LowCardinality优化类型)为不同业务需求提供了灵活支持。
|
6月前
|
测试技术 API 开发者
持续上新!Qwen2.5-Max正式发布
持续上新!Qwen2.5-Max正式发布
持续上新!Qwen2.5-Max正式发布
|
10月前
|
存储 SQL 缓存
优化ClickHouse查询性能:最佳实践与调优技巧
【10月更文挑战第26天】在大数据分析领域,ClickHouse 以其卓越的查询性能和高效的列式存储机制受到了广泛的关注。作为一名已经有一定 ClickHouse 使用经验的开发者,我深知在实际应用中,合理的表设计、索引优化以及查询优化对于提升 ClickHouse 性能的重要性。本文将结合我的实践经验,分享一些有效的优化策略。
1136 3
|
12月前
|
数据采集 数据可视化 数据挖掘
Python量化炒股常用的Pandas包
Python量化炒股常用的Pandas包
218 7
|
Web App开发 Linux 微服务
了解应用中的微内核架构
【6月更文挑战第25天】**微内核架构**是将系统服务从内核移出,形成可选插件,增强扩展性和适应性。常见于第三方应用和嵌入式系统,如Linux、L4、WinCE。优点包括清晰结构、移植性和扩展性,但缺点是通信开销大、性能较低,不利于整体优化。适合需要灵活功能组合的场景。
402 5
了解应用中的微内核架构
|
机器学习/深度学习 人工智能
论文介绍:AI击败最先进全球洪水预警系统,提前7天预测河流洪水
【5月更文挑战第4天】研究人员开发的AI模型(基于LSTM网络)成功击败全球最先进的洪水预警系统,能在未设测站流域提前7天预测洪水,显著提升预警时间,降低灾害影响。该模型使用公开数据集,减少了对长期观测数据的依赖,降低了预警系统的成本,有望帮助资源有限的地区。然而,模型的性能可能受特定流域条件影响,泛化能力和预测解释性仍有待改进。[论文链接](https://www.nature.com/articles/s41586-024-07145-1)
426 11
Vue3+Vite+Js项目搭建之二:vite.config.js 构建
Vue3+Vite+Js项目搭建之二:vite.config.js 构建
358 1