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