table_de_jeu.py 10.5 KB
Newer Older
Pauline LEYRIT's avatar
ok    
Pauline LEYRIT committed
1
2
#auteur : Théo

Pauline LEYRIT's avatar
test    
Pauline LEYRIT committed
3
from pieces import Piece, Montagne, Animal, Elephant, Rhinoceros
Théo BOUTEMY's avatar
Théo BOUTEMY committed
4
from joueur import Joueur, Theo, Pauline,IA
Pauline LEYRIT's avatar
test    
Pauline LEYRIT committed
5

Théo BOUTEMY's avatar
Théo BOUTEMY committed
6
7
8
"""
Ce module contient la définition de la classe principale servant à gérer le jeu
"""
Théo BOUTEMY's avatar
Théo BOUTEMY committed
9

Théo BOUTEMY's avatar
Théo BOUTEMY committed
10
11
12
13
14
class Plateau(list):
    """
        Classe gérant le déroulement du jeu.
        Classe décrivant le tableau de jeu, qui est une liste contentant les différentes pièces
        """
Pauline LEYRIT's avatar
test    
Pauline LEYRIT committed
15

Théo BOUTEMY's avatar
Théo BOUTEMY committed
16
    def __init__(self, xmax=5, ymax=5, nb_montagne=3, joueur1=Theo, joueur2=Pauline):
Pauline LEYRIT's avatar
test    
Pauline LEYRIT committed
17
        """
Théo BOUTEMY's avatar
Théo BOUTEMY committed
18
19
                    On crée un tableau de jeu aux dimensions désirées, avec un nombre de montagne choisi.
                    Les règles de Siam imposent que xmax et ymax soient égaux à 5
Pauline LEYRIT's avatar
test    
Pauline LEYRIT committed
20

Théo BOUTEMY's avatar
Théo BOUTEMY committed
21
                    Paramètres
Pauline LEYRIT's avatar
test    
Pauline LEYRIT committed
22
                        ----------
Théo BOUTEMY's avatar
Théo BOUTEMY committed
23
24
25
                    xmax, ymax: int
                        Largeur et longueur du plateau, normalement tout les deux égaux à 5
                        xmax=ymax car le plateau est carré
Pauline LEYRIT's avatar
test    
Pauline LEYRIT committed
26

Théo BOUTEMY's avatar
Théo BOUTEMY committed
27
28
                    nb_montagne: int
                        nomalement initié à 3 montagnes sur le plateau en début de jeu
Pauline LEYRIT's avatar
test    
Pauline LEYRIT committed
29

Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
30

Théo BOUTEMY's avatar
Théo BOUTEMY committed
31
32
33
34
35
36
37
38
                    joueur1,  joueur2: joueurs importés de 'joueur'
                    Joueurs disponibles: 'Theo' qui doit jouer les Elephants,'Pauline' qui doit jouer les Rhinoceros,
                                            'IA' qui doit jouer les Rhinoceros

                    Par ailleurs,
                    self.ele, self.mont et self.rhino sont des listes qui stockeront l'état des pièces avant de les afficher
                    sur le plateau de jeu avec la méthode unTour

Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
39

Pauline LEYRIT's avatar
test    
Pauline LEYRIT committed
40
41
        """

42
43
        self.xmax = xmax
        self.ymax = ymax
Pauline LEYRIT's avatar
test    
Pauline LEYRIT committed
44
        self.nb_montagne = nb_montagne
Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
45
        self.ele = []
46
        self.mont=[]
Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
47
        self.rhino = []
Théo BOUTEMY's avatar
Théo BOUTEMY committed
48
49
        self.joueur1=joueur1
        self.joueur2=joueur2
Théo BOUTEMY's avatar
Théo BOUTEMY committed
50
        self.partie_finie=False   # permet de savoir si la partie est finie ou non. Il devient True si une montagne sort
Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
51

Théo BOUTEMY's avatar
Théo BOUTEMY committed
52
53
        f = open("historique des parties.txt", mode="w") #on ouvre le fichier de sauvegarde en mode write pour écraser la partie d'avant
        f.write('NOUVELLE PARTIE \n \n')
Théo BOUTEMY's avatar
Théo BOUTEMY committed
54
55
56
        f.close()


