繁体   English   中英

基于网格的益智棋盘游戏块去除算法

[英]Grid based puzzle board game block removal algorithm

网格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

从左至右检查前三列,然后从右至左检查后三列:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM