Excel에서 인생 게임을 어떻게 만들 수 있나요?[닫은]
-
21-08-2019 - |
문제
저는 Excel에서 매크로를 만드는 방법을 거의 모릅니다.
해결책
오래 전에이 일을 했어야했지만 여기에 Conway의 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 메소드를 실행하십시오.
다른 팁
Google을 통해 많은 예제를 찾을 수 있습니다.
첫 번째 결과는 David Gainer의 블로그의 게시물로 Conway의 Life Game of Life를 사용하여 순환 참조 공식 및 반복에 대해 가르치고 있습니다 (VBA 관련 없음).
http://blogs.office.com/2007/11/02/iteration-conways-game-of-life
두 개의 매크로가 필요합니다.첫 번째는 게임 시트의 형식을 지정하여 셀이 정사각형이 되도록 해야 합니다.
사용자에게 이 매크로를 실행하도록 하세요.그 후에는 살아있는 각 세포에 대해 1을 입력해야 합니다.조건부 서식을 사용하여 셀을 완전히 검은색으로 바꿉니다(값이 != 0인 경우 배경 = 검은색).
이제 배경 시트(다른 시트)에서 다음 단계를 계산하는 두 번째 매크로가 있습니다.상대 셀 위치 지정(ActiveCell 기준)과 두 개의 중첩 루프를 사용합니다.이 작업이 완료되면 배경 시트의 모든 값을 게임 시트에 복사합니다.
그것을 검색하고 그들의 코드를보십시오. 많은 사람들이 Excel에서 전체 게임을하는 것을 취미로 만들었습니다.
왜 Excel이 잘못된 선택이라고 말합니까?
Excel이 이것을 해결하는 가장 좋은 방법이라고 생각합니다.
Excel은 이것을 1 라인으로 해결합니다 : if (sum (sum (b2 : d4) -c3 = 3 및 (sum (sum (b2 : d4) -c3 = 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/
이것은 원형 참조를 사용하여 타임 스탬프를 삽입하는 방법을 설명합니다.