Pauline LEYRIT's avatar
test    
Pauline LEYRIT committed
57
58
59
60

    def __str__(self):

        """
Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
61
        Affiche le plateau de jeu en mode texte suivant les caractères définis
Théo BOUTEMY's avatar
Théo BOUTEMY committed
62
        dans les sous classes de ''Piece''.
Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
63
64
65
66
67
68
69
70

        Paramètres
        ----------
        Aucun

        Renvoie
        -------
        s: string
Théo BOUTEMY's avatar
Théo BOUTEMY committed
71
            La chaîne de caractères qui sera affichée via ''print'', représentant le plateau de jeu
Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
72
73


Pauline LEYRIT's avatar
test    
Pauline LEYRIT committed
74
        """
75
76
        pos = {}
        for piece in self:
Théo BOUTEMY's avatar
Théo BOUTEMY committed
77
            pos[piece.coords[0],piece.coords[1]] = (piece.nom+piece.orientation) #une piece est représentée par son nom et son orientation
78
        s = ""
79
80
        for j in range(self.ymax):
            for i in range(-2,7):
81
                if (i, j) in pos:
82
                    s += pos[(i, j)]+'  '
83
                else:
Théo BOUTEMY's avatar
Théo BOUTEMY committed
84
                    s += ".    " #les cases vides sont représentées par des points
85
86
            s += "\n"
        return s
Pauline LEYRIT's avatar
test    
Pauline LEYRIT committed
87
88
89
90
91




    def initialiserPlateau(self):
Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
92
93
        """
        initialisation du plateau : toutes les cases sont vides sauf 3 au centre, où se trouvent les montagnes.
Théo BOUTEMY's avatar
Théo BOUTEMY committed
94
95
        On crée également les 5 Elephants et les 5 Rhinoceros que l'on disposera à l'extérieur du plateau, dans leurs
        positions et orientations initiales
Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
96
97


Théo BOUTEMY's avatar
Théo BOUTEMY committed
98
99
100
        Comme dit précédemment, on crée ces Pieces dans les listes self.ele, self.rhino et self.mont, puis on les
        affichera sur le plateau avec la méthode 'unTour'

Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
101
        """
Pauline LEYRIT's avatar
Pauline LEYRIT committed
102

Théo BOUTEMY's avatar
Théo BOUTEMY committed
103

Pauline LEYRIT's avatar
test    
Pauline LEYRIT committed
104
        midx, midy=self.xmax//2, self.ymax//2  # indices de la case correspondant au centre du plateau
