【问题标题】:Select Case Not working as expected (Code specific)选择案例未按预期工作(特定于代码)
【发布时间】:2019-07-09 18:09:08
【问题描述】:

我有一个 while 循环显示一个图形节点数组(使用一个函数在要显示的图形节点中返回一个字符),然后是一个“移动”过程,该过程将一个“生物”从一个节点移动到另一个节点。生物通过按“W”、“A”、“S”或“D”来决定去哪里,然后从生物上解除占用(使用称为“解除占用”的函数)图形节点并将该生物放入图形节点中生物想要移动的方向。

我尝试在几乎所有地方抛出一些错误,并使用 trycatch 来中断不起作用的代码,但我没有收到任何错误。我在“选择案例”语句中添加了一个案例。

    While True
        Try
            Console.SetCursorPosition(0, 0)
            myMap.ShowMap()
            myMap.MoveCreatures()
        Catch ex As Exception
            Console.Clear()
            Console.WriteLine(ex.Message)
            Console.ReadKey(True)
        End Try
    End While
    Public Sub MoveCreatures()
        For y = 0 To tiles.GetLength(1) - 1
            For x = 0 To tiles.GetLength(0) - 1
                If tiles(x, y).IsOccupied Then
                    tiles(x, y).MoveCreature()
                End If
            Next
        Next
    Public Sub MoveCreature() Implements ITile.MoveCreature
        If Occupied = True Then
            Creature.Action(Me)
        Else
            Throw New Exception("No creature to move here.")
        End If
    End Sub
    Select Case Console.ReadKey(True).KeyChar
        Case "w"
            If currentTile.North IsNot Nothing Then
                currentTile.North.Occupy(currentTile.Deoccupy)
            Else
                Throw New Exception("Can't go in this direction!")
            End If
        Case "a"
            If currentTile.West IsNot Nothing Then
                currentTile.West.Occupy(currentTile.Deoccupy)
            Else
                Throw New Exception("Can't go in this direction!")
            End If
        ...

'S' 和 'D' 的代码是相同的减去方向变化。例如。 'S' 有

currentTile.South

当生物移动到“W”或“D”时,它不会重新显示地图,直到我按下另一个键,而当它移动到“A”或“S”时,它会立即刷新地图。我希望它在我按“W”、“A”、“S”或“D”中的任何一个时刷新地图。

附:抱歉放了这么多代码。

【问题讨论】:

  • 您正在针对字符串测试 Char。将您的字符串更改为字符:"w"c"a"c 等。
  • 感谢您的帮助,我会尽快尝试,如果不起作用,我会添加更多代码,希望它有助于识别错误。
  • 你能不能在所有调用ReadKey的地方都放一个断点,看看它是否挂在某个地方。

标签: vb.net select-case


【解决方案1】:

While True 是一种 C# 解决方法,因为它们无法创建无限循环。在 VB 中只需使用 Do Loop 代替:

    Do
        Try
            Console.SetCursorPosition(0, 0)
            myMap.ShowMap()
            myMap.MoveCreatures()
        Catch ex As Exception
            Console.Clear()
            Console.WriteLine(ex.Message)
            Console.ReadKey(True)
        End Try
    Loop

我猜问题出在方法上

Public Sub MoveCreatures()
    For y = 0 To tiles.GetLength(1) - 1
        For x = 0 To tiles.GetLength(0) - 1
            If tiles(x, y).IsOccupied Then
                tiles(x, y).MoveCreature()
            End If
        Next
    Next

当你找到被占用的单元格时你不会退出函数,这取决于你移动的方向tiles(x, y).IsOccupied在方法完成和myMap.ShowMap()被调用之前再次为真。它对我来说也看起来效率很低 - 你为什么不跟踪生物的当前位置而不是遍历整个网格,例如在生物对象内?

【讨论】:

  • 这很有帮助,谢谢我意识到我错过了实际检查生物是否已经移动的代码,因此我将其放入并修复。至于追踪生物,我想不出一种我知道的有效方法,我想如果我只是循环穿过网格,当我有 100 个生物时,我就不必追踪所有的生物了.但是,如果使用 100 个(或更多)生物这样做会更有效,我会进一步研究。
猜你喜欢
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多