你如何在Excel中制作生命游戏?

时间:2009-02-04 15:28:42

标签: excel conways-game-of-life

我只知道如何在Excel中制作宏。

7 个答案:

答案 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中制作完整游戏变成了一个爱好。

Ex:http://www.geocities.jp/nchikada/pac/

答案 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