كيف يمكنك ان تجعل لعبة الحياة في Excel؟ [مغلق]
-
21-08-2019 - |
سؤال
وأنا أعرف فقط قليلا كيفية جعل وحدات الماكرو في 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 / التكرار-كونواي لعبة-من-الحياة
وسوف تحتاج اثنين من وحدات الماكرو. أول واحد يجب تنسيق ورقة اللعبة حتى الخلايا هي مربع.
هل لديك للمستخدم تشغيل هذا الماكرو. بعد ذلك أنها ينبغي إدخال 1 لكل خلية التي هي على قيد الحياة. استخدام التنسيق الشرطي لتحويل الخلية سوداء تماما (الخلفية = أسود إذا كانت القيمة! = 0)
وديك الآن ماكرو الثاني الذي يحسب الخطوة التالية في ورقة الخلفية (ورقة أخرى). استخدام المواقع النسبي الخلية (نسبة إلى ActiveCell) واثنين من حلقات متداخلة. عندما يتم ذلك، نسخ كافة القيم من ورقة خلفية ورقة اللعبة.
والبحث عن ذلك والنظر في مدوناتها. الكثير من الناس جعلت من هواية لجعل الألعاب الكاملة في 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 هو النظام الذي يجبرك على إدخال وظائف فقط نقية. ترى، والمفتاح لمحاكاة هذه لعبة الحياة هو أن ندرك أن كل دولة من الخلايا هي وظيفة بيور للدولة السابقة. تتفوق القوات بشكل طبيعي لك أن تفكر بهذه الطريقة.
وآخر تعليمي على المراجع الدائرية في التفوق ويمكن الاطلاع هنا: <لأ href = "http://chandoo.org/wp/2009/01/08/timestamps-excel-formula-help/" يختلط = "نوفولو noreferrer "> http://chandoo.org/wp/2009/01/08/timestamps-excel-formula-help/
وهذا واحد يشرح كيف يمكنك إدراج الطوابع الزمنية باستخدام مراجع دائرية.
والتفوق هو بالتأكيد خيار خاطئ لهذا النوع من مشكلة. أما كيف سيكون من الممكن: أولا التعرف على الحياة ثم < وأ href = "http://en.wikipedia.org/wiki/Visual_Basic" يختلط = "نوفولو noreferrer"> البصرية الأساسية للاستخدام في Excel.