Théo BOUTEMY's avatar
Théo BOUTEMY committed
105
106
        for k in range(self.nb_montagne):  # place les montagnes un à un, en colonne, au milieu du plateau
            self.mont.append( Montagne (  midx,midy+k-self.nb_montagne//2,'0 ',self)) #la montagne n'a pas d'orientation particulière
107
108


Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
109
        for k in range(5):
Théo BOUTEMY's avatar
Théo BOUTEMY committed
110
111
            self.ele.append(Elephant(6, k, 'g', self)) #on crée les 5 elephants que l'on oriente vers la gauche et que l'on
                                                        #place à droite du plateau
112

Théo BOUTEMY's avatar
Théo BOUTEMY committed
113
114
            self.rhino.append(Rhinoceros(-2, k, 'd', self))#on crée les 5 rhinoceros que l'on oriente vers la droite et que l'on
                                                            #   place à gauche du plateau
115

Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
116
117
118



Théo BOUTEMY's avatar
Théo BOUTEMY committed
119
120
121
122
123
    def unTour(self):
        """
        Permet de mettre à jour les pieces sur le plateau
        On commence par supprimer toutes les pièces du plateau, avant de remettre les pièces à jour, qui se trouvent
        dans les listes self.ele, sekf.rhino et self. mont"""
Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
124

125

Théo BOUTEMY's avatar
Théo BOUTEMY committed
126
        for i in (self): # on efface tout le plateau  pour mettre à jour
127
            del(i)
Théo BOUTEMY's avatar
Théo BOUTEMY committed
128
        for i in (self.mont):
129
130
131
132
133
134
135
            self.append(i)
        for i in (self.ele):
            self.append(i)
        for i in (self.rhino):
            self.append(i)

    def vainqueur(self):
Théo BOUTEMY's avatar
Théo BOUTEMY committed
136
137
        """
        Méthode permettant de savoir s'il y a un vainqueur ou non
Théo BOUTEMY's avatar
Théo BOUTEMY committed
138
139
140
        on regarde d'abord si les montagnes sont sorties du plateau
        si c'est la cas, alors ono distingue 4 cas: sortie vers le hait, le bas, la gauche ou la droite du plateau
        Enfin, on détermine le vainqueur qui est le joueur qui est le plus proche du rocher et dans le même sens de poussée
Théo BOUTEMY's avatar
Théo BOUTEMY committed
141
142

        """
143
        bool=False
Théo BOUTEMY's avatar
Théo BOUTEMY committed
144
        for m in self.mont: #on passe en revue toutes les montagnes
145

Théo BOUTEMY's avatar
Théo BOUTEMY committed
146
147
            if m.coords[0]==-1: #la montagne est sortie du plateau, à gauche
                while bool==False: # tant qu'on n'a pas trouvé le vainqueur
148
149
150
                    for i in range (1,5):
                        for piece in self:
                            if piece.coords[0]==m.coords[0]+i and piece.coords[1]==m.coords[1] and piece.orientation=='g':
Théo BOUTEMY's avatar
Théo BOUTEMY committed
151
152
153
154
                                #on commence par étudier la piece à droite de la montagne: si les conditions sont vérifiées pour
                                #gagner, alors on a trouvé le gagnant. Sinon on prend la piece encore à droite et on
                                #cherche à vérifier les conditions, etc
                                winner=piece    #c'est la piece gagnante
155
                                bool=True
Théo BOUTEMY's avatar
Théo BOUTEMY committed
156
                                self.partie_finie=True
157
158
                                break

Théo BOUTEMY's avatar
Théo BOUTEMY committed
159
            if m.coords[0]==5: #la montagne est sortie du plateau, à droite
160
161
162
163
                while bool==False: #tant qu'on n'a pas trouvé le vainqueur
                    for i in range (1,5):
                        for piece in self:
                            if piece.coords[0]==m.coords[0]-i and piece.coords[1]==m.coords[1] and piece.orientation=='d':
Théo BOUTEMY's avatar
Théo BOUTEMY committed
164
                                #de même, le vainqueur se trouve dans les pieces situées à gauche de la montagne
165
166
                                winner=piece
                                bool=True
Théo BOUTEMY's avatar
Théo BOUTEMY committed
167
                                self.partie_finie = True
168
169
                                break

Théo BOUTEMY's avatar
Théo BOUTEMY committed
170
            if m.coords[1]==-1: #la montagne est sortie du plateau,en haut
171
172
173
174
                while bool==False: #tant qu'on n'a pas trouvé le vainqueur
                    for i in range (1,5):
                        for piece in self:
                            if piece.coords[1]==m.coords[1]+i and piece.coords[0]==m.coords[0] and piece.orientation=='h':
Théo BOUTEMY's avatar
Théo BOUTEMY committed
175
                                # de même, le vainqueur se trouve dans les pieces situées en bas de la montagne
176
177
                                winner=piece
                                bool=True
Théo BOUTEMY's avatar
Théo BOUTEMY committed
178
                                self.partie_finie = True
Théo BOUTEMY's avatar
Théo BOUTEMY committed
179

180
181
                                break

Théo BOUTEMY's avatar
Théo BOUTEMY committed
182
            if m.coords[1]==5: #la montagne est sortie du plateau, en bas
183
184
185
186
                while bool==False: #tant qu'on n'a pas trouvé le vainqueur
                    for i in range (1,5):
                        for piece in self:
                            if piece.coords[1]==m.coords[1]-i and piece.coords[0]==m.coords[0] and piece.orientation=='b':
Théo BOUTEMY's avatar
Théo BOUTEMY committed
187
                                # de même, le vainqueur se trouve dans les pieces situées en haut de la montagne
188
189
                                winner=piece
                                bool=True
Théo BOUTEMY's avatar
Théo BOUTEMY committed
190
                                self.partie_finie = True
Pauline LEYRIT's avatar
Pauline LEYRIT committed
191
                                break # pour arréter dans le for
192
193
194
195
196





Théo BOUTEMY's avatar
Théo BOUTEMY committed
197
198
199
            if bool==True and winner.car()=='R': #si la piece gagnante est un rhinoceros
                print('la partie est finie, le vainqueur est', self.joueur2(self).nom) #alors elle appartient au joueur 2, qui gagne la partie
                f = open("historique des parties.txt", mode="a") #on note cela dans le fichier
Théo BOUTEMY's avatar
Théo BOUTEMY committed
200
201
                f.write('la partie est finie, le vainqueur est {0} \n \n \n \n'.format( self.joueur2(self).nom))
                f.close()
202

Théo BOUTEMY's avatar
Théo BOUTEMY committed
203

204

Théo BOUTEMY's avatar
Théo BOUTEMY committed
205
            if bool== True and winner.car()=='E' : #de même si la pièce est un elephant
206
                print ('partie finie, le vainqueur est', self.joueur1(self).nom)
Théo BOUTEMY's avatar
Théo BOUTEMY committed
207
208
209
                f = open("historique des parties.txt", mode="a")
                f.write('la partie est finie, le vainqueur est {0} \n \n \n \n '.format(self.joueur1(self).nom))
                f.close()
Théo BOUTEMY's avatar
Théo BOUTEMY committed
210

211

Théo BOUTEMY's avatar
Théo BOUTEMY committed
212
213
214
215
216
217
    def jouer(self):
        """
        c'est cette fonction qui lance vraiment le jeu
        On initialise d'abord le plateau
        Puis tant qu'il n'y a pas de joueur, on fait jouer le joueur 1 puis le joueur2, en vérifiant à chaque fois
        s'il n'y a pas un gagnant, et en affichant le plateau de jeu
Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
218

Théo BOUTEMY's avatar
Théo BOUTEMY committed
219

Théo BOUTEMY's avatar
Théo BOUTEMY committed
220
        """
221

Théo BOUTEMY's avatar
Théo BOUTEMY committed
222
        self.initialiserPlateau()
Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
223

Théo BOUTEMY's avatar
Théo BOUTEMY committed
224
225
226
        bool=True #bool ne devient jamais False: le programme tourne à l'infini à priori. En réalité, le jeu s'arrête
                    # s'il y a un gagnant, grâce à un break

Théo BOUTEMY's avatar
Théo BOUTEMY committed
227
        while bool:
Pauline LEYRIT's avatar
Pauline LEYRIT committed
228
            self.unTour() # remet le plateau a jour
Théo BOUTEMY's avatar
Théo BOUTEMY committed
229
            print(self) # on affiche le plateau
Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
230

Théo BOUTEMY's avatar
Théo BOUTEMY committed
231
232
233
234
235
            print('c est au tour du joueur',self.joueur1(self).description)
            self.joueur1(self).a_son_tour() # le joueur 1 indique le coup qu'il veut faire et la piece à déplacer

            self.unTour()#remet à jour le plateau
            self.vainqueur() # on vérifie si partie finie
Pauline LEYRIT's avatar
Pauline LEYRIT committed
236
            if self.partie_finie: #devient true si une montagne est sortie
Théo BOUTEMY's avatar
Théo BOUTEMY committed
237
                break  # le jeu s'arrete
238
            print(self)
239

240

Théo BOUTEMY's avatar
Théo BOUTEMY committed
241

242

Théo BOUTEMY's avatar
Théo BOUTEMY committed
243
244

            print('c est au tour du joueur', self.joueur2(self).description) #même principe, mais cette fois c'est au tour du joueur 2
Théo BOUTEMY's avatar
Théo BOUTEMY committed
245
            self.joueur2(self).a_son_tour()
246
247
            self.unTour()
            self.vainqueur()
Théo BOUTEMY's avatar
Théo BOUTEMY committed
248
249
            if self.partie_finie:
                break
Théo BOUTEMY's avatar
Théo BOUTEMY committed
250
251


Théo BOUTEMY's avatar
Théo BOUTEMY committed
252
253
254


if __name__ == "__main__":
Théo BOUTEMY's avatar
Théo BOUTEMY committed
255
    plateau = Plateau(xmax=5, ymax=5, nb_montagne=3, joueur1=Theo, joueur2=IA)  # c'est ici qu'on  choisit les joueurs
Théo BOUTEMY's avatar
Théo BOUTEMY committed
256
    Plateau.jouer(plateau)