2010-01-26 11 views
0

Grid http://www.imagechicken.com/uploads/1264550987064245200.pngretrait du bloc jeu de plateau de puzzle basé sur la grille de l'algorithme grille

J'ai un « de samegame » représenté par un tableau 1D d'entiers. 0 à 63 pour représenter une grille 8x8. Les règles sont que les mêmes blocs de couleur de deux ou plus peuvent être supprimés en cliquant dessus. blocs puis glisser vers le bas par le haut. Si une colonne est vide, les autres colonnes se déplacent depuis les côtés. Lorsque quelqu'un clique sur les blocs verts dans la rangée du bas, les colonnes doivent glisser des côtés. colonnes à gauche de la ligne noire glisser à droite et à droite de la ligne noire glisser à gauche. dans ce cas, seules les deux colonnes les plus à droite doivent glisser de la droite vers la ligne noire après avoir enlevé les blocs verts.

Le problème que j'ai est dans la conception d'un algorihm approprié pour faire l'effondrement après le retrait. Mon approche actuelle consiste à tester chaque colonne de gauche à droite pour voir si elle est vide. si elle est vide alors je glisse n'importe quelle colonne vers la gauche (si elle est à gauche de la ligne noire) ou vers la droite (si à droite de la ligne noire) sur la colonne vide et répète cela dans le direct je glisse de. Le problème est que cette approche échoue lorsque deux colonnes sont vides alors que la deuxième colonne vide glisse sur la première et ensuite sur la routine suivante de la colonne suivante plutôt que de tout mélanger. Je me demande s'il y a un moyen plus facile que l'approche que je prends?

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 

Répondre

1

Vérifiez les trois premières colonnes de gauche à droite, puis vérifiez les trois dernière colonne de droite à gauche:

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 
+0

je ne suis pas sûr que cela résoudrait le problème en ayant deux colonnes vides? – PeanutPower

+0

@Peanut: Il le fera. Le problème est que vous déplacez la deuxième colonne vide dans la colonne que vous avez déjà vérifiée. En cochant les colonnes dans l'autre direction, vous ne déplacerez rien dans une colonne déjà cochée. – Guffa

+0

merci je vais essayer, mon cerveau ne fonctionne pas bien aujourd'hui. à votre santé – PeanutPower