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

Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
3
from numpy.random import randint
Théo BOUTEMY's avatar
Théo BOUTEMY committed
4
from numpy.random import choice
Théo BOUTEMY's avatar
Théo BOUTEMY committed
5
from abc import ABCMeta, abstractmethod
Théo BOUTEMY's avatar
Théo BOUTEMY committed
6

Pauline LEYRIT's avatar
oui    
Pauline LEYRIT committed
7

Théo BOUTEMY's avatar
Théo BOUTEMY committed
8
9
10
11


class Joueur(metaclass = ABCMeta):

12
13
14
15
    """classe décrivant le tableau de jeu, on y défini deux joueur : le joueur 1 est toujours Thèo,
     le deuxième est soit Pauline soit l'IA
     c'est aussi dans cette classe qu'on définit l'IA"""

Théo BOUTEMY's avatar
Théo BOUTEMY committed
16
    def __init__(self, plateau):
17
18

        """
Théo BOUTEMY's avatar
Théo BOUTEMY committed
19
20
21
                On crée donc les joueurs,
                on a besoin d'un plateau (chaque pièce des joueurs sera définit notemment
                par sa position sur le plateau
22

Théo BOUTEMY's avatar
Théo BOUTEMY committed
23
24
25
                Paramètres
                ----------
                plateau : le plateau de jeux regroupant les informations des pions des joueurs
26
27
28

                """

Théo BOUTEMY's avatar
Théo BOUTEMY committed
29
        self.plateau=plateau
Théo BOUTEMY's avatar
Théo BOUTEMY committed
30
31
        self.coup=["entrer","sortir", "pousser","pousser", "entrer en poussant","orientation"] #coups possibles pour l'ia
        #on met deux fois 'pousser' pour augmenter les chances que le cup se repoduise (puisqu'il nécessite plus de conditions pour qu'il se produise)
32
        self.numero_pieces=['0','1','2','3','4'] #numéro de pieces possibles pour l'IA (numérotés de 0 à 4)
Théo BOUTEMY's avatar
Théo BOUTEMY committed
33
        self.ori_possible=['droite','gauche','demi-tour','rien'] #orientation possible pour l'IA
Théo BOUTEMY's avatar
Théo BOUTEMY committed
34

Théo BOUTEMY's avatar
Théo BOUTEMY committed
35
36
37
38
39
40
41
42
43
44

    @abstractmethod
    def pieces_du_joueur(self):
        """
                       À instancier dans les classes filles
                       méthode abstraite qui sera définie dans chaque joueur , pour attribuer au joueur ses pieces

        """


Théo BOUTEMY's avatar
Théo BOUTEMY committed
45
    def a_son_tour(self):
46

Théo BOUTEMY's avatar
Théo BOUTEMY committed
47
        """ méthode permettant de jouer: on différencie le joueur humain et l'IA (on prend garde à ne pas afficher les messages
48
        d'erreurs de l'ia qui seraient trop nombreux avant qu'elle ne fasse un tour valide)
Théo BOUTEMY's avatar
Théo BOUTEMY committed
49
50

        On définit ici le joueur qui doit jouer, et en fonction du joueur (humain ou ia) on attribut les fonctions
51
        corrspondantes au coup qu'il a choisit d'effectuer, c'est également ici que les paramètres des fonctions
Théo BOUTEMY's avatar
Théo BOUTEMY committed
52
53
54
        sont entrées

        C'est également cette méthode qui définiera certaines exceptions/conditions de jeux, le but étant de différencier
55
56
57
        le cas où le joueur est l'ia de celui ou le joueur est humain, puisque les messages à afficher sont différents
        Ainsi, si les deux types joueurs doivent vérifier les mêmes conditions, l'ia ne fait pas s'afficher les
        messages d'erreur.
Théo BOUTEMY's avatar
Théo BOUTEMY committed
58
59
60

        La fonction continue de laisser le joueur jouer jusqu'à ce que son tour ne soit valide. Pour être sûr que le joueur
        a bien effectué son tour avant de passer à un autre joueur, on utilise le tour_effectué du fichier pieces
Pauline LEYRIT's avatar
Pauline LEYRIT committed
61
62
63
64
65

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

66
        """
67

Théo BOUTEMY's avatar
Théo BOUTEMY committed
68
69
        f = open("historique des parties.txt", mode="a")  # on ouvre un fichier texte en mode append
        bool=False
Théo BOUTEMY's avatar
Théo BOUTEMY committed
70

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

72
73
74
75
        while not bool:  # tourne tant que le joueur n'a pas validé son tour
                         # bool deviendra true lorsque la fonction appliquée dans pièce a pu être appliquée
                         # (le joueur respecte les conditions pour le coup)
            if self.nom=='IA':    # si c'est l'ia, on laisse choisir un numéro de pièce et de coup aléatoirement
Théo BOUTEMY's avatar
Théo BOUTEMY committed
76
                n=self.numero_pieces[randint(0,5)]
Théo BOUTEMY's avatar
Théo BOUTEMY committed
77
                coup=self.coup[randint(0,5)]
78
            else:   # se le joueur est humain, on le laisse choisir
Théo BOUTEMY's avatar
Théo BOUTEMY committed
79
                n = input('quelle piece voulez-vous bouger: 0? 1? 2? 3? 4?')
Théo BOUTEMY's avatar
Théo BOUTEMY committed
80
                coup = str(input('quel coup souhaitez-vous faire: entrer? sortir? orientation? position? pousser?'))
Théo BOUTEMY's avatar
Théo BOUTEMY committed
81

Théo BOUTEMY's avatar
Théo BOUTEMY committed
82
            if coup not in ['entrer', 'sortir','orientation', 'position' ,'pousser', 'entrer en poussant']:
83
                print('coup non reconnu')  # si jamais le joueur a mal orthographié son coup
84
            if n in ['0','1','2','3','4']:
85
                n=int(n) # les input renvoient ce qui est entré par le joueur sous forme de str, on le met donc sous forme d'entier
Théo BOUTEMY's avatar
Théo BOUTEMY committed
86

Théo BOUTEMY's avatar
Théo BOUTEMY committed
87
            a, b = self.pieces_du_joueur()[n].coords[0], self.pieces_du_joueur()[n].coords[1]
Théo BOUTEMY's avatar
Théo BOUTEMY committed
88

Théo BOUTEMY's avatar
Théo BOUTEMY committed
89
90
91
92
 #on va maintenant associer l'action au coup choisit : on se servira des fonctions définies dans la classe pièce,
    #et on s'assure que le coup est reglementaire


93

Théo BOUTEMY's avatar
Théo BOUTEMY committed
94
            if coup== 'entrer':
95
96
97
                self.pieces_du_joueur()[n].tour_effectué=False  #permet de laisser le joueur jouer, lorsque la variable
                                                                #deviendra True, cela signifiera que c'est au tour de l'adversaire
                if self.nom=='IA':  #choix des paramètres pour déplacer, en aléatoire
Théo BOUTEMY's avatar
Théo BOUTEMY committed
98
99
                    i,j=randint(0,5),randint(0,5)
                    ori=self.ori_possible[randint(0,4)]
Théo BOUTEMY's avatar
Théo BOUTEMY committed
100

101
                else:   #choix des paramètres pour déplacer, par le joueur
Théo BOUTEMY's avatar
Théo BOUTEMY committed
102
103
104
105
                    i = int(input('entrer la nouvelle abscisse :      '))
                    j = int(input('entrer la nouvelle ordonnée :      '))
                    ori = input('droite? gauche? ou demi-tour? ou rien ?    ')

Théo BOUTEMY's avatar
Théo BOUTEMY committed
106
                if a in [0, 1, 2, 3, 4] and b in [0, 1, 2, 3, 4] : #on test si la pièce n'était pas déjà entré
107
108
                    if self.nom!='IA':  #on affiche les messages d'erreurs uniquement si ce n'est pas l'ia (pour éviter
                                        # d'en avoir trop à la fois
Théo BOUTEMY's avatar
ok    
Théo BOUTEMY committed
109
110
                        print('la piece est déjà rentrée sur le plateau')
                else:
Théo BOUTEMY's avatar
Théo BOUTEMY committed
111
                    if ((i == 0 or i == 4) and j in [0,1,2,3,4]) or ( (j == 4 or j == 0) and i in [0,1,2,3,4]):
112
113
114
                        self.pieces_du_joueur()[n].entrer(i,j,ori)  #l'action n'a lieux que si les conditions sont respectées
                                                                   # (il faut entrer sur une case situé sur un bord du plateau)
                                                                    # ces condition s'applique à tous les joueurs
Théo BOUTEMY's avatar
Théo BOUTEMY committed
115
                    else:
116
                        if self.nom!='IA':    #toujour un message d'erreur uniquement pour l'humain
Théo BOUTEMY's avatar
ok    
Théo BOUTEMY committed
117
                         print('une piece doit être rentrée par l exterieur du plateau')
118
119
120
121
                bool=self.pieces_du_joueur()[n].tour_effectué   # si la fonction entrer a été appelée, il devient True, sinon il reste
                                                                # False et cela signifie que le joueur rejoue
                                                                # cette méthode pour déterminer qui doit jouer, sera répétée
                                                                #pour tous les coups
Théo BOUTEMY's avatar
Théo BOUTEMY committed
122

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

Théo BOUTEMY's avatar
Théo BOUTEMY committed
124
125


Théo BOUTEMY's avatar
Théo BOUTEMY committed
126
            elif coup == 'sortir':
Théo BOUTEMY's avatar
Théo BOUTEMY committed
127

Théo BOUTEMY's avatar
Théo BOUTEMY committed
128
                self.pieces_du_joueur()[n].tour_effectué = False
Théo BOUTEMY's avatar
Théo BOUTEMY committed
129
130
131
                if a not in [0, 1, 2, 3, 4] or b not in [0, 1, 2, 3, 4]:  # on test si la pièce est bien sur le plateau
                    if self.nom != 'IA':
                        print('la piece n est pas sur le plateau')
Théo BOUTEMY's avatar
Théo BOUTEMY committed
132
                else:
Théo BOUTEMY's avatar
Théo BOUTEMY committed
133
134
135
136
137
138

                    if (a in [ 0, 4] or b in [0, 4]):   #on ne peut sortir que  si la pièce est sur un bord du plateau
                        self.pieces_du_joueur()[n].sortir()
                    else:
                        if self.nom!='IA':
                            print("pour sortir une pièce, celle-ci doit être sur l'extérieur du plateau")
Théo BOUTEMY's avatar
Théo BOUTEMY committed
139
140
141

                bool = self.pieces_du_joueur()[n].tour_effectué

Théo BOUTEMY's avatar
Théo BOUTEMY committed
142
143
144



Théo BOUTEMY's avatar
Théo BOUTEMY committed
145
146
            elif coup=='entrer en poussant':
                self.pieces_du_joueur()[n].tour_effectué = False
147
                #comme pour entrer, on laisse le joueur choisir les paramètres
Théo BOUTEMY's avatar
Théo BOUTEMY committed
148
                if self.nom=='IA':
Théo BOUTEMY's avatar
Théo BOUTEMY committed
149
                    i,j=choice([-1,5]),randint(0,5)
Théo BOUTEMY's avatar
Théo BOUTEMY committed
150
151
152
153
154
155
                    ori=self.ori_possible[randint(0,4)]
                else:
                    i = int(input('entrer la nouvelle abscisse :      '))
                    j = int(input('entrer la nouvelle ordonnée :      '))
                    ori = input('droite? gauche? ou demi-tour? ou rien ?    ')

Théo BOUTEMY's avatar
Théo BOUTEMY committed
156
                if a in [0, 1, 2, 3, 4] and b in [0, 1, 2, 3, 4] : #la pièce ne doit pas encore être entrée
Théo BOUTEMY's avatar
Théo BOUTEMY committed
157
                    if self.nom!='IA':
Théo BOUTEMY's avatar
ok    
Théo BOUTEMY committed
158
159
                        print('la piece est déjà rentrée sur le plateau')
                else:
160
                    if i == -1 or i == 5 or j == -1 or j == 5:   #la pièce doit être sur une case à l'extérieure du plateau, devant
Théo BOUTEMY's avatar
Théo BOUTEMY committed
161
                                                                 # la case qui doit être poussée
Théo BOUTEMY's avatar
ok    
Théo BOUTEMY committed
162
163
164
                        self.pieces_du_joueur()[n].entrer_en_poussant(i,j,ori)
                    else:
                        if self.nom!='IA':
Théo BOUTEMY's avatar
Théo BOUTEMY committed
165
                            print('pour rentrer en poussant, vous devez mettre la piece sur une case extérieure au plateau, en face de la case qui doit être poussée')
Théo BOUTEMY's avatar
Théo BOUTEMY committed
166
                bool = self.pieces_du_joueur()[n].tour_effectué
Théo BOUTEMY's avatar
Théo BOUTEMY committed
167

Théo BOUTEMY's avatar
Théo BOUTEMY committed
168
169
170
171



            elif coup == 'pousser':
Théo BOUTEMY's avatar
Théo BOUTEMY committed
172
                self.pieces_du_joueur()[n].tour_effectué = False
173
                if (a in [0, 1, 2, 3, 4] and b in [ 0, 1, 2, 3, 4]):  #il faut que le pion soit déjà entré pour utiliser la fonction pousser
174
                    self.pieces_du_joueur()[n].pousser()
Théo BOUTEMY's avatar
Théo BOUTEMY committed
175
176
177
178
                else:
                    if self.nom != 'IA':
                        print('vous ne pouvez pas pousser une piece qui n est pas sur le plateau')
                bool = self.pieces_du_joueur()[n].tour_effectué
Théo BOUTEMY's avatar
Théo BOUTEMY committed
179

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

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

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

Théo BOUTEMY's avatar
Théo BOUTEMY committed
183
184
            elif coup== 'orientation':
                self.pieces_du_joueur()[n].tour_effectué=False
Théo BOUTEMY's avatar
Théo BOUTEMY committed
185
186
                if (a in [0, 1, 2, 3, 4] and b in [ 0, 1, 2, 3, 4]):  #on doit pouvoir s'orienter avec les fonctions
                # qui n'existent que si le pion est sur le plateau, mais aussi pour entrer_en_poussant, lorsque le pion est situé à l'extérieur
187
188

                #on défini les paramètres
Théo BOUTEMY's avatar
Théo BOUTEMY committed
189
190
191
192
193
                    if self.nom=='IA':
                        ori=self.ori_possible[randint(0,4)]
                    else:
                        ori = input('droite? gauche? ou demi-tour? ou rien ?    ')
                    self.pieces_du_joueur()[n].changement_orientation(ori)
Théo BOUTEMY's avatar
Théo BOUTEMY committed
194
195
196
197
                else:
                    if self.nom != 'IA':
                        print('vous ne pouvez pas tourner une piece qui n est pas sur le plateau')
                bool=self.pieces_du_joueur()[n].tour_effectué
Théo BOUTEMY's avatar
Théo BOUTEMY committed
198

199

Théo BOUTEMY's avatar
Théo BOUTEMY committed
200
201


Théo BOUTEMY's avatar
Théo BOUTEMY committed
202
203
            elif coup== 'position':
                self.pieces_du_joueur()[n].tour_effectué=False
204
                    #on définit les paramètres
Théo BOUTEMY's avatar
Théo BOUTEMY committed
205
206
207
208
209
210
211
212
213
214
215
                if self.nom=='IA':
                    i,j=randint(0,5),randint(0,5)
                    ori=self.ori_possible[randint(0,4)]
                else:
                    i = int(input('entrer la nouvelle abscisse :      '))
                    j = int(input('entrer la nouvelle ordonnée :      '))
                    ori = input('droite? gauche? ou demi-tour? ou rien ?    ')

                if (a in [0, 1, 2, 3, 4] and b in [0, 1, 2, 3, 4]):  # le pion doit être déjà entré sur le plateau
                    if ((i == a + 1 or i == a - 1) and j == b) or ((j == b + 1 or j == b - 1) and i == a):  # si on demande un déplacement sur une case adjacente
                            self.pieces_du_joueur()[n].changement_position(i, j, ori) #on effectue le déplacement
Théo BOUTEMY's avatar
Théo BOUTEMY committed
216
                    else:
Théo BOUTEMY's avatar
Théo BOUTEMY committed
217
218
219
220
221
222
                        if self.nom == 'IA':
                            print("le déplacement n'est pas réglementaire, choisir d'autres coordonnées")




Théo BOUTEMY's avatar
Théo BOUTEMY committed
223
224
225
226
                else:
                    if self.nom != 'IA':
                        print('vous ne pouvez pas déplacer une piece qui n est pas sur le plateau')
                bool=self.pieces_du_joueur()[n].tour_effectué
227

228
            if n not in [0, 1, 2, 3, 4]:   #si le joueur humain a mal entré son numéro de pièce
229
                print('numéro de piece non valide')
Théo BOUTEMY's avatar
Théo BOUTEMY committed
230

231
232
            for i in self.plateau: #ici on s'assure qu'une piece ne soit pas accidentellement sortie du plateau
                                 # de jeu, auquel cas on la remet à sa position initiale
Théo BOUTEMY's avatar
Théo BOUTEMY committed
233
234

                if i.coords[0] in [-1, 5] or i.coords[1] in [5, -1, -2, 6]:  # une piece est alors sortie du plateau
235
                    if i.car() in ['R', 'E']:  # pas pour les montagnes, puisque dès qu'une montagne sort du plateau la partie se termine
Théo BOUTEMY's avatar
Théo BOUTEMY committed
236
                        i.sortir()
Théo BOUTEMY's avatar
Théo BOUTEMY committed
237
            if bool and self.nom=='IA':
238
                print('l IA a joué le coup', coup, 'sur la piece numero', n)  #informe l'humain que c'est à son tour
Théo BOUTEMY's avatar
Théo BOUTEMY committed
239

Théo BOUTEMY's avatar
Théo BOUTEMY committed
240
241
242
243
244
245
246
247
            if bool: #écriture du fichier
                f.write("Au tour de {0}.\n La piece numero {1} a ete bougee avec le coup {2} \n ".format(str(self.nom),str(n), str(coup)))

                f.write("La piece numero {0} est desormais en position {1}, et orientee vers {2} \n \n".format(str(n), str(self.pieces_du_joueur()[n].coords),str(self.pieces_du_joueur()[n].orientation)))

                f.close()


248
249
# classes définissants les joueurs, afin de connaitre leur nom, et une description résumant les caractéristiques de leurs
# pièces, pour démarrer le jeux
Théo BOUTEMY's avatar
Théo BOUTEMY committed
250
251
252
253

class Theo(Joueur):
    def __init__(self,plateau):
        super().__init__(plateau)
Théo BOUTEMY's avatar
Théo BOUTEMY committed
254
        self.nom='Theo'
Théo BOUTEMY's avatar
Théo BOUTEMY committed
255
        self.description = 'Théo, vous êtes les elephants, qui sont par défaut orientés vers la gauche'
Théo BOUTEMY's avatar
Théo BOUTEMY committed
256
257
258
259
260
261
262
263


    def pieces_du_joueur(self):
        return self.plateau.ele

class Pauline(Joueur):
    def __init__(self,plateau):
        super().__init__(plateau)
Théo BOUTEMY's avatar
Théo BOUTEMY committed
264
265
        self.nom='Pauline'
        self.description = 'Pauline, vous êtes les rhinoceros, qui sont par défaut orientés vers la droite'
Théo BOUTEMY's avatar
Théo BOUTEMY committed
266
267
268
269

    def pieces_du_joueur(self):
        return self.plateau.rhino

Théo BOUTEMY's avatar
Théo BOUTEMY committed
270
271
272
273
class IA(Joueur):
    def __init__(self,plateau):
        super().__init__(plateau)
        self.nom='IA'
Théo BOUTEMY's avatar
Théo BOUTEMY committed
274
        self.description = 'l IA, qui joue les rhinoceros'
Théo BOUTEMY's avatar
Théo BOUTEMY committed
275
276
277
278
279
280
281

    def pieces_du_joueur(self):
        return self.plateau.rhino




Théo BOUTEMY's avatar
Théo BOUTEMY committed
282
283