Connaissez-vous le jeu des quatre yeux en trois dimensions? Essayez google Vous avez compris Comme vous pouvez le voir, il s'agit d'un arrangement à quatre yeux dans un espace 4x4x4. J'ai étendu cela à 4 dimensions avec une sensation de facilité, alors je voudrais écrire à ce sujet.
J'ai fait quelque chose comme ça.
Je l'ai créé sur un iPad en utilisant Pythonista 3 qui exécute Python sur iOS.
――Jouez avec 4ème dimension 4ème --Maintenir la carte (pas réinitialisée même lorsqu'elle est fermée)
Pour le moment, je vais le mentionner dans GitHub, mais comme l'environnement est limité, je ne parlerai pas de l'implémentation spécifique de l'interface utilisateur.
Comme le nombre de combinaisons est énorme lorsque l'on essaie d'agréger sérieusement, j'ai décidé de couvrir toutes les séquences par la procédure suivante.
Par exemple
--x axe → $ (1, 0, 0, 0) $
C'est comme (tous les problèmes multiples sont facultatifs).
Dans le balayage unidimensionnel, l'axe de $ (1, 0, 0, 0) $ doit être décalé, donc
for i in range(4):
_aggregate([[1, 0, 0, 0][i:]+[1, 0, 0, 0][:i]])
Si c'est le cas, tout va bien.
(_Aggregate
est une fonction qui apparaît après 2)
La numérisation en deux dimensions ou plus rend la lisibilité triste si une implémentation unifiée est utilisée, j'ai donc abandonné et écrit tous les modèles.
J'ai utilisé ʻitertools.productqui renvoie le produit direct pour rendre le problème multiple facultatif. Par exemple, pour le cube x-z-w, vous pouvez représenter quatre diagonales en utilisant
product ([-1, 1], [0], [-1, 1], [1])`.
Si la direction de balayage est +1 pour un axe, les coordonnées du point de départ doivent être 0 afin de procéder de 0 → 1 → 2 → 3. Au contraire, s'il vaut -1, il faut partir de 3 pour procéder de 3 → 2 → 1 → 0. Si c'est 0, alors 0, 1, 2, 3 peuvent tous être possibles. J'écrirai ceci docilement.
def start(val):
if val == 1:
return [0]
elif val == -1:
return [3]
else:
return range(4)
Balaye dans la direction spécifiée à partir de tous les points de départ possibles. Le point de départ est d'énumérer toutes les combinaisons parmi plusieurs pour chacun des quatre axes, ainsi ʻitertools.product` entre à nouveau en jeu. Plus précisément, cela ressemble à ceci
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
L'état de chaque cellule est +1 pour ●, -1 pour ○ et 0 si rien n'est placé, donc si vous les ajoutez toutes ensemble, vous pouvez voir qu'elles sont complètes.
Le CPU est actuellement très simple, tel que:
Dans ce jeu, si vous faites deux 3 en même temps, vous gagnez, il y a donc des processus comme 3 et 4. (S'il y a plusieurs endroits avec la même priorité, sélectionnez-les au hasard) C'est fort pour un algorithme simple.
Si vous avez Pythonista, veuillez jouer avec. Je serais reconnaissant si quelqu'un pouvait me dire qu'il a été porté dans un autre environnement!
Recommended Posts