J'ai fait Othello pour enseigner Python3 aux enfants (5)

Expliquons la classe d'Othello Partie 2

Parlons des moisissures

Vous avez un groupe sanguin, non? Qu'il soit vrai ou non, comme le type A, le type B, le type O, le type AB, etc., le type a ses propres caractéristiques, comme "Un type qui est méticuleux" et "Un type qui est égoïste". Dans la programmation, les types sont utilisés pour faire des divisions importantes comme les groupes sanguins.

J'ai beaucoup parlé de ** variables ** jusqu'à présent, mais je n'ai pas osé mentionner les types. J'ai expliqué que le tableau est une classe appelée list (), et les variables du dictionnaire sont également une classe appelée dict (). Le type de données dans le programme, comme le groupe sanguin, représente la nature des données.

Nom du type de données Type de données La description
Chaîne str "lettre"Ou'lettre'
entier int +-Valeur numérique
Fraction flottante float +-Fraction flottante
Nombre imaginaire complex +-Partie réelle+-Nombre imaginaire部j
Authenticité bool Vrai ou faux
Date Heure datetime Date et l'heure
Liste (tableau) list Tableau quel que soit le type de données
Taple (séquence de référence) tuple Tableau quel que soit le type de données
Ensemble (tableau unique) set Tableau de blocs avec des données uniques et dans le désordre
Dictionnaire (tableau de keymap) dict Tableau de clés et de données

En Python, lors de l'utilisation de variables, les types sont attribués sans aucune considération particulière. C'est ce qu'on appelle le «typage dynamique». Par exemple, si vous écrivez ʻage = 12`, Python changera le type en int (). Pour connaître le type attribué, vous pouvez faire type (age) pour connaître le type attribué à la variable age. Comme je l'ai écrit la dernière fois, tous les types sont des classes qui incluent les fonctions requises pour gérer le type de données. S'il est affecté à un type non voulu, vous pouvez le spécifier explicitement avec float () etc. ou convertir le type.

Explication de la source du jeu Othello (2) Fonctions de la classe Othello

La saisie au clavier

La première est la fonction qui effectue la saisie au clavier. Affiche la chaîne passée en argument et attend la saisie au clavier. Si vous appuyez sur la touche Entrée vide ou entrez une valeur autre que 1 à 8, vous reviendrez à la saisie au clavier. Une fois que le nombre correct est entré, int () le convertit en ** entier **. Les valeurs importantes pour cette classe Othello sont les nombres 1 à 8 pour X et Y. Même s'il devient un Othello graphique et que l'emplacement est cliqué avec la souris, il peut être converti en interne aux coordonnées X et Y de 1 à 8 afin que les fonctions de la classe courante puissent être utilisées telles quelles.

    #contribution
    def ot_inputXY(self,otstr):
        while True:
            myXY = input(otstr)
            if myXY == "":
                continue
            if '1' <= myXY <= '8' :
                return int(myXY)

Fonctions gouvernant "C'est à votre tour" (chaînes de caractères et opérateurs ternaires)

La fonction ʻot_yourturn () ʻest une fonction qui affiche seulement "C'est la main de ●!" Ou le tour de quel joueur. Ce qui est affiché est une chaîne de caractères entre "~", mais ** "chaîne de caractères" ** est la classe de chaîne de caractères str () comme décrit ci-dessus, donc même une chaîne de caractères juste écrite comme "aiueo" str Les fonctions contenues dans la classe () peuvent être utilisées telles quelles.

Le {} et le format () décrits ici lors de l'utilisation du type chaîne sont des expressions très courantes, alors rappelez-les ici. {} Est appelé ** champ de remplacement ** et ainsi de suite. str (" Aka {} Tana ". format (" sa ") est une description pratique qui remplace l'intérieur de {} par les données spécifiées par la fonction format (). Dans Python 3.6 ou version ultérieure, le caractère f. Vous pouvez désormais placer des variables directement dans le champ de remplacement en tant qu'opération de colonne, améliorant ainsi la lisibilité.

    name = input("S'il vous plaît entrez votre nom=")
    print("Un homme courageux qui venait souvent{}Ouais! !! J'attendais que le héros détruise le roi démon!".format(name))
    # Python3.Après 6, il est pratique d'écrire comme suit!
    print(f"Un homme courageux qui venait souvent{name}Ouais! !! J'attendais que le héros détruise le roi démon!")

