(Pour les débutants) Faisons Othello avec Python

salut! C'est cool! !!

Cette fois, je voudrais faire Othello avec Python.

(Ajout) (1) aléatoire n'était pas nécessaire. Je suis désolé. Les bibliothèques requises sont les suivantes. (1) random (2) numpy

(1) s'appelle une bibliothèque standard et est à l'origine intégré à Python, il n'est donc pas nécessaire d'installer pip.

Si numpy in (2) n'est pas installé,

Tapez l'invite de commande et essayez d'installer.

Lorsque la bibliothèque est prête, je voudrais entrer dans le programme principal d'Othello.

from numpy import zeros, where, float32

class othello:
    #constant(-En multipliant par 1, vous pouvez exprimer le basculement du noir au blanc et du blanc au noir.)
    white = 1.
    black = -1.
    empty = 0.
    edge = 8          #Nombre de côtés
    
    #Initialisation
    def __init__(self):
        self.board = zeros(self.edge**2, dtype=float32)     #0 au tableau(=self.empty)Initialiser avec
        self.board[27] = self.board[36] = self.white           #Disposition initiale du cadre
        self.board[28] = self.board[35] = self.black            #Disposition initiale du cadre
        self.turn = True                             # white:True  black:False
        self.available = []                          #Un tableau contenant les coordonnées de l'endroit où vous pouvez retourner

    #Retournez s:Numéro de lieu ex:Si c'est vrai, retournez,Si faux, vérifiez simplement s'il peut être placé sans le retourner
    def over(self, s, ex=True):
        s = int(s)
        start = s
        my_color = self.white if self.turn else self.black      
        flag = False               #Indique s'il peut être placé dans s
        for i in range(-1, 2):
            for j in range(-1, 2):
                v = self.edge * i + j       #v est 8 directions(N'importe quel)Représente un passage à
                if v == 0:
                    continue
                s = start
                for k in range(self.edge - 1):
                    s += v                         #Ajouter la quantité de mouvement
                    if (s < 0 or s > self.edge**2 - 1 or self.board[s] == self.empty):   #S'il est hors du plateau ou vide, il ne peut pas être retourné dans cette direction.
                        break
                    if self.board[s] == my_color:                        #Si cela correspond à votre couleur
                        if k > 0:                                               # k=Quand c'est 0,Endroit où tu le mets(start)Puisqu'il s'agit d'un carré en contact avec, il n'y a pas de retournement
                            if ex:          
                                self.board[start + v: s : v] *= -1      #Effectuer le retournement
                            flag = True                                    #Si vous pouvez retourner ne serait-ce qu'une seule feuille, vous pouvez la mettre à cet endroit
                        break
                    if (((s % self.edge == 0 or s % self.edge == self.edge - 1) and abs(v) != self.edge)
                        or ((s // self.edge == 0 or s // self.edge == self.edge - 1) and abs(v) != 1)):
                        break
        if flag and ex:                   #Si vous pouvez mettre une pièce à l'endroit spécifié, mettez-la
            self.board[start] = my_color
        return flag

    #Jugement gagnant / perdant
    def judge(self):
        n_white = len(where(self.board == self.white)[0])     #Nombre de Shiraishi
        n_black = len(where(self.board == self.black)[0])      #Nombre de pierres noires
        print("\n", "noir>> ", n_black, "blanc>> ", n_white, "\n")     #Sortie du nombre de pierres
        if n_white < n_black:                   
            print("Noir gagne")
        elif n_black < n_white:
            print("Blanc gagne")
        else:
            print("dessiner")

    #Fonction de mise à jour
    def update(self, end=False):
        self.turn ^= True
        self.available = []                                             # self.Mettez les coordonnées qui peuvent être placées dans disponibles
        for i in range(self.edge**2):
            if self.board[i] == self.empty and self.over(i, ex=False):
                self.available.append(i)
        if len(self.available) == 0:           
                return False if end else self.master(end=True)           #Si vous ne pouvez pas le mettre deux fois de suite, le jeu se termine
        self._input()
        return True
    
    #contribution(CUI)
    def _input(self):
        while True:
            msg = "Virage blanc" if self.turn else "Tour noir"         
            x, y = map(int, input(msg + "Spécification de la matrice>> ").split())
            if 8 * x + y in self.available:                     #Lorsque l'endroit où la pierre peut être placée est entré
                self.over(8 * x + y)                            #Le processus de retournement
                break
            print("---Invalid Position---")                    #Message d'avertissement lorsqu'un endroit où les pierres ne peuvent pas être placées est entré

    #Dessin de planche(CUI)
    def draw(self):
        edge = self.edge
        print("\n    0  1  2  3  4  5  6  7")
        for i in range(edge):
            temp = []
            temp.append(str(int(i)))
            for el in self.board[edge * i:edge * (i + 1)]:
                if el == self.white:
                    temp.append("○")
                elif el == self.black:
                    temp.append("●")
                else:
                    temp.append("+")
            print(" ".join(temp))            

#Fonction principale
def main():
    s = othello()                #Génération d'instances d'Othello
    flag = True                  #Drapeau indiquant si le jeu continue(True:En cours, False:Fin)
    while flag:
        s.draw()                  #Dessin de planche
        flag = s.update()     #Fonction de mise à jour
    s.judge()                     #Jugement gagnant / perdant à la fin du jeu

if __name__ == "__main__":
    main()

(point important) (1) Dans la méthode over, le mot-clé argument ex est utilisé pour déterminer si la trame est effectivement retournée ou non. Le moment où vous n'avez pas à le retourner est celui où vous voulez savoir où placer les pièces à l'avance.

(2) Dans la méthode over, les coordonnées du tableau sont exprimées par l'index sur self.board au lieu du format matriciel. Soyez donc prudent avec les conversions de matrice et d'index. Par exemple, l'indice de i-by-j est i * self.edge + j.

Essayez de copier et d'exécuter ce programme. N'hésitez pas à nous contacter si vous rencontrez des problèmes.

Recommended Posts

(Pour les débutants) Faisons Othello avec Python
Faisons Othello avec wxPython
Faisons une interface graphique avec python.
Faisons l'IA d'Othello avec Chainer-Part 1-
Faisons un graphe avec python! !!
Faisons l'IA d'Othello avec Chainer-Part 2-
INSÉRER dans MySQL avec Python [Pour les débutants]
Faisons un jeu de shiritori avec Python
Mettons ensemble Python pour les super débutants
Faisons la voix lentement avec Python
[Python] Rendons matplotlib compatible avec le japonais
[Python] Lire des images avec OpenCV (pour les débutants)
Création WebApi avec Python (création CRUD) Pour les débutants
Créez un framework Web avec Python! (1)
Faisons un bot Twitter avec Python!
Créez un framework Web avec Python! (2)
[Pour les débutants] Essayez le web scraping avec Python
Manuel python pour les débutants
OpenCV pour les débutants en Python
Raisonnement causal et recherche causale par Python (pour les débutants)
~ Conseils pour les débutants de Python donnés avec amour par Pythonista ① ~
Remplaçons UWSC par Python (5) Faisons un robot
Faisons un module pour Python en utilisant SWIG
Comment rendre le Python des débutants plus rapide [numpy]
~ Conseils pour les débutants de Python donnés avec amour par Pythonista ② ~
[Introduction pour les débutants] Manipuler MySQL avec Python
Janken Poi avec Python Exécutons sur un serveur local Windows pour les débutants
Analysons les données Covid-19 (Corona) en utilisant Python [Pour les débutants]
Flux d'apprentissage pour les débutants en Python
[Jouons avec Python] Créer un livre de comptes de ménage
Essayez de créer un jeu simple avec Python 3 et iPhone
Créez Puyopuyo AI avec Python
Construction de l'environnement Python3 (pour les débutants)
Python #function 2 pour les super débutants
Faites une loterie avec Python
Écrivons python avec cinema4d.
Grammaire de base Python pour les débutants
Pandas 100 coups pour les débutants en Python
Python #function 1 pour les super débutants
#List Python pour les super débutants
~ Conseils pour les débutants de Python présentés avec amour par Pythonista ③ ~
Construisons git-cat avec Python
[Super facile] Faisons un LINE BOT avec Python.
Othello fait avec python (comme GUI)
❤️ Blogueurs ❤️ "Beloved BI" ❤️ Commençons ❤️ (pour ceux qui peuvent créer des graphiques avec Python)
Créons un client de socket Web avec Python. (Authentification par jeton d'accès)
[Pour les débutants] Résumé de l'entrée standard en Python (avec explication)
Expérimentez pour créer un PDF indépendant pour Kindle avec Python
Résoudre les problèmes d'AtCoder Boot camp pour les débutants (moyen 100) avec python
Créez un bot LINE avec Python + heroku
Créer Apache Log CSV avec Python
Exercices Python pour les débutants # 2 [pour instruction / instruction while]
Python pour les super débutants Super débutants Python # dictionnaire type 1
Premiers pas avec Python pour les classes PHPer
Faisons une rupture de bloc avec wxPython
Python #index pour les super débutants, tranches
Jouons avec Excel avec Python [Débutant]
Développement de jeux Othello avec Python
Créer un système de recommandation avec python
<Pour les débutants> bibliothèque python <Pour l'apprentissage automatique>
Faisons du scraping d'images avec Python