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

3
from abc import ABCMeta, abstractmethod
Théo BOUTEMY's avatar
Théo BOUTEMY committed
4

Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
5

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

Théo BOUTEMY's avatar
Théo BOUTEMY committed
7
class Piece(metaclass=ABCMeta):
Théo BOUTEMY's avatar
Théo BOUTEMY committed
8
    """
Théo BOUTEMY's avatar
Théo BOUTEMY committed
9
        Classe décrivant les comportement par défaut des différentes pièces du jeu. C'est une classe abstraite car on
Théo BOUTEMY's avatar
Théo BOUTEMY committed
10
        ne va jamais appeler une pièce mais directement un éléphant, un rhinocéros ou une montagne (qui hériteront
Théo BOUTEMY's avatar
Théo BOUTEMY committed
11
12
        de la classe Piece).
        Une pièce est définie par son caractère, ses coordonnées, son orientation et son numéro
Théo BOUTEMY's avatar
Théo BOUTEMY committed
13
14
        """

Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
15
    def __init__(self, abscisse, ordonnee, orientation, plateau):
Théo BOUTEMY's avatar
Théo BOUTEMY committed
16
        """
Théo BOUTEMY's avatar
Théo BOUTEMY committed
17
                On crée une pièce avec des coordonnées et une orientation qui lui sont propres .
Théo BOUTEMY's avatar
Théo BOUTEMY committed
18

Théo BOUTEMY's avatar
Théo BOUTEMY committed
19
20
                Paramètres:
                 ----------
Théo BOUTEMY's avatar
Théo BOUTEMY committed
21
22
23
24
                abscisse, ordonnée: int
                    Les coordonnées auxquelles l'animal sera créé.

                orientation: str
Théo BOUTEMY's avatar
Théo BOUTEMY committed
25
                    l'orientation de la pièce prendra les valeurs 'h', 'b', 'd', 'g' ou '0'
Théo BOUTEMY's avatar
Théo BOUTEMY committed
26
                    pour haut, bas, droite, gauche ou pour une montagne qui n'a pas d'orientation
Théo BOUTEMY's avatar
Théo BOUTEMY committed
27
28
29

                plateau: list

Théo BOUTEMY's avatar
Théo BOUTEMY committed
30
                """
Théo BOUTEMY's avatar
Théo BOUTEMY committed
31
        self.coords = [abscisse, ordonnee]
Théo BOUTEMY's avatar
Théo BOUTEMY committed
32
33
        self.abscisse = abscisse
        self.ordonnee = ordonnee
Théo BOUTEMY's avatar
Théo BOUTEMY committed
34
        self.orientation = orientation
Théo BOUTEMY's avatar
Théo BOUTEMY committed
35
        self.plateau = plateau
Théo BOUTEMY's avatar
Théo BOUTEMY committed
36
        self.tour_effectué = False  #tour_effectué est un booléen qui servira pllus tard à déterminer si le coup a effectivement été joué ou nom
37

Théo BOUTEMY's avatar
Théo BOUTEMY committed
38
39
    def __str__(self):
        """
Théo BOUTEMY's avatar
Théo BOUTEMY committed
40
        Affiche l'état courant de la pièce en question.
Théo BOUTEMY's avatar
Théo BOUTEMY committed
41
42
43
44

        Paramètres: Aucun

        Renvoie
Théo BOUTEMY's avatar
Théo BOUTEMY committed
45
         ----------
Théo BOUTEMY's avatar
Théo BOUTEMY committed
46
        s: str
Théo BOUTEMY's avatar
Théo BOUTEMY committed
47
            La chaîne de caractères qui sera affichée en sortie: le numéro de la piece, ses coordonnées et son orientation
Théo BOUTEMY's avatar
Théo BOUTEMY committed
48
        """
Théo BOUTEMY's avatar
Théo BOUTEMY committed
49
        return "{0} numero {1} : position {2} orientation {3}".format(self.car(),self.numero, self.coords, self.orientation)
