我知道只有一点如何使宏在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参与):

http://blogs.office.com / 2007/11/02 /迭代-conways游戏的寿命

您将需要两个宏。因此所述细胞是正方形第一个应该格式化游戏片。

让用户运行此宏。之后,她应该还活着,每个单元格中输入1。使用条件格式打开细胞完全黑色(背景=黑色如果值!= 0)

现在具有其计算在背景片(另一片)下一步骤的第二宏。使用相对定位细胞(相对于ActiveCell)和两个嵌套循环。当这样做时,从背景片到游戏片复制所有值。

搜索,并看看他们的代码。大量的人做了它的爱好充分的游戏在Excel中。

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

为什么这么说呢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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top