Dans ʻot_yourturn () ʻ dans la classe Othello actuelle, ● ou ○ est affiché parce que la variable ot_offdef qui stocke le déplacement actuel est spécifiée dans le champ de remplacement.

    #C'est ton tour
    def ot_yourturn(self):
        print("{}C'est ta main!".format(self.ot_offdef))

La fonction ʻot_changeturn () `est une fonction qui change le tour de l'attaquant.

    #C'est ton tour
    def ot_changeturn(self):
        #Stockez la pièce de l'attaquant
        self.ot_offdef = '●' if self.ot_offdef == '○' else '○'
        #Stocke la pièce opposée à l'attaquant
        self.ot_search = '●' if self.ot_offdef == '○' else '○'

Le programme est écrit comme un opérateur ternaire. C'est presque comme écrire une instruction IF avec une macro Excel, mais la logique ci-dessus et la logique ci-dessous sont exactement les mêmes. En écrivant «valeur lorsque la condition est remplie, si la condition vaut sinon, lorsque la condition n'est pas remplie», l'instruction if condition peut être stockée de manière concise sur une ligne. L'opérateur ternaire a pour effet de rafraîchir le programme en fonction de la façon dont il est écrit, mais il est recommandé de l'utiliser avec prudence car ce sera une source très illisible si elle est utilisée de force. Si vous trouvez cela difficile à comprendre, vous pouvez le remplacer par la source suivante.

    #C'est ton tour
    def ot_changeturn(self):
        #Stockez la pièce de l'attaquant
        if self.ot_offdef == '○':
            self.ot_offdef = '●'
        else:
            self.ot_offdef = '○'
        #Stocke la pièce opposée à l'attaquant
        if self.ot_offdef == '○':
            self.ot_search = '●'
        else:
            self.ot_search = '○'

Une fonction qui considère la prochaine action du jeu Othello

La fonction ʻOt_checkendofgame () `est un programme qui considère si le jeu Othello va se terminer. Veuillez vous référer au (2) de cette série d'articles pour l'opération.

