首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一种基于网格的益智棋盘游戏分块算法

一种基于网格的益智棋盘游戏分块算法
EN

Stack Overflow用户
提问于 2010-01-27 07:04:43
回答 1查看 1.2K关注 0票数 0

Grid http://www.imagechicken.com/uploads/1264550987064245200.png

我有一个由一维整数数组表示的"samegame“网格。0到63表示8x8栅格。

规则是,两个或更多的相同颜色的块可以通过单击它们来删除。然后,积木从上面滑下来。如果一列为空,则其他列将从侧面移入。

当有人单击底部一行的绿色块时,列应该从侧面滑入。黑线左侧的列向右滑动,黑线右侧的列向左滑动。因此,在这种情况下,在删除绿色块后,只有最右边的两列应该从右侧滑到黑线。

我遇到的问题是设计一个合适的算法来在移除后进行折叠。

我目前的方法是从左到右测试每一列,看看它是否为空。如果它是空的,那么我将向左(如果在黑线的左边)或向右(如果在黑线的右边)的任何列滑动到空白列上,并在我要滑动的直接列中重复此操作。

问题是,当两列为空时,这种方法会失败,因为第二个空列滑过第一列,然后例程从下一列继续执行,而不是将所有内容都拖过。

我想知道是否有比我正在采取的方法更简单的方法?

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-01-27 07:49:10

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

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2143376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档