Алгоритм удаления блока настольной игры-головоломки - PullRequest
0 голосов
/ 27 января 2010

Сетка http://www.imagechicken.com/uploads/1264550987064245200.png

У меня есть сетка "Samegame", представленная одномерным массивом целых чисел.От 0 до 63 для представления сетки 8x8.

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

когда кто-то нажимает на зеленые блоки в нижнем ряду, столбцы должны скользить с боков.столбцы слева от черной линии скользят вправо, а справа от черной линии скользят влево.поэтому в этом случае только две самые правые колонки должны скользить справа от черной линии после удаления зеленых блоков.

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

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

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

Public Sub CollapseEmptyColumns()

        For x = 0 + 1 To 7 - 1
            Dim EmptyColumn As Boolean = True
            For y = 0 To 7

                Dim BlockIndex As Integer = y * 8 + x
                If Blocks(BlockIndex).BlockColor <> eBlockColor.None Then
                    EmptyColumn = False
                    Exit For
                End If

            Next

            If EmptyColumn = True Then

                If x < 4 Then ' less than 4 then slide from left

                    SlideColumns(x - 1, 0, 1)

                Else ' greater or equal to 4 slide from right

                    SlideColumns(x + 1, 7, -1)

                End If


            End If

        Next

    End Sub

    Private Sub SlideColumns(ByVal First As Integer, ByVal Last As Integer, ByVal Direction As Integer)

        For x = First To Last Step -Direction

            For y = 0 To 7

                Blocks(y * 8 + (x + Direction)).BlockColor = Blocks(y * 8 + x).BlockColor
                Blocks(y * 8 + x).BlockColor = eBlockColor.None

            Next

        Next

    End Sub

1 Ответ

1 голос
/ 27 января 2010

Проверьте первые три столбца слева направо, затем проверьте последние три столбца справа налево:

Private Function EmptyColumn(x As Integer) As Boolean
  For y As Integer = 0 To 7
    If Blocks(y * 8 + x).BlockColor <> eBlockColor.None Then
      Return False
    End If
  Next
  Return True
End Function

Public Sub CollapseEmptyColumns()
  For x = 1 To 3
    If EmptyColumn(x) Then
      SlideColumns(x - 1, 0, 1)
    End If
  Next
  For x = 6 to 4 Step -1
    If EmptyColumn(x) Then
      SlideColumns(x + 1, 7, -1)
    End If
  Next
End Sub
...