Kennen Sie das Spiel der dreidimensionalen vier Augen? Versuchen Sie es mit Google Irgendwie verstehen Sie Wie Sie sehen können, handelt es sich um eine vieräugige Anordnung in einem 4x4x4-Raum. Ich habe dies mit einem leichten Gefühl auf 4 Dimensionen erweitert, deshalb möchte ich darüber schreiben.
Ich habe so etwas gemacht.
Ich habe es auf einem iPad mit Pythonista 3 erstellt, auf dem Python unter iOS ausgeführt wird.
――Spielen Sie mit der 4. Dimension 4 ..
Ich werde es vorerst in GitHub erwähnen, aber da die Umgebung begrenzt ist, werde ich die spezifische Implementierung der Benutzeroberfläche nicht diskutieren.
Da die Anzahl der Kombinationen beim Versuch, ernsthaft zu aggregieren, sehr groß ist, habe ich beschlossen, alle Sequenzen nach dem folgenden Verfahren abzudecken.
Zum Beispiel
--x Achse → $ (1, 0, 0, 0) $ --Diagonale Linie der y-z-Ebene → $ (0, \ pm1, 1, 0) $ --x-z-w Diagonale Würfellinie → $ (\ pm1, 0, \ pm1, 1) $ --Diagonale Linie des Superwürfels → $ (\ pm1, \ pm1, \ pm1, 1) $
Es ist wie (alle mehreren Probleme sind optional).
Beim eindimensionalen Scannen sollte die Achse von $ (1, 0, 0, 0) $ verschoben werden
for i in range(4):
_aggregate([[1, 0, 0, 0][i:]+[1, 0, 0, 0][:i]])
Wenn ja, ist es OK.
(_Aggregate
ist eine Funktion, die nach 2 erscheint)
Das Scannen in zwei oder mehr Dimensionen macht die Lesbarkeit traurig, wenn eine einheitliche Implementierung verwendet wird. Deshalb habe ich alle Muster aufgegeben und geschrieben. Ich habe "itertools.product" verwendet, das das direkte Produkt zurückgibt, um das Mehrfachproblem optional zu machen. Für den x-z-w-Würfel können Sie beispielsweise vier Diagonalen darstellen, indem Sie "Produkt ([-1, 1], [0], [-1, 1], [1])" verwenden.
Wenn die Scanrichtung für eine Achse +1 ist, müssen die Startpunktkoordinaten 0 sein, um von 0 → 1 → 2 → 3 fortzufahren. Im Gegenteil, wenn es -1 ist, muss von 3 ausgegangen werden, um von 3 → 2 → 1 → 0 fortzufahren. Wenn es 0 ist, können alle 0, 1, 2, 3 möglich sein. Ich werde das gehorsam schreiben.
def start(val):
if val == 1:
return [0]
elif val == -1:
return [3]
else:
return range(4)
Scannt von allen möglichen Startpunkten in die angegebene Richtung. Der Ausgangspunkt besteht darin, alle Kombinationen aus mehreren für jede der vier Achsen aufzulisten. Es ist also wieder Zeit für "itertools.product". Insbesondere sieht es so aus
def _aggregate(vec):
for X, Y, Z, W in vec:
if (X, Y, Z, W) == (0, 0, 0, 0):
continue
for x, y, z, w in product(start(X), start(Y), start(Z), start(W)):
s = sum(
self.get_cell(x+X*i, y+Y*i, z+Z*i, w+W*i).player for i in range(4)
)
if s == 4:
self.black += 1
elif s == -4:
self.white += 1
Der Status jeder Zelle ist +1 für ●, -1 für ○ und 0, wenn nichts platziert ist. Wenn Sie also alle addieren, können Sie sehen, dass sie vollständig sind.
Die CPU ist derzeit sehr einfach, wie zum Beispiel:
Wenn Sie in diesem Spiel zwei 3er gleichzeitig machen, gewinnen Sie, also gibt es Prozesse wie 3 und 4. (Wenn es mehrere Orte mit derselben Priorität gibt, wählen Sie sie zufällig aus.) Es ist stark für einen einfachen Algorithmus.
Wenn Sie Pythonista haben, spielen Sie bitte damit. Ich wäre dankbar, wenn mir jemand sagen könnte, dass es in eine andere Umgebung portiert wurde!
Recommended Posts