Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 所有这些if语句真的有必要吗?_Ios_Swift_Sprite Kit - Fatal编程技术网

Ios 所有这些if语句真的有必要吗?

Ios 所有这些if语句真的有必要吗?,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,我有一个连接两个房间和走廊的功能。这看起来效率很低,但我找不到更好的方法。这是我生成地下城的BSP算法的一部分。你可以找到完整的算法 我最成功的尝试是: func hCorridor(x1: Int, x2: Int, y: Int) { for x in min(x1,x2)...max(x1,x2) { hallways.append(Room(X: y, Y: y, W: 1, H: Int(abs(h)))) } } func vCorridor(y1:

我有一个连接两个房间和走廊的功能。这看起来效率很低,但我找不到更好的方法。这是我生成地下城的BSP算法的一部分。你可以找到完整的算法

我最成功的尝试是:

func hCorridor(x1: Int, x2: Int, y: Int) {
    for x in min(x1,x2)...max(x1,x2) {
        hallways.append(Room(X: y, Y: y, W: 1, H: Int(abs(h))))
    }
}

func vCorridor(y1: Int, y2: Int, x: Int) {
    for y in min(y1,y2)...max(y1,y2) {
        hallways.append(Room(X: y, Y: y, W: Int(abs(w), H: 1))
    }
}

// Randomly choose to start with horizontal or vertical corridors
if Double.random(in: 0..<1.0) > 0.5 {
    hCorridor(x1: Int(point1.x), x2: Int(point2.x), y: Int(point1.y))
    vCorridor(y1: Int(point1.y), y2: Int(point2.y), x: Int(point2.x))
} else {
    vCorridor(y1: Int(point1.y), y2: Int(point2.y), x: Int(point1.x))
    hCorridor(x1: Int(point1.x), x2: Int(point2.x), y: Int(point2.y))
}
函数hCorridor(x1:Int,x2:Int,y:Int){ 对于最小值(x1,x2)…最大值(x1,x2){ 走廊。附加(房间(X:y,y:y,W:1,H:Int(abs(H))) } } func vCorridor(y1:Int,y2:Int,x:Int){ y的最小值(y1,y2)…最大值(y1,y2){ 走廊。附加(房间(X:y,y:y,W:Int(abs(W),H:1)) } } //随机选择从水平或垂直走廊开始 如果是双随机(in:0..0.5{ hCorridor(x1:Int(point1.x),x2:Int(point2.x),y:Int(point1.y)) vCorridor(y1:Int(point1.y)、y2:Int(point2.y)、x:Int(point2.x)) }否则{ vCorridor(y1:Int(point1.y)、y2:Int(point2.y)、x:Int(point1.x)) hCorridor(x1:Int(point1.x),x2:Int(point2.x),y:Int(point2.y)) }
createHall()
函数中的所有if语句真的有必要吗?如果没有,那么编写它们的更好方法是什么?我所有的尝试都不像if语句那样有效。我的尝试给了我死胡同和无法访问的空间。

如果我正确理解了您的问题,您可以

  • 首先选择左侧(分别为右侧)的两个随机点
    point1
    point2
    房间,和
  • 然后将房间与从
    点1
    点2
    的两条“走廊”连接起来, 要么先水平,然后垂直,反之亦然
除了随机选择之外,如果使用
min
abs
计算道路坐标。 类似(更多解释内嵌):


如果我正确理解你的问题,你

  • 首先选择左侧(分别为右侧)的两个随机点
    point1
    point2
    房间,和
  • 然后将房间与从
    点1
    点2
    的两条“走廊”连接起来, 要么先水平,然后垂直,反之亦然
除了随机选择之外,如果使用
min
abs
计算道路坐标。 类似(更多解释内嵌):



顺便说一句,
Double.random(in:0..0.5
是一种复杂的方式来表示
Bool.random()
这是一种BSP算法。它需要两个“叶子”并在它们之间画了一条走廊。这对问题不重要,所以我没有把它包括在内。我在if-else分支中找不到任何对称性,这很奇怪。我想
w>0
w<0
的情况是相似的。if-else结构测试了所有可能的走廊配置。我只是好奇是否有一个IfE-Script语句甚至不能正常工作。它们不生成只有1瓦片宽/高的走廊。我有很大的走廊。与当前的问题无关,但考虑制作<代码>房间< /C> >代码> Stult(值类型是首选的,除非您明确地需要引用类型语义)。顺便说一句,
Double.random(in:0..0.5
是一种复杂的方式来表示
Bool.random()
这是一种BSP算法。它需要两个“叶子”并在它们之间画了一条走廊。这对问题不重要,所以我没有把它包括在内。我在if-else分支中找不到任何对称性,这很奇怪。我想
w>0
w<0
的情况是相似的。if-else结构测试了所有可能的走廊配置。我只是好奇是否有一个IfE-Script语句甚至不能正常工作。它们不生成只有1瓦片宽/高的走廊。我有很大的走廊。与当前的问题无关,但考虑制作<代码>房间< /C> >代码> Stult(值类型是首选的,除非您明确地需要引用类型语义)。您也可以考虑使用<代码> int <代码>或<代码> CGFloat < /C>坐标,以避免所有转换。转换会减慢代码,但是<代码>房间< /Cord>类必须在初始化器中有INTS,因为它在算法的其他部分使我的作业更容易。它也减少了更多的转换。另外,我尝试了这段代码,它的工作原理100%像if语句,但if语句的功能不像我希望的那样,所以我必须进行一些调试,以找出问题所在。@E.Huckabee:是的,但你可以使用整数坐标表示点1,点2。如何?我需要通过CGPoint访问
Room
类的X和Y值。@E.Huckab为什么你必须使用CGPoint?用两个整数坐标定义自己的<代码> StuttPoint < /代码>。你也可以考虑使用<代码> int <代码>或<代码> CGFloat < /C>坐标,以避免所有的转换。转换会减慢代码,但是<代码>房间< /Cord>类必须在INT中有INT。初始化器,因为它使我的工作在算法的其他部分更加容易。它还删除了更多的转换。此外,我尝试了这段代码,它的工作原理与if语句100%相似,但if语句的功能与我希望的不一样,所以我必须进行一些调试,以找出问题所在。@E.Huckabee:是的,但可以使用整数坐标nates表示点1,点2。如何?我需要通过CGPoint访问我的
房间
类的X和Y值。@E.Huckabee:为什么必须使用CGPoint?用两个整数坐标定义自己的
结构点
,并使用它。
class Room {
    var x1:Int
    var x2:Int
    var y1:Int
    var y2:Int
    var center:CGPoint

    init(X: Int, Y: Int, W: Int, H: Int) {
        x1 = X
        x2 = X + W
        y1 = Y
        y2 = Y + H
        center = CGPoint(x: (x1 + x2) / 2, y: (y1 + y2) / 2)
    }
}
func hCorridor(x1: Int, x2: Int, y: Int) {
    for x in min(x1,x2)...max(x1,x2) {
        hallways.append(Room(X: y, Y: y, W: 1, H: Int(abs(h))))
    }
}

func vCorridor(y1: Int, y2: Int, x: Int) {
    for y in min(y1,y2)...max(y1,y2) {
        hallways.append(Room(X: y, Y: y, W: Int(abs(w), H: 1))
    }
}

// Randomly choose to start with horizontal or vertical corridors
if Double.random(in: 0..<1.0) > 0.5 {
    hCorridor(x1: Int(point1.x), x2: Int(point2.x), y: Int(point1.y))
    vCorridor(y1: Int(point1.y), y2: Int(point2.y), x: Int(point2.x))
} else {
    vCorridor(y1: Int(point1.y), y2: Int(point2.y), x: Int(point1.x))
    hCorridor(x1: Int(point1.x), x2: Int(point2.x), y: Int(point2.y))
}
if Bool.random() {
    // Horizontally first, then vertically:
    // From point1 to (point2.x, point1.y):
    hallways.append(Room(X: Int(min(point1.x, point2.x)), Y: Int(point1.y),
                         W: Int(abs(point1.x - point2.x)), H: 1))
    // From (point2.x, point1.y) to point2:
    hallways.append(Room(X: Int(point2.x), Y: Int(min(point1.y, point2.y)),
                         W: 1, H: Int(abs(point1.y - point2.y))))
} else {
    // Vertically first, then Horizontally:
    // From point1 to (point1.x, point2.y):
    hallways.append(Room(X: Int(point1.x), Y: Int(min(point1.y, point2.y)),
                         W: 1, H: Int(abs(point1.y - point2.y))))
    // From (point1.x, point2.y) to point2:
    hallways.append(Room(X: Int(min(point1.x, point2.x)), Y: Int(point2.y),
                         W: Int(abs(point1.x - point2.x)), H: 1))
}