Ce que nous faisons dans ce domaine est le suivant.

  1. Utilisez la fonction ʻot_canplacemypeace () `pour voir s'il y a un endroit pour placer la pièce de l'attaquant.
  2. Si la pièce de l'attaquant ne peut pas être placée ʻot_changeturn () `pour changer la pièce de l'attaquant au tour de l'adversaire
  3. Utilisez la fonction ʻot_canplacemypeace () `pour voir s'il y a un endroit pour placer la pièce de l'attaquant.
  4. S'il est déterminé qu'il n'y a pas de place pour mettre les deux, comparez les nombres de ● et ○ pour déterminer lequel a gagné ou nul, affichez le résultat et renvoyez 1 pour indiquer que le jeu se termine.
  5. S'il n'y a pas de place pour seulement l'attaquant dans 1. ci-dessus, le message "Cela passera au tour de l'adversaire" est affiché et -1 est retourné pour notifier ce fait.
  6. Si l'attaquant décide que la pièce peut être placée telle quelle, il renvoie 0 et le notifie.

Dans cette fonction, count (), qui s'appelle myot.ot_bit.count ('●'), est une fonction qui renvoie le nombre de données contenues dans le tableau de la classe list ().

    #Déterminez si c'est fini (changez le tour si vous ne pouvez tout simplement pas mettre votre main)
    def ot_checkendofgame(self):
        #Il n'y a pas de place pour mettre votre propre main, et vous ne pouvez pas mettre la main de votre adversaire
        if 0 > self.ot_canplacemypeace():
            self.ot_changeturn()
            if 0 > self.ot_canplacemypeace():
                bc = myot.ot_bit.count('●')
                wc = myot.ot_bit.count('○')
                if ( bc - wc ) > 0:
                    bws = "● Victoire"
                elif ( bc - wc ) < 0:
                    bws = "○ victoire"
                else:
                    bws = "dessiner"
                print("{}est. Je vous remercie pour votre travail acharné!".format(bws))
                return 1
            else:
                print("{}Il n'y a pas de place pour le mettre. Cela change au tour de l'adversaire! !!".format(self.ot_search))
                return -1
        else:
            return 0

Une fonction qui trouve tous les endroits qui peuvent être retournés

Le précédent ʻot_checkendofgame () a déterminé si le jeu était terminé, s'il y avait un endroit pour mettre votre main, ou sinon, s'il y avait un endroit pour mettre la main de votre adversaire. La fonction ʻot_canplacemypeace () pense" Y a-t-il un endroit pour mettre ma main? "

   #Découvrez s'il y a un endroit pour mettre la main
    def ot_canplacemypeace(self):
        for n in range(64):
            if self.ot_bit[n] != '・':
                continue
            for d in self.ot_direction:
                if 1 == self.ot_next_onepeace(int(n%8)+1,int(n/8)+1, d):
                    return 0
        #S'il n'y a pas de place pour en mettre un, je viendrai ici
        return -1

Voici ce que nous faisons:

  1. Sur le plateau 8x8, les endroits où les cadres sont déjà placés seront de plus en plus ignorés.
  2. S'il y a un endroit où le cadre n'est pas placé, convertissez cette position de 0 à 63 en coordonnées X et Y. La coordonnée X est une coordonnée X relative et la valeur divisée par 8 plus 1 est la coordonnée Y.
  3. Vérifiez dans toutes les directions (8 directions) si vous pouvez placer votre main aux positions converties des coordonnées X et Y (y a-t-il un endroit où vous pouvez retourner le cadre de l'adversaire?). Dans la partie de for d dans self.ot_direction:, la chaîne de clé indiquant la direction stockée dans le dictionnaire est stockée dans la variable d, qui est répétée le nombre de fois de la variable dictionnaire.
  4. Si un emplacement pour placer le cadre est trouvé, 0 est renvoyé pour notifier ce fait.
  5. S'il n'y a aucun endroit pour placer le cadre, renvoyez -1 pour le notifier.

Placer un cadre aux coordonnées X et Y spécifiées

Comme je l'ai dit la dernière fois, si vous mettez une pièce à l'endroit spécifié, vous devez juger si c'est un endroit où vous pouvez la mettre, et si vous pouvez la mettre, vous devez retourner la pièce de l'adversaire. Et si l'endroit où vous le mettez est un endroit où vous ne devriez pas le mettre en premier lieu, vous devez afficher ce fait.

    #Mettez votre main sur le plateau d'Othello
    def ot_place(self, ot_x, ot_y):
        ot_change = False
        for d in self.ot_direction:
            if 1 == self.ot_next_onepeace(ot_x,ot_y,d):
                self.ot_peace(ot_x,ot_y,self.ot_offdef)
                self.ot_changepeace(ot_x,ot_y,d)
                ot_change = True
        #Lorsqu'il n'y a pas de direction valide
        if not ot_change:
            print("{}Impossible de placer".format(self.ot_offdef))
            return -1
        #Affichez l'écran et changez votre main au tour de l'adversaire
        self.ot_display()
        self.ot_changeturn()
        return 0

Cette fonction est appelée lorsque vous essayez de placer un cadre dans un endroit prédéterminé. À l'emplacement spécifié, X et Y sont les coordonnées spécifiées par les valeurs 1 à 8 respectivement. Expliquons le programme de cette fonction.

  1. Initialisez ʻot_change` avec False comme variable indicateur pour savoir si une trame a été placée ou non. Ce sera Vrai si un cadre peut être placé.
  2. Répétez pendant quelques minutes (c'est-à-dire 8 directions) du tableau de ʻot_direction. La variable d contient la valeur clé de ʻot_direction.
  3. Appelez la fonction ʻot_next_onepeace () `pour voir si la direction actuelle peut être inversée, et si oui, jusqu'où elle peut être inversée. Une valeur de retour de 1 de la fonction indique que cette direction est une direction d'inversion.
  4. Appelez la fonction ʻot_peace () avec votre main dans le troisième argument pour placer votre cadre aux coordonnées spécifiées. La fonction ʻot_peace () est également une fonction qui renvoie une image aux coordonnées spécifiées si le troisième argument est omis. Si le troisième argument est spécifié, le cadre aux coordonnées spécifiées sera remplacé par le caractère spécifié.
  5. Appelez la fonction ʻot_changepeace () `pour le retourner à un point où il peut être retourné.
  6. Si vous pouvez placer un cadre, définissez l'indicateur ʻot_change` sur True. Si vous ne pouvez pas inverser les huit directions, il reste faux.
  7. Vérifiez si l'indicateur ʻot_change` est False lorsque vous quittez l'itération. Si elle est False, cela signifie que vous avez spécifié une coordonnée qui ne peut pas être placée en premier lieu, donc un message indiquant qu'elle ne peut pas être placée à cet emplacement s'affiche et vous revenez.
  8. Si le drapeau ʻot_change est Vrai à la sortie de l'itération, le processus de retournement a terminé la réécriture des données de la carte ʻot_bit, alors appelez la fonction ʻot_display () pour réafficher la carte. Appelez ensuite la fonction ʻot_changeturn () pour changer le tour de l'attaquant.

La prochaine fois, l'explication du programme sera la dernière!

La prochaine fois, j'expliquerai la fonction ʻot_next_onepeace () et la fonction ʻot_changepeace (), qui peuvent être les plus compliquées. Ces deux fonctions sont appelées fonctions récursives, qui sont les fonctions que vous vous appelez vous-même, je voudrais donc les expliquer.

À la prochaine! !!

c u

<< J'ai créé un Othello pour enseigner Python3 aux enfants (4) J'ai créé Othello pour enseigner Python3 aux enfants (6) >>

Recommended Posts

J'ai fait Othello pour enseigner Python3 aux enfants (4)
J'ai fait Othello pour enseigner Python3 aux enfants (2)
J'ai fait Othello pour enseigner Python3 aux enfants (5)
J'ai fait Othello pour enseigner Python3 aux enfants (3)
J'ai fait Othello pour enseigner Python3 aux enfants (1)
J'ai essayé de faire d'Othello pour enseigner Python3 aux enfants (6) Final
J'ai fait un générateur de mot de passe pour enseigner Python3 aux enfants (bonus) * Complètement refait
J'ai fait un blackjack avec du python!
J'ai créé un module Python pour traduire les commentaires
J'ai fait un texte Python
J'ai créé une bibliothèque python qui fait rouler le rang
J'ai fait un blackjack avec Python.
Othello fait avec python (comme GUI)
J'ai créé wordcloud avec Python.
J'ai créé un package pour filtrer les séries chronologiques avec python
J'ai fait une animation qui renvoie la pierre d'Othello avec POV-Ray
J'ai fait un Line-bot avec Python!
J'ai essayé de toucher Python (installation)
J'ai créé ma propre bibliothèque Python
Développement de jeux Othello avec Python
Je veux déboguer avec Python
J'ai créé un démon avec Python
J'ai créé une bibliothèque qui lit facilement les fichiers de configuration avec Python
J'ai essayé d'enseigner Python à des programmeurs inexpérimentés
J'ai essayé de résumer la gestion des exceptions Python
J'ai essayé d'implémenter PLSA en Python
J'ai essayé d'implémenter la permutation en Python
J'ai fait un programme de gestion de la paie en Python!
J'ai fait un compteur de caractères avec Python
J'ai installé Python 3.5.1 pour étudier l'apprentissage automatique
Entrée standard Python3 que j'ai essayé de résumer
Je veux utiliser jar de python
Je voulais résoudre ABC160 avec Python
Je veux créer un environnement Python
Je veux analyser les journaux avec Python
Je veux jouer avec aws avec python
J'ai essayé d'implémenter ADALINE en Python
Je voulais résoudre ABC159 avec Python
J'ai essayé d'implémenter PPO en Python
J'ai fait un script pour afficher des pictogrammes
J'ai fait une carte hexadécimale avec Python
[Python] J'ai essayé de calculer TF-IDF régulièrement
J'ai essayé de toucher Python (syntaxe de base)
Après avoir étudié Python3, j'ai créé un Slackbot
J'ai fait un jeu rogue-like avec Python
Ce que j'étais accro à Python autorun
Je voulais résoudre ABC172 avec Python
J'ai fait un simple blackjack avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait un simulateur de neurones avec Python
Ce que j'ai fait pour économiser la mémoire Python
Application Othello (application iOS) réalisée avec Python (Kivy)
J'ai créé un conteneur Docker pour utiliser JUMAN ++, KNP, python (pour pyKNP).
[Python] J'ai fait un décorateur qui ne semble pas avoir d'utilité.
J'ai créé un outil pour parcourir automatiquement plusieurs sites avec Selenium (Python)
Maintenance de l'environnement réalisée avec Docker (je souhaite post-traiter GrADS en Python
J'ai créé un script en python pour convertir des fichiers .md au format Scrapbox
J'ai fait un programme pour vérifier la taille d'un fichier avec Python