¿Cómo puede hacer juego de la vida en Excel? [cerrado]
-
21-08-2019 - |
Pregunta
Sólo sé poco de cómo hacer que las macros en Excel.
Solución
Debería haber hecho esto hace mucho tiempo pero aquí está mi versión de la vida de Conway en Excel.
Aquí hay un truco del código. De ninguna manera es una solución perfecta (no pasamos una edad en esto) pero es posible que sea capaz de recoger algunos bits a cabo.
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
Para conseguir que esto funcionará igual que el fondo de la celda A1 negro, el fondo de la celda B1 blanca y luego añadir algunos fondos negros del rango C2:. AM20 y ejecutar el método de lógica de acción
Otros consejos
Usted puede encontrar muchos ejemplos a través de Google.
El primer resultado es un post del blog de David Gainer que utiliza Juego de la vida para enseñar acerca de las fórmulas de referencia circular y iteración (sin VBA involucrados):
http://blogs.office.com / 2007/11/02 / iteración-Conways-juego-de-vida
Se necesitan dos macros. El primero debe formatear la hoja de juego por lo que las células son cuadrados.
Haga que el usuario ejecute esta macro. Después de que ella debe entrar en un 1 por cada célula que está vivo. Utilizar el formato condicional para activar la célula completamente negro (fondo negro si el valor =! = 0)
tienen ahora una segunda macro que calcula el siguiente paso en una hoja de fondo (otra hoja). Utilice posicionamiento relativo de células (en relación con ActiveCell) y dos bucles anidados. Cuando se hace esto, copiar todos los valores de la hoja de fondo a la hoja de juego.
Buscar y ver su código. Un montón de gente ha hecho que sea un hobby para hacer juegos completos en Excel.
¿Por qué dice Excel es la decisión equivocada?
Creo Excel es la mejor manera de resolver esto:
Excel resuelve esto con 1 línea: IF (OR (SUM (B2: D4) C3 = 3, Y (SUM (B2: D4) C3 = 2, C3 = 1)), 1,0)
* donde el anterior es una expresión que devuelve el valor siguiente generación para la celda C3.
Aquí está la demostración: https://docs.google.com/open?id=0B4FcWULw3iQidlZSdG9GRDh0TXM
Si estás en una situación en la que hay que poner en práctica este tipo de cosas a partir de cero, entonces la programación funcional es el mejor camino a seguir. De lo contrario, Excel funciona muy bien. ¿Por qué? Debido a que Excel es un sistema que te obliga a entrar en funciones sólo puros. Usted ve, la clave para la simulación de este juego de la vida es darse cuenta de que cada estado de las células es una pura función del estado anterior. Excel, naturalmente obliga a pensar de esta manera.
otro tutorial sobre referencias circulares en Excel se puede encontrar aquí: http://chandoo.org/wp/2009/01/08/timestamps-excel-formula-help/
éste se explica cómo se puede insertar marcas de tiempo usando las referencias circulares.
Excel es definitivamente la elección equivocada para este tipo de problema. En cuanto a cómo sería posible: En primer lugar aprender sobre la de vida y luego < a href = "http://en.wikipedia.org/wiki/Visual_Basic" rel = "nofollow noreferrer"> visual básica para usar en Excel.