Глядя, чтобы решить бесконечный цикл - PullRequest
0 голосов
/ 16 сентября 2018

У меня есть фрагмент кода, который генерирует подземелье в Java и Python, но, кажется, создает бесконечный цикл в Visual Basic.Там может быть небольшая проблема, которую я пропускаю.

Dim Touching As Boolean = True
    While Touching = True
        Touching = False
        'Run through all the rooms and check if they overlap
        For i = 0 To numRooms
            Dim aPos As Point = RoomXY(i)
            Dim aDime As Point = RoomWH(i)
            For j = 0 To numRooms
                Dim bPos As Point = RoomXY(j)
                Dim bDime As Point = RoomWH(j)
                If (aPos = bPos) And (aDime = bDime) Then
                    Continue For
                Else

                    'Check for overlapping
                    Dim H_Overlaps As Boolean = (aPos.X <= bPos.X + bDime.X) And (bPos.X <= aPos.X + aDime.X)
                    Dim V_Overlaps As Boolean = (aPos.Y <= bPos.Y + bDime.Y) And (bPos.Y <= aPos.Y + aDime.Y)
                    If H_Overlaps AndAlso V_Overlaps Then
                        Touching = True
                        'Find the minimum amount of movment that stops the squares from touching
                        Dim dx = Math.Min(Math.Abs((aPos.X + aDime.X) - (bPos.X + 2)), Math.Abs(aPos.X - (bPos.X + bDime.X + 2)))
                        Dim dy = Math.Min(Math.Abs((aPos.Y + aDime.Y) - (bPos.Y + 2)), Math.Abs(aPos.Y - (bPos.Y + bDime.Y + 2)))
                        If dx <= dy Then
                            dy = 0
                        Else
                            dx = 0
                        End If
                        If aPos.X >= bPos.X Then
                            RoomXY(i) = New Point(RoomXY(i).X + (dx / 2), RoomXY(i).Y)
                            RoomXY(j) = New Point(RoomXY(j).X - (dx / 2), RoomXY(j).Y)
                        Else
                            RoomXY(i) = New Point(RoomXY(i).X - (dx / 2), RoomXY(i).Y)
                            RoomXY(j) = New Point(RoomXY(j).X + (dx / 2), RoomXY(j).Y)
                        End If
                        If aPos.Y >= bPos.Y Then
                            RoomXY(i) = New Point(RoomXY(i).X, RoomXY(i).Y + (dy / 2))
                            RoomXY(j) = New Point(RoomXY(j).X, RoomXY(j).Y - (dy / 2))
                        Else
                            RoomXY(i) = New Point(RoomXY(i).X, RoomXY(i).Y - (dy / 2))
                            RoomXY(j) = New Point(RoomXY(j).X, RoomXY(j).Y + (dy / 2))
                        End If


                    End If
                End If

            Next

        Next

    End While

Эта часть кода имеет размеры помещения, проверяет, не перекрываются ли они, а затем смещает их друг от друга.Я перепробовал все, но не могу разорвать бесконечный цикл.

...