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
この作業を取得するには、単にセルB1の背景が白、セルA1の背景を黒にし、その後、範囲C2のいくつかの黒の背景を追加します。AM20をしてActionLogicメソッドを実行します。
他のヒント
は、Googleを通じて多くの例を見つけることができます。
非常に最初の結果は、循環参照数式や反復(関与なしVBA)について教えるためにライフゲームを使用していますデビッド・ゲイナーさんのブログからの投稿です。
2 つのマクロが必要になります。最初のものは、セルが正方形になるようにゲームシートをフォーマットする必要があります。
ユーザーにこのマクロを実行してもらいます。その後、生きているセルごとに 1 を入力する必要があります。条件付き書式を使用してセルを完全に黒にします (値 != 0 の場合、背景 = 黒)。
次に、バックグラウンド シート (別のシート) で次のステップを計算する 2 番目のマクロを作成します。相対セル位置 (ActiveCell を基準とした) と 2 つのネストされたループを使用します。これが完了したら、すべての値を背景シートからゲーム シートにコピーします。
それを検索し、そのコードを見て。人々が充実していますが、それExcelで完全なゲームを作るために趣味なりました。
なぜあなたは、Excelが間違った選択であると言うのですか?
私は、Excelは、この問題を解決するための最良の方法だと思います:
Excelは、1行でこれを解決します。 IF(OR(SUM(B2:D4)-C3 = 3、AND(SUM(B2:D4)-C3 = 2、C3 = 1))、1,0)
※上記は、セルC3のための次世代の値を返す式である。
ここでのデモです: https://docs.google.com/open?id=0B4FcWULw3iQidlZSdG9GRDh0TXMする
あなたは最初から物事のこの種を実装する必要が状況にいる場合は、、その後、関数型プログラミングは行くための最良の方法です。そうでない場合、Excelは本当によく働きます。どうして? Excelは純関数のみを入力するように強制するシステムであるため。あなたは人生のこのゲームをシミュレートするための鍵は、セルの各状態が以前の状態のPURE FUNCTIONであることを認識することがある、参照してください。 Excelが自然にあなたがこの方法を考えることを強制します。
Excelの循環参照に別のチュートリアルでは、ここで見つけることができます:<のhref = "http://chandoo.org/wp/2009/01/08/timestamps-excel-formula-help/" のrel = "nofollowをnoreferrer 「> http://chandoo.org/wp/2009/01/08/timestamps-excel-formula-help/ の
この1つはあなたが循環参照を使用してタイムスタンプを挿入する方法について説明します。
Excelは間違いなく、この種の問題のために間違った選択です。それは可能でしょうかに関しては:まず、その後の人生のとのゲームについて学びます< href = "http://en.wikipedia.org/wiki/Visual_Basic" のrel = "nofollowをnoreferrer"> Excelで使用するためのVisual Basicするます。