2D-массив VB, возможно, не возвращает правильное значение/нужна помощь в подсчете количества логических значений в 2D-массиве

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

Module Module1

Dim ScreenHeight As Integer = 30
Dim ScreenWidth As Integer = 30
Dim Field(ScreenWidth - 1, ScreenHeight - 1) As Boolean
Dim FieldBuffer(ScreenWidth - 1, ScreenHeight - 1) As Boolean

Sub Main()
    Console.SetWindowSize(ScreenWidth, ScreenHeight)
    Field(10, 9) = True
    Field(10, 10) = True
    Field(10, 11) = True


    While True

        Dim x = 0
        While (x < ScreenWidth)
            Dim y = 0
            While (y < ScreenHeight)
                Console.SetCursorPosition(x, y)

                If ((x <> 0 And x <> ScreenWidth - 1) And (y <> 0 And y <> ScreenWidth - 1)) Then

                    Dim count = Field(x + 1, y) + Field(x - 1, y) + Field(x, y + 1) + Field(x, y - 1) _
                        + Field(x + 1, y + 1) + Field(x - 1, y - 1) + Field(x - 1, y + 1) + Field(x + 1, y - 1)

                    count = count * -1
                    If (Field(x, y) = True) Then

                        If (count < 2) Then
                            FieldBuffer(x, y) = False
                        End If
                        If (count > 3) Then
                            FieldBuffer(x, y) = False
                        End If
                        If (count = 3 Or count = 2) Then
                            FieldBuffer(x, y) = True
                        End If


                        Console.BackgroundColor = ConsoleColor.Blue
                    Else

                        If (count = 3) Then
                            FieldBuffer(x, y) = True
                        End If

                        Console.BackgroundColor = ConsoleColor.Black
                    End If

                    Console.Write(count)
                Else
                    Console.BackgroundColor = ConsoleColor.Red
                    Console.Write("X")
                End If


                y += 1
            End While
            x += 1
        End While

        Console.ReadKey()
        Field = FieldBuffer
    End While



End Sub

End Module

Код, который получает значения окружающих ячеек:

Dim count = Field(x + 1, y) + Field(x - 1, y) + Field(x, y + 1) + Field(x, y - 1) _
+ Field(x + 1, y + 1) + Field(x - 1, y - 1) + Field(x - 1, y + 1) + Field(x + 1, y - 1)
count = count * -1

Для первой итерации программы он возвращает правильные значения для структуры ячеек в массиве Field. Но на второй итерации после применения правил возвращаются не правильные значения, которые должны быть: 12321 11211 12321

Правила применяются к массиву правильно, потому что после первой итерации отображаемая структура является правильной. Эта ошибка также появлялась при наличии «Если (Поле (x, y) = true), то Count + = 1» для каждой позиции, окружающей ячейку.

Любая помощь будет оценена по достоинству, так как эта ошибка сводит меня с ума уже около 2 недель.


person SoggyKiwi    schedule 14.03.2016    source источник


Ответы (1)


Ваши правила неверны.

' Any live cell with two or three neighbours lives
' Any dead cell with exactly three live
If count = 3 Then ' If (count = 3 Or count = 2) Then
    FieldBuffer(x, y) = True
End If

Вы также копируете ссылку. Это означает, что при втором проходе Field и FieldBuffer одинаковы.

Field = FieldBuffer

Вам нужно скопировать каждый элемент. Используйте цикл, например Array.Copy или другие методы.

person the_lotus    schedule 14.03.2016