更好的方式来写这个比较

Better way to write this comparison

对于 "Better" 的使用,我深表歉意,但这正是我所需要的。

我正在编写一个 "river" 生成算法,我需要进行大量比较。我想知道是否有更好的方法来编写我必须进行的所有比较。

if Rain.value(atPosition: vector_float2(Float(columns),Float(rows))) == 1.0 {
    fullMap.setTileGroup(tileDef4, forColumn: columns, row: rows)
    if Rain.value(atPosition: vector_float2(Float(columns - 1),Float(rows + 1))) == 0.9 {
        fullMap.setTileGroup(tileDef4, forColumn: columns, row: rows)
    }
    if Rain.value(atPosition: vector_float2(Float(columns - 1),Float(rows))) == 0.9 {
        fullMap.setTileGroup(tileDef4, forColumn: columns, row: rows)
    }
    if Rain.value(atPosition: vector_float2(Float(columns - 1),Float(rows - 1))) == 0.9 {
        fullMap.setTileGroup(tileDef4, forColumn: columns, row: rows)
    }
    if Rain.value(atPosition: vector_float2(Float(columns),Float(rows - 1))) == 0.9 {
        fullMap.setTileGroup(tileDef4, forColumn: columns, row: rows)
    }
    if Rain.value(atPosition: vector_float2(Float(columns + 1),Float(rows - 1))) == 0.9 {
        fullMap.setTileGroup(tileDef4, forColumn: columns, row: rows)
    }
    if Rain.value(atPosition: vector_float2(Float(columns + 1),Float(rows))) == 0.9 {
        fullMap.setTileGroup(tileDef4, forColumn: columns, row: rows)
    }
    if Rain.value(atPosition: vector_float2(Float(columns + 1),Float(rows + 1))) == 0.9 {
        fullMap.setTileGroup(tileDef4, forColumn: columns, row: rows)
    }
    if Rain.value(atPosition: vector_float2(Float(columns),Float(rows + 1))) == 0.9 {
        fullMap.setTileGroup(tileDef4, forColumn: columns, row: rows)
    }
}

基本上 "Rain" 是一个柏林高度图,我用它来确定我的 tileMap 中的降雨量。这些 if 语句正在检查 fullMap 中的 8 个相邻图块(满足高降雨量标准)并确定最低值,然后以河流的形式设置水图块。

这种方法非常低效,因为我将继续在这些 if 语句中写入 if 语句,以检查之后的每个相邻图块。这将是一大堆代码。有没有更好的方法来检查 tileMap 中特定图块周围的每个相邻图块以减少我的代码大小?

由于您正在查看数字 ±1,因此您可以使用两个范围循环:

outerLoop:
for dc in -1...1 {
    for dr in -1...1 {
        if dr == 0 && dc == 0 {
            continue
        }
        if Rain.value(atPosition: vector_float2(Float(columns+dc),Float(rows+dr))) == 0.9 {
            fullMap.setTileGroup(tileDef4, forColumn: columns, row: rows)
            break outerLoop
        }
    }
}

这类似于@dasblinkenlight 的回答。

如果您最终在代码中经常这样做,您可能想要创建一个 adjacentOffsets 数组并循环遍历这些:

let adjacentOffsets = [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)]

if Rain.value(atPosition: vector_float2(Float(columns),Float(rows))) == 1.0 {
    for (dc, dr) in adjacentOffsets {
        if Rain.value(atPosition: vector_float2(Float(columns+dc),Float(rows+dr))) == 0.9 {
            fullMap.setTileGroup(tileDef4, forColumn: columns, row: rows)
            break
        }
    }
}