我的博客: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

然后随机打乱就可以了,注意只随机打乱非零的位置。

代码里面如何实现呢,很简单。

定义一个二维数组,地图每一格对应一个值, 其值为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;
    }
}

很简单是吧,不说了。

接着看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),也就是中心位置,但是我一开始想把它设为左下角,这样地图铺起来就比较直观。做到后来做点击连线的时候发现从中间连线会很麻烦,所以就把这行注释掉了,直接用默认锚点。这样做的话,后面的屏幕坐标和地图数组坐标转换就要做一下处理了。后面再讲。

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

cocos2d-x3.6 连连看随机地图实现的更多相关文章

  1. html5使用canvas实现弹幕功能示例

    这篇文章主要介绍了html5使用canvas实现弹幕功能示例的相关资料,需要的朋友可以参考下

  2. 前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)

    这篇文章主要介绍了前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. H5 canvas实现贪吃蛇小游戏

    本篇文章主要介绍了H5 canvas实现贪吃蛇小游戏,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. ios – parse.com用于键,预期字符串的无效类型,但是得到了数组

    我尝试将我的数据保存到parse.com.我已经预先在parse.com上创建了一个名为’SomeClass’的类.它有一个名为’mySpecialColumn’的列,其数据类型为String.这是我尝试使用以下代码保存数据的代码:如果我运行这个我得到:错误:密钥mySpecialColumn的无效类型,预期字符串,但得到数组这就是我在parse.com上的核心外观:有谁知道我为什么会收到这个错误?

  5. ios – 上下文类型’NSFastEnumeration’不能与数组文字一起使用

    斯威夫特3,你会这样做吗?解决方法正如您所发现的,您不能使用as-casting将数组文字的类型指定为NSFastEnumeration.您需要找到一个符合NSFastEnumeration的正确类,在您的情况下它是NSArray.通常写这样的东西:

  6. ios – 获取资产目录文件夹中所有图像的数组

    在iOS中,是否可以获取资产目录文件夹中的图像数组?我不确定为什么会对此进行投票.我真的不知道从哪里开始.我的另一种方法是创建文件夹中所有文件的plist,但它似乎是多余的.我无法添加任何代码,因为我会添加什么?

  7. ios – 来自调试器的消息:由于内存问题而终止

    我的应用程序使用Geojson文件.我使用MapBoxSDK将MGLpolyline添加到地图中.但问题是我的文件太大,以至于应用程序崩溃并收到错误:来自调试器的消息:由于内存问题而终止.我在第一次循环时面对66234个对象.我试图将数组块化为新数组,但没有成功.请帮我解决问题.这是我在地图上绘制的代码,这里是我的testprojectongithubuseXcode8.1如果有任何不同的第三方可

  8. ios – Swift – 使用字典数组从字典访问数据时出错

    我有一个非常简单的例子,说明我想做什么基本上,我有一个字典,其值包含[String:String]字典数组.我把数据填入其中,但当我去访问数据时,我收到此错误:Cannotsubscriptavalueoftype‘[([String:String])]?’withanindexoftype‘Int’请让我知道我做错了什么.解决方法您的常量数组是可选的.订阅字典总是返回一个可选项.你必须打开它.更

  9. ios – 在Swift中使用“Map”创建两个数组的超集

    假设我有两个数组:我想组合两个数组,以便我得到一个输出我该怎么做呢?

  10. ios – 基于一个对象内的一个值,根据一个值对NSObject数组进行排序

    我创建了一个对象,它看起来像这样然后将其添加到可变数组.稍后,我计算出每个对象到当前gps位置的距离,并将其添加到对象中并将其放回到数组中.我现在需要根据aOffice.distance的值对该数组进行排序,但不知道该怎么做请有人帮帮我谢谢解决方法

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部