Grid 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
答案 0 :(得分:1)
从左到右检查前三列,然后从右到左检查最后三列:
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