你怎么可以让生命游戏中的Excel?[关闭]
-
21-08-2019 - |
题
我知道只有一点如何使宏在Excel中。
解决方案
应该有一个很久以前做这一点,但这里是我的康威的生命在Excel的版本。
下面是代码的黑客攻击。绝不是一个完美的解决方案(没有花这个年龄),但你也许可以挑选一些出来的位
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
要得到这个工作只是使细胞A1黑色的背景,单元B1的背景白,然后添加在范围C2一些黑色背景:AM20和运行ActionLogic方法
其他提示
您可以通过谷歌找到许多例子。
在第一个结果是从大卫获得者的博客中使用康威生命游戏教约圆形参考公式和迭代(没有VBA参与):
您将需要两个宏。因此所述细胞是正方形第一个应该格式化游戏片。
让用户运行此宏。之后,她应该还活着,每个单元格中输入1。使用条件格式打开细胞完全黑色(背景=黑色如果值!= 0)
现在具有其计算在背景片(另一片)下一步骤的第二宏。使用相对定位细胞(相对于ActiveCell)和两个嵌套循环。当这样做时,从背景片到游戏片复制所有值。
搜索,并看看他们的代码。大量的人做了它的爱好充分的游戏在Excel中。
为什么这么说呢Excel是错误的选择?
我认为Excel是解决这个最好的方法:
Excel中解决了这个与1行: IF(OR(SUM(B2:D4)-C 3 = 3,以及(SUM(B2:D4)-C 3 = 2,C3 = 1)),1,0)
*其中以上是用于返回小区C3下一代值的表达式。
这里的演示: https://docs.google.com/open?id=0B4FcWULw3iQidlZSdG9GRDh0TXM
如果您在您必须实现这种从无到有的东西的情况是,那么函数式编程是最好的一段路要走。否则,Excel的作品真的很好。为什么?因为Excel是迫使你进入唯一的纯功能的系统。你看,关键要模拟人生的这场比赛是要认识到,细胞的每个状态是前状态的纯函数。 Excel中自然地迫使你有这样的想法。
另一教程圆引用excel可以在这里找到: http://chandoo.org/wp/2009/01/08/timestamps-excel-formula-help/
这一解释如何可以插入的时间戳使用圆形的参考。
Excel是绝对错误的选择,对于这样的一个问题。如何,这将是可能的:第一个了解 游戏人生 然后 visual basic 使用Excel。