我创建了一个基于洪水填充的算法来收集所有与我们刚刚放下的瓷砖相接触的瓷砖,其中一个必须与中心瓷砖相交才能使游戏有效。
该算法从您放下的每个瓷砖开始,然后检查每个周围的方块是否有瓷砖,如果瓷砖存在于特定方向,则将其添加到 Set 并递归地对接触这个新瓷砖的每个瓷砖执行相同的操作,如果没有tile 存在它将退出该功能。当我们播放的字母在各个方向都用完瓷砖时,递归结束。
func getFilledSquare(c: Coordinate) -> Square? {
return squares
|> { s in filter(s) { $0.c == c && $0.tile != nil } }
|> { s in first(s) }
}
func getAdjacentFilledSquares(c: Coordinate?, vertically v: Bool, horizontally h: Bool, original: Square, inout output: Set<Square>) {
// We may hit the original square several times in different directions, so we allow it through multiple times
if let coord = c, sq = getFilledSquare(coord) where sq == original || !output.contains(sq) {
output.insert(sq)
if h {
getAdjacentFilledSquares(coord.next(.Horizontal, d: 1, b: self), vertically: v, horizontally: h, original: original, output: &output)
getAdjacentFilledSquares(coord.next(.Horizontal, d: -1, b: self), vertically: v, horizontally: h, original: original, output: &output)
}
if v {
getAdjacentFilledSquares(coord.next(.Vertical, d: 1, b: self), vertically: v, horizontally: h, original: original, output: &output)
getAdjacentFilledSquares(coord.next(.Vertical, d: -1, b: self), vertically: v, horizontally: h, original: original, output: &output)
}
}
}
它是开源的,该方法称为 getAdjacentFilledSquares(我知道有点冗长)。我的仓库在这里:https ://github.com/ChrisAU/Locution?files=1