Théo BOUTEMY's avatar
Théo BOUTEMY committed
50
51
52
53

    @abstractmethod
    def car(self):
        """
Théo BOUTEMY's avatar
Théo BOUTEMY committed
54
               Méthode abstraite à instancier dans les classes filles
Théo BOUTEMY's avatar
Théo BOUTEMY committed
55
               Ce sera la lettre permettant de déterminer le type de pièce que l'on est en train de manipuler
Théo BOUTEMY's avatar
Théo BOUTEMY committed
56
               'R' pour Rhinoceros ou 'E' pour Elephant
Théo BOUTEMY's avatar
Théo BOUTEMY committed
57
58

        """
Théo BOUTEMY's avatar
Théo BOUTEMY committed
59
        pass
Théo BOUTEMY's avatar
Théo BOUTEMY committed
60

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

Théo BOUTEMY's avatar
Théo BOUTEMY committed
62
63
class Montagne(Piece):
    """
Théo BOUTEMY's avatar
Théo BOUTEMY committed
64
    classe spécifiant Piece pour représenter une Montagne
Théo BOUTEMY's avatar
Théo BOUTEMY committed
65
    """
Théo BOUTEMY's avatar
Théo BOUTEMY committed
66
67
    nb_mont = 0             #variable de classe permettant de compter le nombre de montagnes créées, afin de leur donner un numéro

Théo BOUTEMY's avatar
Théo BOUTEMY committed
68
    def __init__(self, abscisse, ordonnee, orientation, plateau):
Théo BOUTEMY's avatar
Théo BOUTEMY committed
69
70
71
72
73
74
75
        """
                        On crée une Montagne qui hérite des variables d'instances de "Piece"

                        On rajoute une variable d'instance "self.numero" pour numéroter la Montagne.
                        La pièce est unique dès lors que l'on précise son caractère: 'M' pour Montagne et son numéro

                        """
76
77
        super().__init__(abscisse, ordonnee, orientation, plateau)
        self.nom = str(self.car())
78
79
        self.numero = Montagne.nb_mont
        Montagne.nb_mont += 1
Théo BOUTEMY's avatar
Théo BOUTEMY committed
80
81
        if Montagne.nb_mont==3:  #une partie de Siam nécessite 3 Montagnes. Ainsi, lorsque nb_mont==3, c'est que l'on a
                                #recommencé une partie: nb_mont est donc réinitialisé à 0
82
            Montagne.nb_mont=0
83

Théo BOUTEMY's avatar
Théo BOUTEMY committed
84
85
86
    def car(self):
        """
        Renvoie : str
Théo BOUTEMY's avatar
Théo BOUTEMY committed
87
88
        Méthode qui spécifie la méthode car
        On retourne la lettre permettant d'identifier que l'objet que l'on manipule est une montagne: 'M'
Théo BOUTEMY's avatar
Théo BOUTEMY committed
89
        """
90
        return 'M'
Théo BOUTEMY's avatar
Théo BOUTEMY committed
91
92


Théo BOUTEMY's avatar
Théo BOUTEMY committed
93
class Animal(Piece, metaclass=ABCMeta):
Théo BOUTEMY's avatar
Théo BOUTEMY committed
94
95
96
97
98
    """
        classe spécifiant Piece pour représenter un Animal
        La classe est abstraite car on ne fera jamais directement à un animal, mais plutôt à un Elephant
        ou à un Rhinoceros, qui seront des classes filles de Animal
        """
Théo BOUTEMY's avatar
Théo BOUTEMY committed
99
    def __init__(self, abscisse, ordonnee, orientation, plateau):
Théo BOUTEMY's avatar
Théo BOUTEMY committed
100
101
102
103
        """
         On crée un Animal qui hérite des variables d'instances de "Piece"

             """
104
105
        super().__init__(abscisse, ordonnee, orientation, plateau)

106
107
108
    @abstractmethod
    def car(self):
        """
Théo BOUTEMY's avatar
Théo BOUTEMY committed
109
               méthode abstraite à instancier dans les classes filles
110
111
112
               Ce sera la lettre permettant de déterminer le type de pièce que l'on est en train de manipuler

        """
Théo BOUTEMY's avatar
Théo BOUTEMY committed
113
        pass
Théo BOUTEMY's avatar
Théo BOUTEMY committed
114

Théo BOUTEMY's avatar
Théo BOUTEMY committed
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
    def entrer(self,i,j,ori):
        """
                Cette méthode permet d'entrer un des animaux sur le plateau, en vérifiant que cette case
                 ne soit pas déjà occupée

                 On vérifiera que le coup est réglementaire (entrée par une case extérieure) dans la
                  méthode 'à son tour' du fichier joueur

                  Paramètres:
                i, j : int ==>    Les coordonnées auxquelles on souhaite entrer la pièce

                ori: str  ==>     le changement d'orientation que l'on veut affecter à la piece

        """
        bool2=True # booléen qui permet de savoir si la case est déjà occupée ou non
        for k in (self.plateau):  # on vérifie que la case n'est pas déjà occupée
            if k.coords == [i, j]:
                print("la case choisie est déjà prise, choisir d'autres coordonnées")
                bool2 = False
                break

        if bool2:
            self.coords = [i, j] # on met à jour les coordonnées de notre pièce, qui rentre sur le plateau
            self.changement_orientation(ori)
            self.tour_effectué = True



    def sortir(self):
        """
              Cette méthode permet de sortir un des animaux du plateau.
              L'animal retourne alors à sa position initiale, avec son orientation initiale



            On vérifiera que le coup est réglementaire (sortie autorisée que si la pièce est en bordure de plateau) dans la
            méthode 'à son tour' du fichier joueur.
                       """

        if self.car() == 'R':
            self.coords = [-2, self.numero] #coordonnées et orientations initiales des rhinoceros
            self.orientation='d'
        else:
            self.coords =[ 6, self.numero]
            self.orientation = 'g'

        self.tour_effectué = True # le tour est effectivement joué



Théo BOUTEMY's avatar
Théo BOUTEMY committed
165
    def pousser(self):
Théo BOUTEMY's avatar
Théo BOUTEMY committed
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
        """
                Méthode permettant de réaliser le coup : pousser

                La méthode est adaptée à chacun des cas, selon si l'orientation de la piece que l'on considère
                est haut, bas, droite, ou gauche.
                Pour chacun des cas, on crée une liste qui comporte les pièces sur le plateau à proximité et  suscetibles
                d'être poussées (par exemple si la piece étudiée est orientée vers la gauche, cette liste va contenir
                toutes les pieces du plateau situées à gauche , et sans cases vides entre elles).

                Ensuite, un calcul de résultantes de forces suivant les axes x et y est effectué selon chacun des cas.
                Attention, un Animal peut pousser une Montagne, mais pas deux. Ainsi, une montagne seule a une force
                de 0, mais 2 Montagnes ont une force de 1, 3 Montagnes ont une force de 2, etc

                Si la résultante des forces est favorable pour pousser, alors on modifie les coordonnées de toutes les
                pieces de notre liste, de manière à toutes les faire translater de 1 dans le même sens et la même direction

                Note: s'il n'y a rien a pousser, aucune force ne s'oppose à la piece: ainsi, le joueur peut effecteur
                le coup pousser même si la case adjacente est vide: cela ne fera qu'avancer la piece d'une case
                """
        dic_forces = {'0': [0, 0],    # dictionnaire permettant d'alouer une force (suivant x et y) selon l'orientation de la piece
Théo BOUTEMY's avatar
Théo BOUTEMY committed
186
                      'h': [1, 0],
Théo BOUTEMY's avatar
Théo BOUTEMY committed
187
188
189
190
                      'd': [0, 1],
                      'b': [-1, 0],
                      'g': [0, -1]}

Théo BOUTEMY's avatar
Théo BOUTEMY committed
191
        j, i = self.coords[1], self.coords[0]       #on acquiert les coordonnées et l'orientation de notre pièce
Théo BOUTEMY's avatar
Théo BOUTEMY committed
192
        orientation = self.orientation
Théo BOUTEMY's avatar
Théo BOUTEMY committed
193

Théo BOUTEMY's avatar
Théo BOUTEMY committed
194
195
196
197
198
199
        f = 0          # la force résultante de la piece en question est initialisée
        H = []         # liste  qui recense les pieces sur la même ligne que notre piece: H pour horizontal
        Hab = [self]   # liste  qui recense les pieces sur la même ligne que notre piece mais sans case vide entre ellesles
                       # ce sont les pieces a bouger sur la ligne en question: Hab pour horizontal à bouger

        V = []         #on fait de même pour les pièces verticales sur une même colonne
Théo BOUTEMY's avatar
Théo BOUTEMY committed
200
        Vab = [self]
Théo BOUTEMY's avatar
Théo BOUTEMY committed
201
202

        nb_montagnes = 0 # compteur du nombre de montagnes
Théo BOUTEMY's avatar
Théo BOUTEMY committed
203
        for piece in self.plateau:
Théo BOUTEMY's avatar
Théo BOUTEMY committed
204
            if piece.coords[1] == j:
Théo BOUTEMY's avatar
Théo BOUTEMY committed
205
                H.append(piece)
Théo BOUTEMY's avatar
Théo BOUTEMY committed
206
            if piece.coords[0] == i:
Théo BOUTEMY's avatar
Théo BOUTEMY committed
207
                V.append(piece)
Théo BOUTEMY's avatar
Théo BOUTEMY committed
208
            # à ce stade on a les liste des pieces qui sont sur la même ligne et sur la même colonne que l'animal en question
Théo BOUTEMY's avatar
Théo BOUTEMY committed
209

Théo BOUTEMY's avatar
Théo BOUTEMY committed
210
        ###### 1er cas : notre piece est orientée vers la gauche
Théo BOUTEMY's avatar
Théo BOUTEMY committed
211
212
        if orientation == 'g':
            piece_gauche = self
Théo BOUTEMY's avatar
Théo BOUTEMY committed
213
            for k in range(len(H)):
Théo BOUTEMY's avatar
Théo BOUTEMY committed
214
                for piece in H:
Théo BOUTEMY's avatar
Théo BOUTEMY committed
215
                    if piece.coords[0] == piece_gauche.coords[0] - 1:
Théo BOUTEMY's avatar
Théo BOUTEMY committed
216
                        Hab.append(piece)
Théo BOUTEMY's avatar
Théo BOUTEMY committed
217
                        piece_gauche = piece
Théo BOUTEMY's avatar
Théo BOUTEMY committed
218
            #à ce stade on a la liste des pieces qui pourront potentiellement être bougées si la force est suffisante
Théo BOUTEMY's avatar
Théo BOUTEMY committed
219

Théo BOUTEMY's avatar
Théo BOUTEMY committed
220
            for piece in Hab: #on calucle la force résultante selon x
Théo BOUTEMY's avatar
Théo BOUTEMY committed
221
                if piece.car() == 'M':
Théo BOUTEMY's avatar
Théo BOUTEMY committed
222
223
224
225
226
                    nb_montagnes += 1 #si on rencontre une montagne, on incrémente le compteur de montagnes
                    if nb_montagnes == 2:# il faut rajouter la force des montagnes
                        f = f + 1
                    if nb_montagnes == 3:
                        f = f + 2
Théo BOUTEMY's avatar
Théo BOUTEMY committed
227
                else:
Théo BOUTEMY's avatar
Théo BOUTEMY committed
228
                    f = f + dic_forces[piece.orientation][1]
Théo BOUTEMY's avatar
Théo BOUTEMY committed
229

Théo BOUTEMY's avatar
Théo BOUTEMY committed
230
231
            if f < 0:  # si la force résultante est vers la droite, donc suffisante pour pousser
                for piece in Hab: #on modifie les coordonnées des pièces à pousser
Théo BOUTEMY's avatar
Théo BOUTEMY committed
232
                    piece.coords =[ piece.coords[0] - 1, piece.coords[1]]
Théo BOUTEMY's avatar
Théo BOUTEMY committed
233
                    self.tour_effectué = True #si on arrive jusque là, c'est que le tour a été proprement joué
Théo BOUTEMY's avatar
Théo BOUTEMY committed
234
            else:
Théo BOUTEMY's avatar
Théo BOUTEMY committed
235
                print('vous ne pouvez pas effectuer cette poussée: vous n avez pas assez de force de poussée')
Théo BOUTEMY's avatar
Théo BOUTEMY committed
236

Théo BOUTEMY's avatar
Théo BOUTEMY committed
237
238
        ###### 2eme cas : notre piece est orientée vers la droite
        #le principe est exactement le même
Théo BOUTEMY's avatar
Théo BOUTEMY committed
239
        if orientation == 'd':
Théo BOUTEMY's avatar
Théo BOUTEMY committed
240
241
242
243
244
245
246
247
248
249
250
            piece_droite = self
            for k in range(len(H)):
                for piece in H:
                    if piece.coords[0] == piece_droite.coords[0] + 1:
                        Hab.append(piece)
                        piece_droite = piece

            for piece in Hab:
                if piece.car() == 'M':
                    nb_montagnes += 1
                    if nb_montagnes == 2:
Théo BOUTEMY's avatar
Théo BOUTEMY committed
251
252
253
                        f = f - 1
                    if nb_montagnes == 3:
                        f = f - 2
Théo BOUTEMY's avatar
Théo BOUTEMY committed
254
255
256
257
258
                else:
                    f = f + dic_forces[(piece.orientation)][1]

            if f > 0:  # la force résultante est vers la droite
                for piece in Hab:
Théo BOUTEMY's avatar
Théo BOUTEMY committed
259
                    piece.coords = [piece.coords[0] + 1, piece.coords[1]]
Théo BOUTEMY's avatar
Théo BOUTEMY committed
260
261
                    self.tour_effectué = True
            else:
Théo BOUTEMY's avatar
Théo BOUTEMY committed
262
                print('vous ne pouvez pas effectuer cette poussée: vous n avez pas assez de force de poussée')
Théo BOUTEMY's avatar
Théo BOUTEMY committed
263

Théo BOUTEMY's avatar
Théo BOUTEMY committed
264
265
        ###### 3eme cas : notre piece est orientée vers le haut
        # le principe est exactement le même
Théo BOUTEMY's avatar
Théo BOUTEMY committed
266
        if orientation == 'h':
Théo BOUTEMY's avatar
Théo BOUTEMY committed
267
268
269
270
271
272
273
274
275
276
277
            piece_haut = self
            for k in range(len(V)):
                for piece in V:
                    if piece.coords[1] == piece_haut.coords[1] - 1:
                        Vab.append(piece)
                        piece_haut = piece

            for piece in Vab:
                if piece.car() == 'M':
                    nb_montagnes += 1
                    if nb_montagnes == 2:
Théo BOUTEMY's avatar
Théo BOUTEMY committed
278
279
280
                        f = f - 1
                    if nb_montagnes == 3:
                        f = f - 2
Théo BOUTEMY's avatar
Théo BOUTEMY committed
281
282
283
                else:
                    f = f + dic_forces[(piece.orientation)][0]

Théo BOUTEMY's avatar
Théo BOUTEMY committed
284
            if f > 0:  # la force résultante est vers le haut
Théo BOUTEMY's avatar
Théo BOUTEMY committed
285
                for piece in Vab:
Théo BOUTEMY's avatar
Théo BOUTEMY committed
286
                    piece.coords =[ piece.coords[0], piece.coords[1] - 1]
Théo BOUTEMY's avatar
Théo BOUTEMY committed
287
288
                    self.tour_effectué = True
            else:
Théo BOUTEMY's avatar
Théo BOUTEMY committed
289
                print('vous ne pouvez pas effectuer cette poussée: vous n avez pas assez de force de poussée')
Théo BOUTEMY's avatar
Théo BOUTEMY committed
290

Théo BOUTEMY's avatar
Théo BOUTEMY committed
291
        ###### 4eme cas : notre piece est orientée vers le bas
Théo BOUTEMY's avatar
Théo BOUTEMY committed
292
        if orientation == 'b':
Théo BOUTEMY's avatar
Théo BOUTEMY committed
293
294
295
296
297
298
299
300
301
302
303
            piece_haut = self
            for k in range(len(V)):
                for piece in V:
                    if piece.coords[1] == piece_haut.coords[1] + 1:
                        Vab.append(piece)
                        piece_haut = piece

            for piece in Vab:
                if piece.car() == 'M':
                    nb_montagnes += 1
                    if nb_montagnes == 2:
Théo BOUTEMY's avatar
Théo BOUTEMY committed
304
305
306
                        f = f + 1
                    if nb_montagnes == 3:
                        f = f + 2
Théo BOUTEMY's avatar
Théo BOUTEMY committed
307
308
309
                else:
                    f = f + dic_forces[(piece.orientation)][0]

Théo BOUTEMY's avatar
Théo BOUTEMY committed
310
            if f < 0:  # la force résultante est vers le bas
Théo BOUTEMY's avatar
Théo BOUTEMY committed
311
                for piece in Vab:
Théo BOUTEMY's avatar
Théo BOUTEMY committed
312
                    piece.coords = [piece.coords[0], piece.coords[1] + 1]
Théo BOUTEMY's avatar
Théo BOUTEMY committed
313
314
                    self.tour_effectué = True
            else:
Théo BOUTEMY's avatar
Théo BOUTEMY committed
315
316
317
                print('vous ne pouvez pas effectuer cette poussée: vous n avez pas assez de force de poussée')


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

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

Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
320

Théo BOUTEMY's avatar
Théo BOUTEMY committed
321
    def entrer_en_poussant(self,i,j,ori):
Théo BOUTEMY's avatar
Théo BOUTEMY committed
322
323
324
        """
              Cette méthode permet d'entrer un des animaux sur le plateau en poussant un autre animal,
              ci cela est possible
Théo BOUTEMY's avatar
Théo BOUTEMY committed
325

Théo BOUTEMY's avatar
Théo BOUTEMY committed
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
              Avant d'entrer la piece, le joueur peut modifier son orientation comme stipulé dans les règles du jeu

               On vérifiera que le coup est réglementaire dans la
                  méthode 'à son tour' du fichier joueur. On y expliquera aussi comment procéder pour rentrer une pièce
                  en poussant.

                Paramètres:
                i, j : int ==>    Les coordonnées auxquelles on souhaite mettre la pièce pour la pousser et ainsi la faire rentrer

                ori: str  ==>     le changement d'orientation que l'on veut affecter à la piece

               """

        self.coords = [i, j]
        self.changement_orientation(ori)
        self.tour_effectué = False  #le fait d'avoir changé l'orientation de la piece a mis le booléen tour_effezctué à True
                                    #le coup n'étant pas fini, on le remet à False
        self.pousser()        #si cela est possible, alors tour_effectué devient True

Théo BOUTEMY's avatar
Théo BOUTEMY committed
345
        if self.coords[0] in [-1,-2,5,6] or self.coords[1] in [-1,-2,5,6]:    #ca veut dire que la pièce n'est pas entrée sur le plateau
Théo BOUTEMY's avatar
Théo BOUTEMY committed
346
347
            self.sortir() #on remet la piece à sa position initiale
            self.tour_effectué=False # au final le tour n'est pas joué
Théo BOUTEMY's avatar
Théo BOUTEMY committed
348
349


Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
350

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

Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
352

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

Théo BOUTEMY's avatar
Théo BOUTEMY committed
354
    def changement_orientation(self,ori):
Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
355
        """
Théo BOUTEMY's avatar
Théo BOUTEMY committed
356
              Cette méthode permet de changer l'orientation d'une piece
Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
357

Théo BOUTEMY's avatar
Théo BOUTEMY committed
358
359
360
361
362
363
364
365
             Paramètres:
                ori: str  ==>     le changement d'orientation que l'on veut affecter à la piece. Cela peut etre 'droite'
                'gauche', 'demi-tour' ou 'rien'

            Attention: si ori=='droite', c'est que l'on veut tourner la pièce vers la droite par rapport à sa position
            initiale, et non pas que l'on veut l'orienter vers la droite du plateau

                       """
Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
366

Théo BOUTEMY's avatar
Théo BOUTEMY committed
367
        tourner_droite = {'h': 'd',    #on crée des dictionnaires pour avoir la nouvelle orientation
Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
368
369
370
371
372
373
374
375
376
377
378
379
                          'd': 'b',
                          'b': 'g',
                          'g': 'h'}
        tourner_gauche = {'h': 'g',
                          'g': 'b',
                          'b': 'd',
                          'd': 'h'}
        demi_tour = {'h': 'b',
                     'g': 'd',
                     'b': 'h',
                     'd': 'g'}

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

Théo BOUTEMY's avatar
Théo BOUTEMY committed
381
382
383
384
        if ori == 'droite':
            self.orientation = tourner_droite[str(self.orientation)]
            self.tour_effectué = True
        if ori == 'gauche':
Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
385
            self.orientation = tourner_gauche[str(self.orientation)]
Théo BOUTEMY's avatar
Théo BOUTEMY committed
386
            self.tour_effectué = True
Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
387
388
389

        if ori == 'demi-tour':
            self.orientation = demi_tour[str(self.orientation)]
Théo BOUTEMY's avatar
Théo BOUTEMY committed
390
391
            self.tour_effectué = True

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

Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
393

Théo BOUTEMY's avatar
Théo BOUTEMY committed
394
    def changement_position(self,i,j,ori):
Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
395
        """
Théo BOUTEMY's avatar
Théo BOUTEMY committed
396
397
398
399
400
401
              Cette méthode permet de bouger un animal sur une case adjacente du plateau, si la case n'est pas déjà
              occupée

                Paramètres:
                i, j : int ==>    Les coordonnées auxquelles on souhaite mettre la pièce
                ori: str  ==>     le changement d'orientation que l'on veut affecter à la piece
Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
402

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

Théo BOUTEMY's avatar
Théo BOUTEMY committed
404
405
406
                On vérifiera que le coup est réglementaire (déplacement sur une case adjacente) dans la
            méthode 'à son tour' du fichier joueur.

Théo BOUTEMY's avatar
Théo BOUTEMY committed
407
408
                Comme stipulé dans les règles du jeu, on peut changer la position et l'orientation dans un même coup
               """
Théo BOUTEMY's avatar
Théo BOUTEMY committed
409

Théo BOUTEMY's avatar
Théo BOUTEMY committed
410
        bool2 = True  # on vérifie que la case n'est pas déjà occupée
Théo BOUTEMY's avatar
Théo BOUTEMY committed
411

Théo BOUTEMY's avatar
Théo BOUTEMY committed
412
        for k in (self.plateau):  # on vérifie que la case n'est pas déjà occupée
Théo BOUTEMY's avatar
Théo BOUTEMY committed
413
            if k.coords == (i, j): # si la case est déjà occupée
Théo BOUTEMY's avatar
Théo BOUTEMY committed
414
415
416
417
                print("la case choisie est déjà prise, choisir d'autres coordonnées")
                bool2 = False
                break

Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
418

Théo BOUTEMY's avatar
Théo BOUTEMY committed
419
420

        if bool2 : #si toutes les conditions sont réunies
Théo BOUTEMY's avatar
Théo BOUTEMY committed
421
            self.coords = [i, j] #on déplace la piece
Théo BOUTEMY's avatar
Théo BOUTEMY committed
422

Théo BOUTEMY's avatar
Théo BOUTEMY committed
423
424
            self.changement_orientation(ori) # et on change son orientation
            self.tour_effectué = True # le tour est effectué
Théo BOUTEMY's avatar
Théo BOUTEMY committed
425
426
427

        else:
            print("le déplacement n'est pas réglementaire, choisir d'autres coordonnées")
Théo BOUTEMY's avatar
Théo BOUTEMY committed
428

Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
429
430
431



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

433

Théo BOUTEMY's avatar
Théo BOUTEMY committed
434
435

class Elephant(Animal):
Théo BOUTEMY's avatar
Théo BOUTEMY committed
436
437
438
439
440
441
    '''
    Classe spécifiant la classe Animal
    Elle permet de créer un Elephant

    '''
    nb_elephant = 0  #variable de classe permettant de compter le nombre d'éléphants créées, afin de leur donner un numéro
442

Théo BOUTEMY's avatar
Théo BOUTEMY committed
443
    def __init__(self, abscisse, ordonnee, orientation, plateau):
Théo BOUTEMY's avatar
Théo BOUTEMY committed
444
445
446
447
448
449
450
        """
                On crée un Elephant qui hérite des variables d'instances de "Animal" et donc de 'Piece'

                On rajoute une variable d'instance "self.numero" pour numéroter l'éléphant.
                La pièce est unique dès lors que l'on précise son caractère: 'E' pour Elephant et son numéro

                                """
Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
451
452
        super().__init__(abscisse, ordonnee, orientation, plateau)
        self.numero = Elephant.nb_elephant
Théo BOUTEMY's avatar
Théo BOUTEMY committed
453
        Elephant.nb_elephant += 1
Théo BOUTEMY's avatar
Théo BOUTEMY committed
454
455
        if Elephant.nb_elephant==5:#une partie de Siam nécessite 5 Elephants. Ainsi, lorsque nb_elephant==5, c'est que l'on a
                                #recommencé une partie: nb_mont est donc réinitialisé à 0
456
            Elephant.nb_elephant=0
Théo BOUTEMY's avatar
Théo BOUTEMY committed
457
        self.nom = str(self.car() + str(self.numero))
458

Théo BOUTEMY's avatar
Théo BOUTEMY committed
459
    def car(self):
Théo BOUTEMY's avatar
Théo BOUTEMY committed
460
461
462
463
464
465
        """
        Renvoie : str
        Méthode qui spécifie la méthode car
        On retourne la lettre permettant d'identifier que l'objet que l'on manipule est un éléphant: 'E'
        """
        return 'E'
Théo BOUTEMY's avatar
Théo BOUTEMY committed
466
467

class Rhinoceros(Animal):
Théo BOUTEMY's avatar
Théo BOUTEMY committed
468
    nb_rhino = 0  # variable de classe
469

Théo BOUTEMY's avatar
Théo BOUTEMY committed
470
    def __init__(self, abscisse, ordonnee, orientation, plateau):
Théo BOUTEMY's avatar
Théo BOUTEMY committed
471
472
473
474
475
476
477
478
479
        """
                    On crée un Rhinoceros qui hérite des variables d'instances de "Animal" et donc de 'Piece'

                    On rajoute une variable d'instance "self.numero" pour numéroter le rhinoceros.
                    La pièce est unique dès lors que l'on précise son caractère: 'R' pour Rhinoceros et son numéro

                    la classe Rhinoceros est codée de la même manière que la classe Elephant

                                        """
Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
480
481
        super().__init__(abscisse, ordonnee, orientation, plateau)
        self.numero = Rhinoceros.nb_rhino
Théo BOUTEMY's avatar
Théo BOUTEMY committed
482
        Rhinoceros.nb_rhino += 1
483
        if Rhinoceros.nb_rhino==5:
Théo BOUTEMY's avatar
Théo BOUTEMY committed
484
            Rhinoceros.nb_rhino=0# de même que pour la classe Elephant
Théo BOUTEMY's avatar
Théo BOUTEMY committed
485
        self.nom = str(self.car() + str(self.numero))
486

Théo BOUTEMY's avatar
Théo BOUTEMY committed
487
    def car(self):
Théo BOUTEMY's avatar
Théo BOUTEMY committed
488
489
490
491
492
493
        """
            Renvoie : str
            Méthode qui spécifie la méthode car
            On retourne la lettre permettant d'identifier que l'objet que l'on manipule est un rhinoceros: 'R'
                """
        return 'R'
494

Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
495