Commit ba9da95e authored by Pauline LEYRIT's avatar Pauline LEYRIT
Browse files

Merge remote-tracking branch 'origin/master'

parents 2799deb7 1c642e25
......@@ -10,7 +10,7 @@ class Joueur(metaclass = ABCMeta):
def __init__(self, plateau):
self.plateau=plateau
self.winner=False
@abstractmethod
def pieces_du_joueur(self):
......@@ -28,7 +28,7 @@ class Joueur(metaclass = ABCMeta):
while not bool:
n = input('quelle piece voulez-vous bouger: 0? 1? 2? 3? 4?')
coup = input('quel coup souhaitez-vous faire: entrer? sortir? orientation? position? pousser? entrer en poussant')
coup = input('quel coup souhaitez-vous faire: entrer? sortir? orientation? position? pousser?')
if coup not in ['entrer', 'sortir','orientation', 'position' ,'pousser', 'entrer en poussant']:
print('coup non reconnu')
......@@ -41,6 +41,11 @@ class Joueur(metaclass = ABCMeta):
self.pieces_du_joueur()[n].entrer()
bool=self.pieces_du_joueur()[n].tour_effectué
elif coup== 'sortir':
self.pieces_du_joueur()[n].tour_effectué=False
self.pieces_du_joueur()[n].sortir()
bool=self.pieces_du_joueur()[n].tour_effectué
elif coup=='entrer en poussant':
self.pieces_du_joueur()[n].tour_effectué = False
self.pieces_du_joueur()[n].entrer_en_poussant()
......@@ -57,25 +62,10 @@ class Joueur(metaclass = ABCMeta):
elif coup=='pousser':
self.pieces_du_joueur()[n].tour_effectué=False
self.pieces_du_joueur()[n].pousser()
for i in self.plateau:
if i.coords[0]==-1 or i.coords[0]==5 or i.coords[1]==5 or i.coords[1]==-1: # une piece est alors sortie du plateau
if i.car() in['R','E']:
i.sortir()
else: #c'est qu'une montagne est sortie
self.vainceur=True
print('la partie est finie, le vainceur est' ,self)
bool= self.pieces_du_joueur()[n].tour_effectué
elif coup== 'sortir':
self.pieces_du_joueur()[n].tour_effectué=False
self.pieces_du_joueur()[n].sortir()
bool=self.pieces_du_joueur()[n].tour_effectué
elif coup== 'orientation':
self.pieces_du_joueur()[n].tour_effectué=False
self.pieces_du_joueur()[n].changement_orientation()
......@@ -90,13 +80,20 @@ class Joueur(metaclass = ABCMeta):
else:
print('numéro de piece non valide')
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
if i.coords[0] in [-1, 5] or i.coords[1] in [5, -1, -2, 6]: # une piece est alors sortie du plateau
if i.car() in ['R', 'E']:
i.sortir()
class Theo(Joueur):
def __init__(self,plateau):
super().__init__(plateau)
self.nom = 'Théo, vous êtes les elephants, qui sont par défaut orientés vers la gauche'
self.nom='Théo'
self.description = 'Théo, vous êtes les elephants, qui sont par défaut orientés vers la gauche'
def pieces_du_joueur(self):
......@@ -105,7 +102,8 @@ class Theo(Joueur):
class Pauline(Joueur):
def __init__(self,plateau):
super().__init__(plateau)
self.nom = 'Pauline, vous êtes les rhinoceros, qui sont par défaut orientés vers la droite'
self.nom='Pauline'
self.description = 'Pauline, vous êtes les rhinoceros, qui sont par défaut orientés vers la droite'
def pieces_du_joueur(self):
return self.plateau.rhino
......
......@@ -5,9 +5,7 @@ from abc import ABCMeta, abstractmethod
from random import randint
class Piece(metaclass = ABCMeta):
class Piece(metaclass=ABCMeta):
"""
Classe décrivant les comportement par défaut des différentes pièces du jeu. C'es une méthode abstraite car on
ne va jamais appeler une pièce mais directement un éléphant, un rhinocéros ou une montagne (qui hériteront
......@@ -28,14 +26,11 @@ class Piece(metaclass = ABCMeta):
pour haut, bas, droite, gauche ou pour une montagne qui n'a pas d'orientation
"""
self.coords = [abscisse, ordonnee]
self.abscisse=abscisse
self.ordonnee=ordonnee
self.abscisse = abscisse
self.ordonnee = ordonnee
self.orientation = orientation
self.plateau=plateau
self.nom = str(self.car())
self.tour_effectué=False
self.plateau = plateau
self.tour_effectué = False
def __str__(self):
"""
......@@ -46,7 +41,7 @@ class Piece(metaclass = ABCMeta):
Renvoie
s: str
La chaîne de caractères qui sera affichée via ''print''
La chaîne de caractères qui sera affichée en sortie
"""
return "{0} : position {1} orientation {2}".format(self.car(), self.coords, self.orientation)
......@@ -59,21 +54,27 @@ class Piece(metaclass = ABCMeta):
"""
class Montagne(Piece):
"""
classe spécifiant Piece pour représenter une montagne
"""
def __init__(self, abscisse, ordonnee, orientation, plateau):
super().__init__(abscisse, ordonnee, orientation, plateau)
self.nom = str(self.car())
def car(self):
"""
Renvoie : str
On retourne la lettre permettant d'identifier que l'objet que l'on manipule est une montagne
"""
return 'M '
return 'M'
class Animal(Piece,metaclass = ABCMeta):
class Animal(Piece, metaclass=ABCMeta):
def __init__(self, abscisse, ordonnee, orientation, plateau):
super().__init__(abscisse, ordonnee, orientation, plateau)
@abstractmethod
def car(self):
......@@ -84,55 +85,51 @@ class Animal(Piece,metaclass = ABCMeta):
"""
def pousser(self):
dic_forces = {'0': [0,0],
'h': [1, 0],
dic_forces = {'0': [0, 0],
'h': [1, 0],
'd': [0, 1],
'b': [-1, 0],
'g': [0, -1]}
j,i=self.coords[1],self.coords[0]
orientation=self.orientation
j, i = self.coords[1], self.coords[0]
orientation = self.orientation
f = 0 # la force résultante de la piece en question
H=[] #les pieces sur la même ligne
Hab=[self] #les pieces a bouger sur la ligne en question
V=[]
Vab=[self]
nb_montagnes=0
H = [] # les pieces sur la même ligne
Hab = [self] # les pieces a bouger sur la ligne en question
V = []
Vab = [self]
nb_montagnes = 0
for piece in self.plateau:
if piece.coords[1]==j:
H.append(piece) # à ce stade on a la liste des pieces qui sont sur la même ligne que l'animal en question
if piece.coords[0]==i:
if piece.coords[1] == j:
H.append(piece) # à ce stade on a la liste des pieces qui sont sur la même ligne que l'animal en question
if piece.coords[0] == i:
V.append(piece)
if orientation=='g':
piece_gauche=self
for k in range( len(H)): # pour etre sur de ne pas louper une piece qui serait à gauche
if orientation == 'g':
piece_gauche = self
for k in range(len(H)): # pour etre sur de ne pas louper une piece qui serait à gauche
for piece in H:
if piece.coords[0]==piece_gauche.coords[0]-1:
if piece.coords[0] == piece_gauche.coords[0] - 1:
Hab.append(piece)
piece_gauche=piece
piece_gauche = piece
for piece in Hab:
if piece.car()=='M':
nb_montagnes+=1
if nb_montagnes==2:
f=f+1 #il faut rajouter la force des montagnes
if piece.car() == 'M':
nb_montagnes += 1
if nb_montagnes == 2:
f = f + 1 # il faut rajouter la force des montagnes
else:
f=f+ dic_forces[(piece.orientation)][1]
f = f + dic_forces[piece.orientation][1]
if f < 0: # la force résultante est vers la droite
for piece in Hab:
piece.coords = piece.coords[0] - 1,piece.coords[1]
self.tour_effectué=True
piece.coords = piece.coords[0] - 1, piece.coords[1]
self.tour_effectué = True
else:
print('vous ne pouvez pas effectuer cette poussée: vous navez pas assez de force de poussée')
if orientation=='d':
if orientation == 'd':
piece_droite = self
for k in range(len(H)):
for piece in H:
......@@ -150,12 +147,12 @@ class Animal(Piece,metaclass = ABCMeta):
if f > 0: # la force résultante est vers la droite
for piece in Hab:
piece.coords = piece.coords[0] + 1,piece.coords[1]
piece.coords = piece.coords[0] + 1, piece.coords[1]
self.tour_effectué = True
else:
print('vous ne pouvez pas effectuer cette poussée: vous navez pas assez de force de poussée')
if orientation=='h':
if orientation == 'h':
piece_haut = self
for k in range(len(V)):
for piece in V:
......@@ -173,12 +170,12 @@ class Animal(Piece,metaclass = ABCMeta):
if f > 0: # la force résultante est vers la droite
for piece in Vab:
piece.coords = piece.coords[0] ,piece.coords[1]-1
piece.coords = piece.coords[0], piece.coords[1] - 1
self.tour_effectué = True
else:
print('vous ne pouvez pas effectuer cette poussée: vous navez pas assez de force de poussée')
if orientation=='b':
if orientation == 'b':
piece_haut = self
for k in range(len(V)):
for piece in V:
......@@ -196,74 +193,54 @@ class Animal(Piece,metaclass = ABCMeta):
if f < 0: # la force résultante est vers la droite
for piece in Vab:
piece.coords = piece.coords[0] ,piece.coords[1]+1
piece.coords = piece.coords[0], piece.coords[1] + 1
self.tour_effectué = True
else:
print('vous ne pouvez pas effectuer cette poussée: vous navez pas assez de force de poussée')
def entrer(self):
"""
cette fonction permet d'entrer un des animaux par l'une des cases extérieures
Une case du plateau sera représentée par son abscisse et son ordonnée. Ainsi, une case extérieure
contient un 1 et/ou un 5 (dans le cas d'un plateau de taille 5*5)
"""
if self.coords[0] in [0,1,2,3,4] and self.coords[1] in [0,1,2,3,4]:
print ('la piece est déjà rentrée sur le plateau')
if self.coords[0] in [0, 1, 2, 3, 4] and self.coords[1] in [0, 1, 2, 3, 4]:
print('la piece est déjà rentrée sur le plateau')
else:
bool = True
while bool :
i= int(input('entrer la nouvelle abscisse : '))
j = int(input('entrer la nouvelle ordonnée : '))
if (i == 0 or i == 4) or (j == 4 or j ==0) :
self.coords = i, j
self.changement_orientation()
self.tour_effectué = True
i = int(input('entrer la nouvelle abscisse : '))
j = int(input('entrer la nouvelle ordonnée : '))
bool = False
else :
print ('une pièce ne peut entrer sur le plateau que sur une case extérieure : rééssayez ')
if (i == 0 or i == 4) or (j == 4 or j == 0):
self.coords = i, j
self.changement_orientation()
self.tour_effectué = True
print("votre pièce %c%i est entrée à la position %s, orientée vers %c" % (
self.car(),self.numero, self.coords, self.orientation))
else:
print('une pièce ne peut entrer sur le plateau que sur une case extérieure : rééssayez ')
def entrer_en_poussant(self):
if self.coords[0] in [0,1,2,3,4] and self.coords[1] in [0,1,2,3,4]:
print ('la piece est déjà rentrée sur le plateau')
if self.coords[0] in [0, 1, 2, 3, 4] and self.coords[1] in [0, 1, 2, 3, 4]:
print('la piece est déjà rentrée sur le plateau')
else:
bool = True
while bool :
i= int(input('entrer la nouvelle abscisse : '))
j = int(input('entrer la nouvelle ordonnée : '))
if i == -1 or i == 5 or j == -1 or j ==5 :
self.coords = i, j
self.changement_orientation()
self.pousser()
self.tour_effectué = True
bool = False
else :
print ('pour rentrer en poussant, vous devez mettre la piece sur une case extérieure au plateau, la mettre dans la bonne orientation et pousser ')
print("votre pièce %c%i est entrée à la position %s, orientée vers %c" % (
self.car(),self.numero, self.coords, self.orientation))
i = int(input('entrer la nouvelle abscisse : '))
j = int(input('entrer la nouvelle ordonnée : '))
if i == -1 or i == 5 or j == -1 or j == 5:
self.coords = i, j
self.changement_orientation()
self.tour_effectué = False
self.pousser()
if self.tour_effectué==False: #ca veut dire que la pièce n'a pas pu entrer correctement
self.sortir() #on remet la piece à sa position initiale
self.tour_effectué=False # au final le tour n'est pas joué
else:
print('pour rentrer en poussant, vous devez mettre la piece sur une case extérieure au plateau, la mettre dans la bonne orientation et pousser ')
# if randint(0,2) == 0:
# if randint(0,2) == 0:
......@@ -280,23 +257,15 @@ class Animal(Piece,metaclass = ABCMeta):
# self.coords = randint(0,self.plateau.xmax) , self.plateau.xmax
# self.orientation = orientation_possible[randint(0, len(orientation_possible))]
def sortir(self):
if self.coords[0] in [0,1,2,3,4] and self.coords[1] in [0,1,2,3,4]:
self.tour_effectué = True
if self.car() == 'R':
self.coords = -2, self.numero
else :
self.coords = 6, self.numero
print("votre pièce %c%i est sorti du plateau" % (
self.car(), self.numero))
else:
print('vous ne pouvez pas sortir une piece qui n est pas sur le plateau')
if self.car() == 'R':
self.coords = -2, self.numero
else:
self.coords = 6, self.numero
self.tour_effectué = True
def changement_orientation(self):
"""
......@@ -318,11 +287,10 @@ class Animal(Piece,metaclass = ABCMeta):
'd': 'g'}
ori = input('droite? gauche? ou demi-tour? ou rien ? ')
if ori == 'droite' :
self.orientation= tourner_droite[str(self.orientation)]
self.tour_effectué=True
if ori == 'gauche' :
if ori == 'droite':
self.orientation = tourner_droite[str(self.orientation)]
self.tour_effectué = True
if ori == 'gauche':
self.orientation = tourner_gauche[str(self.orientation)]
self.tour_effectué = True
......@@ -333,8 +301,6 @@ class Animal(Piece,metaclass = ABCMeta):
print("votre pièce %c %i est à la position %s, orienté vers %c" % (
self.car(), self.numero, self.coords, self.orientation))
def changement_position(self):
"""
La pièce ne peut que se déplacer sur une case à coté d'elle, hors diagonale,
......@@ -343,69 +309,66 @@ class Animal(Piece,metaclass = ABCMeta):
Lorsque la pièce change de case elle peut aussi changer d'orientation
"""
i = int(input('entrer la nouvelle abscisse : '))
j = int(input('entrer la nouvelle ordonnée : '))
bool2 = True # on vérifie que la case n'est pas déjà occupée
bool3 = False # on vérifie que le déplacement est bien réglementaire, c'est à dire sur une case adjacente, et pas en diagonale
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 ((i == self.coords[0] + 1 or i == self.coords[0] - 1) and j == self.coords[1] )\
or ((j == self.coords[1] + 1 or j == self.coords[1] - 1) and i == self.coords[0]):
bool3 = True
else:
print("le déplacement n'est pas réglementaire, choisir d'autres coordonnées")
bool = True
if bool2 and bool3:
self.coords = i, j
self.changement_orientation()
self.tour_effectué = True
while bool :
i= int(input('entrer la nouvelle abscisse : '))
j = int(input('entrer la nouvelle ordonnée : '))
bool2= True #on vérifie que la case n'est pas déjà occupée
bool3=False # on vérifie que le déplacement est bien réglementaire, c'est à dire sur une case adjacente, et pas en diagonale
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
else:
print("le déplacement n'est pas réglementaire, choisir d'autres coordonnées")
if ((i==self.coords[0]+1 or i==self.coords[0]-1) and j==self.coords[1] )\
or ((j==self.coords[1]+1 or j==self.coords[1]-1) and i==self.coords[0] ):
bool3=True
else:
print("le déplacement n'est pas réglementaire, choisir d'autres coordonnées")
if bool2 and bool3:
self.coords = i, j
self.changement_orientation()
bool = False
print("votre pièce %c%i est maintenant à la position %s, orienté vers %c" % (
self.car(), self.numero, self.coords, self.orientation))
self.tour_effectué = True
# def pousser(self, orientation):
#def pousser(self, orientation):
class Elephant(Animal):
nb_elephant =0 # variable de classe
def __init__ (self, abscisse, ordonnee, orientation, plateau):
nb_elephant = 0 # variable de classe
def __init__(self, abscisse, ordonnee, orientation, plateau):
super().__init__(abscisse, ordonnee, orientation, plateau)
self.numero = Elephant.nb_elephant
Elephant.nb_elephant +=1
self.nom = str(self.numero)+str(self.car())
Elephant.nb_elephant += 1
self.nom = str(self.car() + str(self.numero))
def car(self):
return 'E' #+ str(self.numero)
return 'E' # + str(self.numero)
class Rhinoceros(Animal):
nb_rhino =0 # variable de classe
def __init__ (self, abscisse, ordonnee, orientation, plateau):
nb_rhino = 0 # variable de classe
def __init__(self, abscisse, ordonnee, orientation, plateau):
super().__init__(abscisse, ordonnee, orientation, plateau)
self.numero = Rhinoceros.nb_rhino
Rhinoceros.nb_rhino +=1
self.nom=str(self.numero)+str(self.car())
Rhinoceros.nb_rhino += 1
self.nom = str(self.car() + str(self.numero))
def car(self):
return 'R' #+ str(self.numero)
return 'R' # + str(self.numero)
if __name__ == "__main__":
piece = Rhinoceros(-1, -1, 'd')
piece.sortir()
print(piece)
piece = Rhinoceros(-1,-1,'d')
piece.sortir()
print(piece)
\ No newline at end of file
......@@ -34,6 +34,7 @@ class Plateau(list):
self.ymax = ymax
self.nb_montagne = nb_montagne
self.ele = []
self.mont=[]
self.rhino = []
self.joueur1=joueur1
self.joueur2=joueur2
......@@ -62,12 +63,12 @@ class Plateau(list):
"""
pos = {}
for piece in self:
pos[piece.coords[0],piece.coords[1]] = (piece.nom,piece.orientation)
pos[piece.coords[0],piece.coords[1]] = (piece.nom+piece.orientation)
s = ""
for j in range(self.xmax):
for i in range(self.ymax):
for j in range(self.ymax):
for i in range(-2,7):
if (i, j) in pos:
s += pos[(i, j)][0]+pos[(i, j)][1] + ' '
s += pos[(i, j)]+' '
else:
s += "0 "
s += "\n"
......@@ -92,29 +93,91 @@ class Plateau(list):
# self.plateau = np.zeros([self.xmax, self.ymax], dtype=Piece)
midx, midy=self.xmax//2, self.ymax//2 # indices de la case correspondant au centre du plateau
for k in range(self.nb_montagne): # place les rochers un à un, en rangée, au milieu du plateau
self.append( Montagne ( midx, midy+k-self.nb_montagne//2, '',self))
self.mont.append( Montagne ( midx,midy+k-self.nb_montagne//2,'0 ',self))
for k in range(5):
#self.append(Elephant(5, k, 'g', self) )
self.ele.append(Elephant(6, k, 'g', self))
self.append(el for el in self.ele)
#self.append(Rhinoceros(-1, k, 'd', self))
self.rhino.append(Rhinoceros(-2, k, 'd', self))
self.append(rhino for rhino in self.ele)
def unTour(self): #permet de mettre à jour les pieeces sur le plateau
for k in range (12,2,-1):
del(self[k])
for el in self.ele:
self.append(el)
for rh in self.rhino:
self.append(rh)
for i in (self):
del(i)
for i in (self.mont):
self.append(i)
for i in (self.ele):
self.append(i)
for i in (self.rhino):
self.append(i)
def vainqueur(self):
bool=False
for m in self.mont:
if m.coords[0]==-1: #la montagne est sortie du plateau
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=='g':
winner=piece
bool=True
break
if m.coords[0]==5: #la montagne est sortie du plateau
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':
winner=piece
bool=True
break
if m.coords[1]==-1: #la montagne est sortie du plateau
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':