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

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

如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! 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的进行下一关了:

时间: 2024-08-29 11:04:37

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

js选择颜色小游戏(随机生成不含重复数字的数组,通过数组中的数控制定义好的数组)

<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>js网页版小游戏</title> <style media="screen"> .wrap { width: 577px; outline: 1px solid hotpink; margin: 100px auto; box-shadow: 0 0 5px; } .

关于2048小游戏中随机生成2与4个数的问题

public class InitNumer { Random random = new Random(); public InitNumer() { super(); } /** * 随机生成一个二维数组,并指定生成的2与4的个数 * @param rowAndCol 二维数组的宽与高 * @param numberOf2 数字2的个数 * @param numberOf4 数字4的个数 */ public int[][] randomGetNumber(int rowAndCol, int

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

mingus在输出midi文件的时候,使用这样的函数: 1 from mingus.containers import NoteContainer 2 from mingus.midi import midi_file_out 3 4 nc = NoteContainer(["A", "C", "E"]) 5 midi_file_out.write_NoteContainer("test.mid", nc) 在输出时会报错:

yarn client中的一个BUG的修复

org.apache.spark.deploy.yarn.Client.scala中的monitorApplication方法: /** * Report the state of an application until it has exited, either successfully or * due to some failure, then return a pair of the yarn application state (FINISHED, FAILED, * KILLED,

为产品或者商品随机生成6位数的数字编码方案

--为产品或者商品随机生成6位数的数字编码方案 --准备阶段 --建立一个表,生成100000到999999顺序编码 create table #no (  id int ) declare @id int  set @id=1 while(@id<=999999) begin  insert into #no values(@id)  set @[email protected]+1 end --建立随机编码表 create table RNo (  id int identity(1,1),

随机生成一个数独

最近学习用Java编写GUI程序,感觉从做一个小东西入手最好,选择了编写一些小游戏开始,第一个为数独游戏. http://en.wikipedia.org/wiki/Sudoku 编写数独游戏第一步考虑的就是该如何生成一个原始的数独题目,要想生成数独题目最简单的办法就是先随机生成一个完整的数独,然后从中摘除一些数字,这样就可以生成一道数独题.所以需要考虑如何随机的生成一个完整的数独,这里考虑使用回溯法生成: 在数独的某个位置插入一个1~9的值 如果这个值能正常插入,则递归在下一个位置插入 如果这

python内置的一个好玩的函数-zip,并且巧妙的实现按概率随机生成有限个数的字符串。

python有一个比较有意思的内置函数-----zip,可以把传入的两组list进行一个组合变形,再输出子元素为tuple的list,不过变形的方式比较抽象. 举个例子: A=[1,2,3,4,5,6] B=['a','b','c','d'] v1=zip(A,B) v1的结果为: [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')] 比较直观的理解就是,A和B是两道拉链上的扣子,生成的list的子tuple,每一组tuple就是一对扣好了的扣子,并且从每组list的

2D地图随机生成

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

java 随机生成一个中文、判断某个string是否是中文以及打印出全部的中文

现在网上大多数用于判断中文字符的是 U+4E00..U+9FA5 这个范围是只是"中日韩统一表意文字"这个区间,但这不是全部,如果要全部包含,则还要他们的扩展集.部首.象形字.注间字母等等; 2E80-A4CF: 包含了中日朝部首补充.康熙部首.表意文字描述符.中日朝符号和标点.日文平假名.日文片假名.注音字母.谚文兼容字母.象形字注释标志.注音字母扩展.中日朝笔画.日文片假名语音扩展.带圈中日朝字母和月份.中日朝兼容.中日朝统一表意文字扩展A.易经六十四卦符号.中日韩统一表意文字.彝