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
je ne suis pas sûr que cela résoudrait le problème en ayant deux colonnes vides? – PeanutPower
@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
merci je vais essayer, mon cerveau ne fonctionne pas bien aujourd'hui. à votre santé – PeanutPower