def tests_chaine():
    chaine_attendue = "0,0,jaune\n0,1,jaune\n0,2,jaune\n0,3,jaune\n0,4,jaune\n0,5,jaune\n"

    assert chaine_attendue == grille_colonne0_pleine().convertir_en_chaine(), \
        "Grille.convertir_en_chaine() devrait retourner une chaine contenant " + \
        "toutes les cases au format spécifié."

    grille_attendue = grille_colonne0_pleine().cases

    grille = Grille()
    grille.charger_dune_chaine(chaine_attendue)

    grille_retournee = grille.cases

    assert grilles_egales(grille_attendue, grille_retournee), \
        "Grille.charger_dune_chaine() devrait retourner une grille contenant " + \
        "toutes les cases contenues dans la chaîne."
Exemple #2
0
class PartieConnectFour:
    def __init__(self, nom_fichier=None):
        '''
        Méthode d'initialisation d'une partie.
        '''
        self.grille = Grille()

        self.gagnant_partie = None
        self.partie_nulle = False

        if nom_fichier is not None:
            self.charger(nom_fichier)
        else:
            self.initialiser_joueurs()

    def initialiser_joueurs(self):
        '''
        On initialise ici quatre attributs : joueur_jaune,
        joueur_rouge, joueur_courant et couleur_joueur_courant.

        joueur_courant est initialisé par défaut au joueur_jaune
        et couleur_joueur_courant est initialisée à "jaune".

        Pour créer les objets joueur, faites appel à
        creer_joueur().

        Pycharm vous sortira probablement des messages d'erreur à
        cette fonction car vous initialisez des attributs en
        dehors de la fonction __init__(), mais vous pouvez les
        ignorer.
        '''

        self.joueur_jaune = self.creer_joueur("jaune")

        self.joueur_rouge = self.creer_joueur("rouge")

        self.joueur_courant = self.joueur_jaune

        self.couleur_joueur_courant = "jaune"



    def creer_joueur(self, couleur):
        '''
        Demande à l'usager quel type de joueur ('Humain' ou
        'Ordinateur') il désire pour le joueur de la couleur en
        entrée.

        Tant que l'entrée n'est pas valide, on continue de
        demander à l'utilisateur.

        Faites appel à self.creer_joueur_selon_type() pour créer
        le joueur lorsque vous aurez le type.

        Args :
            couleur, la couleur pour laquelle on veut le type
                de joueur.

        Returns :
            Un objet Joueur, de type JoueurHumain
            si l'usager a entré 'Humain', JoueurOrdinateur s'il a
            entré 'Ordinateur'.
        '''


        choix_correct = False

        while choix_correct == False:
            demander_jouer = input("Quel type de joueur désirez-vous pour la couleur {}? Entrez Humain ou Ordinateur?  ".format(couleur))
            if demander_jouer == "Humain" or demander_jouer == "Ordinateur":
                choix_correct = True
                return self.creer_joueur_selon_type(demander_jouer,couleur)


    def creer_joueur_selon_type(self, type_joueur, couleur):
        '''
        Crée l'objet Joueur approprié, selon le type passé en
        paramètre.

        Pour créer les objets, vous n'avez qu'à faire appel à
        leurs constructeurs, c'est-à-dire à
        JoueurHumain(couleur), par exemple.

        Args :
            type, le type de joueur, "Ordinateur" ou "Humain"
            couleur, la couleur du pion joué par le jouer,
                "jaune" ou "rouge"

        Returns :
            Un objet JoueurHumain si le
            type est "Humain", JoueurOrdinateur sinon
        '''

        if type_joueur == "Humain":
            return JoueurHumain(couleur)
        if type_joueur == "Ordinateur":
            return JoueurOrdinateur(couleur)

    def jouer(self):
        '''
        Méthode représentant la boucle principale de jeu.

        Celle-ci fonctionne comme une boucle infinie. Pour chaque
        itération, on affiche la grille avec print(self.grille)
        et on joue un tour. Si la partie est terminée, on quitte
        la boucle. Sinon, on change de joueur.

        Quand on sort de la boucle principale, on fait le
        traitement de la fin de partie.

        Utilisez les fonctions partie_terminee(), jouer_tour(),
        changer_joueur() et traitement_fin_partie() pour vous
        faciliter la tâche.
        '''


        while not self.partie_terminee():
            print(self.grille)
            self.jouer_tour()
            self.changer_joueur()


        self.changer_joueur()
        self.traitement_fin_partie()


    def jouer_tour(self):
        '''
        Cette méthode commence par afficher à quel joueur c'est
        tour de jouer. Ensuite, on fait jouer le joueur courant
        sur la grille.
        '''

        print("C'est au tour du joueur {} de jouer".format(self.couleur_joueur_courant))
        self.joueur_courant.jouer_sur_grille(self.grille)


    def partie_terminee(self):
        '''
        Méthode vérifiant si la partie est terminée.

        Si la grille est pleine, on ajuste l'attribut
        partie_nulle à True.

        Si la grille possède un gagnant, on assigne la couleur du
        joueur courant à l'attribut gagnant_partie.

        Returns :
            True si la partie est terminée, False sinon
        '''


        if self.grille.possede_un_gagnant():
            self.gagnant_partie = self.couleur_joueur_courant
            return True
        elif self.grille.est_pleine():
            self.partie_nulle = True
            return  True
        else:
            return False



    def changer_joueur(self):
        '''
        En fonction de la couleur du joueur courant actuel, met à
        jour les attributs joueur_courant et couleur_joueur_courant.
        '''

        if self.joueur_courant is self.joueur_jaune:
            self.joueur_courant = self.joueur_rouge
            self.couleur_joueur_courant = self.joueur_rouge.couleur
        else:
            self.joueur_courant = self.joueur_jaune
            self.couleur_joueur_courant = self.joueur_jaune.couleur



    def traitement_fin_partie(self):
        '''
        Méthode qui gère le comportement de fin de partie.

        Si l'attribut gagnant_partie n'est pas None, on surligne
        la séquence gagnante de la grille et on affiche un
        message approprié pour féliciter le gagnant en plus
        d'afficher la grille avec la séquence gagnante surlignée.

        Sinon, on affiche le message d'un match nul.
        '''

        if self.grille.sequence_gagnante is not None:
            self.grille.surligner_sequence_gagnante()
            print("Le gagnant de la partie est le joueur {}! ".format(self.couleur_joueur_courant))
            print("Voici la ligne lui ayant permis de gagner! ")
            print(self.grille)
        else:
            print("match nul!")


    def sauvegarder(self, nom_fichier):
        '''
        Sauvegarde une partie dans un fichier. Le fichier
        contiendra:
        - Une ligne indiquant la couleur du joueur courant.
        - Une ligne contenant le type du joueur jaune.
        - Une ligne contenant le type du joueur rouge.
        - Le reste des lignes correspondant à la grille. Voir la
          méthode convertir_en_chaine de la grille pour le
          format.

        Args :
            nom_fichier, le string du nom du fichier où sauvegarder.
        '''

        nom_string = self.couleur_joueur_courant + "\n"
        nom_string += self.joueur_jaune.obtenir_type_joueur() + "\n"
        nom_string += self.joueur_rouge.obtenir_type_joueur() + "\n"
        nom_string += self.grille.convertir_en_chaine()

        with open(nom_fichier, "w") as mon_fichier:
            mon_fichier.write(nom_string)

    def charger(self, nom_fichier):
        '''
        Charge une partie dans à partir d'un fichier. Le fichier
        a le même format que la méthode de sauvegarde.

        Pycharm vous sortira probablement des messages d'erreur à
        cette fonction car vous initialisez des attributs en
        dehors de la fonction __init__(), mais vous pouvez les
        ignorer.

        Args:
            nom_fichier: Le string du nom du fichier à charger.
        '''

        myline = []

        with open(nom_fichier, "r") as mon_fichier:

            myline = mon_fichier.read().splitlines()


        self.joueur_jaune = self.creer_joueur_selon_type(myline[1],"jaune")
        self.joueur_rouge = self.creer_joueur_selon_type(myline[2], "rouge")
        self.couleur_joueur_courant = myline[0]

        if self.couleur_joueur_courant == "jaune":
            self.joueur_courant = self.joueur_jaune
        else:
            self.joueur_courant = self.joueur_rouge


        self.grille.charger_dune_chaine("\n".join(myline[3:]))