Comment pouvez-vous faire du jeu de la vie dans Excel? [fermé]
-
21-08-2019 - |
Question
Je sais que peu comment faire des macros dans Excel.
La solution
aurait dû le faire depuis longtemps, mais voici ma version de la vie de Conway dans Excel.
Voici un hack du code. Pas une solution parfaite (n'a pas passé un âge à ce sujet), mais vous pourriez être en mesure de choisir quelques morceaux sur.
Private arrGrid(100, 100) As Boolean
Private arrGridNextGeneration(100, 100) As Boolean
Private Sub PopulateParentArrayData()
For k = 1 To Sheet1.Range("C2:AM20").Cells.Count
If Sheet1.Range("C2:AM20").Cells(k).Interior.Color = Sheet1.Range("A1").Interior.Color Then
arrGrid(Sheet1.Range("C2:AM20").Cells(k).Row, Sheet1.Range("C2:AM20").Cells(k).Column) = True
Else
arrGrid(Sheet1.Range("C2:AM20").Cells(k).Row, Sheet1.Range("C2:AM20").Cells(k).Column) = False
End If
DoEvents
Next
End Sub
Private Sub ApplyParentArrayData()
For k = 1 To Sheet1.Range("C2:AM20").Cells.Count
If arrGrid(Sheet1.Range("C2:AM20").Cells(k).Row, Sheet1.Range("C2:AM20").Cells(k).Column) Then
Sheet1.Range("C2:AM20").Cells(k).Interior.Color = Sheet1.Range("A1").Interior.Color
Else
Sheet1.Range("C2:AM20").Cells(k).Interior.Color = Sheet1.Range("B1").Interior.Color
End If
DoEvents
Next
End Sub
Private Sub ApplyNextGenerationArrayData()
For k = 1 To Sheet1.Range("C2:AM20").Cells.Count
If arrGridNextGeneration(Sheet1.Range("C2:AM20").Cells(k).Row, Sheet1.Range("C2:AM20").Cells(k).Column) Then
Sheet1.Range("C2:AM20").Cells(k).Interior.Color = Sheet1.Range("A1").Interior.Color
Else
Sheet1.Range("C2:AM20").Cells(k).Interior.Color = Sheet1.Range("B1").Interior.Color
End If
DoEvents
Next
End Sub
Private Function GetNeighbourCount(ByVal pintRow As Integer, ByVal pintColumn As Integer) As Integer
Dim intCount As Integer
intCount = 0
For r = pintRow - 1 To pintRow + 1
For c = pintColumn - 1 To pintColumn + 1
If r <> pintRow Or c <> pintColumn Then
If arrGrid(r, c) Then
intCount = intCount + 1
End If
End If
Next c
Next r
GetNeighbourCount = intCount
End Function
Private Sub PopulateNextGenerationArray()
Dim intNeighbours As Integer
For r = 0 To 100
For c = 0 To 100
If r > Sheet1.Range("C2:AM20").Rows(0).Row Then
If r <= Sheet1.Range("C2:AM20").Rows(Sheet1.Range("C2:AM20").Rows.Count).Row Then
If c > Sheet1.Range("C2:AM20").Columns(0).Column Then
If c <= Sheet1.Range("C2:AM20").Columns(Sheet1.Range("C2:AM20").Columns.Count).Column Then
intNeighbours = GetNeighbourCount(r, c)
If arrGrid(r, c) Then
'A1 cell
If intNeighbours < 2 Or intNeighbours > 3 Then
arrGridNextGeneration(r, c) = False
Else
arrGridNextGeneration(r, c) = True
End If
Else
'B1 cell
If intNeighbours = 3 Then
arrGridNextGeneration(r, c) = True
Else
arrGridNextGeneration(r, c) = False
End If
End If
End If
End If
End If
End If
DoEvents
Next c
Next r
End Sub
Private Sub ActionLogic()
'Application.ScreenUpdating = False
PopulateParentArrayData
PopulateNextGenerationArray
ApplyNextGenerationArrayData
'Application.ScreenUpdating = True
End Sub
Pour que cela fonctionne juste faire l'arrière-plan noir cellule A1, l'arrière-plan blanc cellule B1, puis ajouter quelques arrière-plans noirs dans la gamme C2. AM20 et exécuter la méthode ActionLogic
Autres conseils
Vous pouvez trouver de nombreux exemples dans Google.
Le premier résultat est un post de blog de David Gainer qui utilise le jeu de la vie de Conway à enseigner sur les formules de référence circulaire et itération (pas VBA impliqué):
http://blogs.office.com / 2007/11/02 / itération-Conways-jeu-de-vie
Vous aurez besoin de deux macros. Le premier devrait formater la feuille de match pour que les cellules sont carrées.
Demandez à l'utilisateur d'exécuter cette macro. Après cela, elle doit entrer dans un 1 pour chaque cellule qui est vivant. Utilisez la mise en forme conditionnelle pour transformer la cellule complètement noir (fond noir = si la valeur! = 0)
maintenant avoir une deuxième macro qui calcule l'étape suivante dans une feuille de fond (une autre feuille). Utiliser le positionnement relatif de cellules (par rapport au ActiveCell) et deux boucles imbriquées. Lorsque cela est fait, copier toutes les valeurs de la feuille de fond à la feuille de jeu.
Rechercher et regarder leur code. Beaucoup de gens ont fait un passe-temps pour faire des jeux complets dans Excel.
Pourquoi dites-vous Excel est le mauvais choix?
Je pense que Excel est la meilleure façon de résoudre ceci:
Excel résout ce avec 1 ligne: IF (OR (SUM (B2: D4) C3 = 3, et (SUM (B2: D4) C3 = 2, C3 = 1)), 1,0)
* où ci-dessus est une expression qui renvoie la valeur de la prochaine génération de la cellule C3.
Voici la démo: https://docs.google.com/open?id=0B4FcWULw3iQidlZSdG9GRDh0TXM
Si vous êtes dans une situation où vous devez mettre en œuvre ce genre de choses à partir de zéro, alors la programmation fonctionnelle est la meilleure façon d'aller. Sinon, Excel fonctionne très bien. Pourquoi? Parce que Excel est un système qui vous oblige à entrer uniquement des fonctions pures. Vous voyez, la clé pour simuler ce jeu de la vie est de se rendre compte que chaque état des cellules est une fonction PURE de l'état précédent. Excel oblige naturellement vous à penser de cette façon.
peut être trouvé un autre tutoriel sur les références circulaires dans Excel ici:
Excel est certainement le mauvais choix pour ce genre de problème. Quant à la façon dont il serait possible: d'abord apprendre davantage sur le de vie puis < a href = "http://en.wikipedia.org/wiki/Visual_Basic" rel = "nofollow noreferrer"> de base visuelle à utiliser dans Excel.