我的博客: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,成对赋值。

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

  1. void GameScene::initMap()
  2. {
  3. // 这里x用来控制地图数组的每格的值,y用来控制两次反转。即每两个格标记同一个值
  4. int x = 1;
  5. int y = 0;
  6. // 数组下标从0開始。这里从1開始遍历,那么最外面一圈就是0不变
  7. for (int i = 1; i < xCount - 1; i++) {
  8. for (int j = 1; j < yCount - 1; j++) {
  9. // 地图数组赋值
  10. mMap[i][j] = x;
  11. // y控制反转。x控制每格值添加。增大到图片总数后从再1開始递增
  12. if (y == 1) {
  13. x++;
  14. y = 0;
  15. if ( x == iconCount) {
  16. x = 1;
  17. }
  18. }else{
  19. y = 1;
  20. }
  21. }
  22. }
  23. change();
  24. drawMap();
  25. }

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

接下来看下change()函数:

  1. // 随机改变一下棋局位置
  2. void GameScene::change()
  3. {
  4. // 随机种子
  5. srand((unsigned int)time(NULL));
  6. // 暂时变量,用来交换两个位置的数据
  7. int tempX, tempY, tempM;
  8. // 遍历地图数组,随机交换位置
  9. for (int x = 1; x < xCount - 1 ; x++)
  10. for (int y = 1; y < yCount - 1; y++) {
  11. tempX = 1 + (int)(CCRANDOM_0_1() * (xCount - 2));
  12. tempY = 1 + (int)(CCRANDOM_0_1() * (yCount - 2));
  13. tempM = mMap[x][y];
  14. mMap[x][y] = mMap[tempX][tempY];
  15. mMap[tempX][tempY] = tempM;
  16. }
  17. }

非常easy是吧,不说了。

接着看drawMap()函数:

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

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

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

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

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

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

  1. Unity 随机地图房间通道生成

    之前的博客中已经说了随机房间生成: https://www.cnblogs.com/koshio0219/p/12604383.html 但实现房间生成只是整个地图生成最初最简单的一步.下面讨论如何随 ...

  2. Unity3d 随机地图生成

    2D解析图: 3D地形: 嘿嘿.

  3. SpriteKit游戏Delve随机生成地牢地图一个Bug的修复

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) Delve是一个很有意思的地牢探险类型的游戏,其中每一关的地图 ...

  4. roguelike地图的随机生成算法

    如果要想自己设计一个roguelike游戏,那么需要你有一个随机地图生成,我在indienova上看到一篇文章,描述了一个roguelike算法,然后自己用unity实现了一个下. 原文地址:随机生成 ...

  5. 《连连看》算法c语言演示(自动连连看)

    (图片是游戏的示意图,来自互联网,与本文程序无关) 看题目就知道是写给初学者的,没需要的就别看了,自己都觉得怪无聊的. 很多游戏的耐玩性都来自精巧的算法,特别是人工智能的水平.比如前几天看了著名的Al ...

  6. cocos2d 消除类游戏简单的算法 (一)

    1. 游戏视频演示 2.三消游戏我的理解 上面视频中的游戏.我做了2个星期时间,仅仅能算个简单Demo,还有bug.特效也差点儿没有.感觉三消游戏主要靠磨.越磨越精品. 市场上三消游戏已经超级多了.主 ...

  7. VBA随机地牢生成

    无聊啊--于是,我想做一个随机地图. 但是我很懒,不想做. 但是身体很诚实. 这次是直接在Excel中制作的地图,但是,VB的执行效率很慢,我代码的效率也很慢,导致,一旦地图长宽稍大,就会出现好几分钟 ...

  8. unity3d 随机添加树木

    开放世界随机地图才是最重要的.. 随机生成树木 Terrain.terrainData //获取地形设置 terrainData.treePrototypes {get;set;} //获取或设置树木 ...

  9. 18.libgdx制作预览图,背景移动循环,改变地图颜色

    经过构思,游戏将分为两部分, 1,预览图,只负责展示世界形势 2,根据预览图生成的战役项 现在要记录的是我制作预览图的部分 1.预览图只有实际地图的1/4,首先生成地图(建议不要缩放以前地图,由于误差 ...

随机推荐

  1. "创业"半年

                作为一个程序员, 因为受够了”给别人实现梦想太累”的念头, 又受到”外面给出更高薪水”的诱惑, 果断离职创业. 但原本是要创业的, 过了半年, 变成了失业, 这其中到底经历了哪 ...

  2. Oracle EBS-SQL (PO-11):检查采购订单退货数.sql

    select msi.segment1                                    物料编码,     --  msi.inventory_item_id return_it ...

  3. perl 创建包

    <pre name="code" class="python"><pre name="code" class=" ...

  4. ecshop的模板文件中如何判断用户是否登录

    ecshop中对于smarty的运用和改造有很大的值得借鉴的地方,在dwt模板文件中可以直接判断用户是否登录,现在有规定,凡是只展示不销售的电商平台,一律不得展示商品价格,但可以在用户登录后显示. & ...

  5. spring MVC通过json与前台交互

    这里用的是spring4.1.4,jquery2.1.3,其它环境为:myeclipse2014,tomcat7,jdk7 首先,新建一个web工程,并导入springMVC的jar包(为了方便起见我 ...

  6. linux下主要是VirtualBox及GuestAdditions的安装

    Linux版本的VirtualBox下载:http://www.virtualbox.org/wiki/Linux_Downloads.请下载对应的版本. RedHat.RHEL:rpm -i vh ...

  7. js中调用mangeto的js翻译

    第一步: <script type="text/javascript"> Translator.add('英文','<?php echo this->__( ...

  8. 固定cell.imageView.image的大小

    cell.imageView.image的大小 会随着Cell的高度而变化,不同的图片显示的也不一样,在网上找了几种方法,简单方便的是下面这种: UIImage *icon = [UIImage im ...

  9. 动画原理——线性来回运动&&波动

    书籍名称:HTML5-Animation-with-JavaScript 书籍源码:https://github.com/lamberta/html5-animation 1.在正选函数中,随角度的增 ...

  10. malloc和free的区别

    1,malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存. 2,对于非内部数据类型的对象而言,光用maloc/free无法满足动 ...