大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.

如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)


Delve是一个很有意思的地牢探险类型的游戏,其中每一关的地图都是随机生成的.

至于如何在生成地图时兼顾随机性和一定模式,网上有很多不错的建议.你也可以从Delve的源代码中找到答案(如果学习目的需要源代码的可以Q我,或者自行度娘)

这里只是谈一下源代码中有一个小bug,我们看如何修复它!

随机生成地图是放在LevelHelper.swift文件中,其中结构tileMap里有一个实例方法generateMap,全部都在这里了.

该方法的主要功能为,使用不同随机分布器建立一定随机模式,然后从主角开始位置根据模式一点点开始生成随机地图,接着最后在创建一个过关的楼梯,只要主角进入该楼梯则表示此关胜利,调整难度,进入下一关!

在多次运行后发现,偶尔随机地图生成器没有生成过关的楼梯,导致游戏关卡不能完成.大概每10次就有1次.

检查代码发现放置过关楼梯的条件是在最后一个模式位置,不过在这之前做了一个有效性检查,如果为该位置有效才可以放置,如果无效那么你就过不了关了 ;)

if isValidTile(position: newPosition){
                    if getTile(position: newPosition) <= 3{                     currentLocation = newPosition
                        if i == 0 && j == 0{
                            setTile(position: currentLocation, toValue: EndPos)
                        }else{
                            setTile(position: currentLocation, toValue: Ground)
                        }
                    }
                }

注意只有当currentLocation有效且i和j都为0的情况下,才会设置EndPos!

为了修正该Bug,我们首先建立2个变量:

//最后一个有效的位置
var lastVaildPos = CGPointZero
//是否设置过过关楼梯
var isEndSeted = false

然后将代码修改如下:

if isValidTile(position: newPosition){
                    if getTile(position: newPosition) <= 3{
                        lastVaildPos = currentLocation
                        currentLocation = newPosition
                        if i == 0 && j == 0{
                            setTile(position: currentLocation, toValue: 5)
                            isEndSeted = true
                        }else{
                            setTile(position: currentLocation, toValue: 3)
                        }
                    }
                }
            }
        }

        if !isEndSeted{
            setTile(position: lastVaildPos, toValue: 5)
        }

现在如果最后一个位置没有设置结束点则会在方法结束前找到一个有效位置设置结束楼梯,这样无论如何总会有一个退出楼梯,玩家可以很happy的进行下一关了:

SpriteKit游戏Delve随机生成地牢地图一个Bug的修复的更多相关文章

  1. 趣图:快下班了,剩一个bug,修复一下再走

      趣图:当我给老板展示我修复了那个 bug 时 趣图:当我以为这是最后一个Bug时……

  2. 【Python图像特征的音乐序列生成】关于mingus一个bug的修复,兼改进情感模型

    mingus在输出midi文件的时候,使用这样的函数: from mingus.containers import NoteContainer from mingus.midi import midi ...

  3. yarn client中的一个BUG的修复

    org.apache.spark.deploy.yarn.Client.scala中的monitorApplication方法: /** * Report the state of an applic ...

  4. 印象最深的一个bug——排查修复问题事件BEX引发的谷歌浏览器闪退崩溃异常

    前言 最近,我们部门负责项目运维的小王频频接到甲方的反馈,运行的项目使用谷歌浏览器登录后,每次点击处理2秒后,浏览器自动闪退崩溃.小王同学折腾了一个星期,还没找到问题的原因.甲方客户都把问题反馈给项目 ...

  5. Swift - 在界面上生成81个随机红,灰色圆点(SpriteKit游戏开发)

    下面是生成一个“围住神经猫”游戏的初始场景: 1,界面下方会生成9*9共81个圆点,同时圆点内部添加文本标签显示索引 2,默认圆点为灰色,每行随机取两个点变为红色 3,奇数行和偶数行有一定的错位,错位 ...

  6. c#部分---网吧充值系统;简易的闹钟;出租车计费;简单计算器;对战游戏;等额本金法计算贷款还款利息等;随机生成10个不重复的50以内的整数;推箱子;

    网吧充值系统namespace ConsoleApplication1 { class Program { struct huiyuan { public string name; public st ...

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

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

  8. 2D地图随机生成

    2D地图随机生成基础绘图 海陆分布

  9. PYTHON练习题 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数。

    Python 练习 标签: Python Python练习题 Python知识点 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数,如果大于预设的 ...

随机推荐

  1. 网络安全实验室_注入关writeup

    最简单的SQL注入 查看页面源码发现提示要登录admin账户 果断试试万能密码admin' or 1=1# 直接能看到flag了 最简单的SQL注入(熟悉注入环境) 首先查看源码,提示id=1,看样子 ...

  2. [HAOI2006]旅行

    题目描述 Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光.Z小镇附近共有N个景点(编号为1,2,3,…,N),这些景点被M条道路连接着,所有道路都是双向的,两个景点之间可能有多条道路.也 ...

  3. codeforces 842C Ilya And The Tree

    Ilya is very fond of graphs, especially trees. During his last trip to the forest Ilya found a very ...

  4. ●POJ 2079 Triangle

    题链: http://poj.org/problem?id=2079 题解: 计算几何,凸包,旋转卡壳 复杂度O(N^2),(O(N)什么的就不说了,我觉得我看过的O(N)方法正确性都有问题,虽然有些 ...

  5. ●POJ 2007 Scrambled Polygon

    题链: http://poj.org/problem?id=2007 题解: 计算几何,极角排序 按样例来说,应该就是要把凸包上的i点按 第三像限-第四像限-第一像限-第二像限 的顺序输出. 按 叉积 ...

  6. hdu 5724 SG+状态压缩

    Chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  7. 容器化分布式日志组件ExceptionLess的Angular前端UI

    写在前面 随着微服务架构的流行,日志也需要由专门的分布式日志组件来完成这个工作,我们项目使用的是 ExceptionLess 这个组件,它是前后端分离的:这篇文章我们就来实践容器化 Exception ...

  8. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用第三方组件

    Unity开发中,常常会用到一些第三方组件.本文以实例介绍如何在热更新脚本中使用这些第三方组件. 首先说明几个基本步骤: 第三方组件通常是以dll或者源码方式提供的,它们本身往往无法热更. 我们在脚本 ...

  9. OpenCV环境搭建(一)

    此环境搭建是OpenCV的python(一下简称py)开发环境搭建,建立在py3的环境和语法上实现的. windows系统搭建 系统环境:windows 10 + python 3.6 + OpenC ...

  10. Spring中@Autowired与@Resource的区别

    1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2.@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必 ...