我只知道如何在Excel中制作宏。
答案 0 :(得分:5)
您可以通过Google找到许多示例。
第一个结果是来自David Gainer博客的帖子,该博客使用Conway的生命游戏来教授循环参考公式和迭代(不涉及VBA):
http://blogs.office.com/2007/11/02/iteration-conways-game-of-life
答案 1 :(得分:4)
很久以前应该这样做了,但这是我的版本Conway's Life in 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方法。
答案 2 :(得分:3)
您需要两个宏。第一个应该格式化游戏表,以便单元格是正方形。
让用户运行此宏。之后,她应该为每个活着的细胞输入1。使用条件格式将单元格完全变为黑色(背景=黑色,如果值!= 0)
现在有第二个宏来计算背景表中的下一步(另一张表)。使用相对单元格定位(相对于ActiveCell)和两个嵌套循环。完成后,将所有值从背景表复制到游戏表。
答案 3 :(得分:0)
搜索并查看他们的代码。很多人都把在Excel中制作完整游戏变成了一个爱好。
答案 4 :(得分:0)
为什么说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自然会迫使你这样思考。
答案 5 :(得分:-1)
另一篇关于excel循环引用的教程可以在这里找到:http://chandoo.org/wp/2009/01/08/timestamps-excel-formula-help/
这个解释了如何使用循环引用插入时间戳。
答案 6 :(得分:-2)
对于这类问题,Excel绝对是错误的选择。至于如何做到这一点:首先了解要在Excel中使用的game of life然后visual basic。