Commit bd477c6c authored by Théo BOUTEMY's avatar Théo BOUTEMY
Browse files

le jeu est en gros ok

le vainqueur s'affiche
il manque les tests
parent f72d12b8
......@@ -10,7 +10,7 @@ class Joueur(metaclass = ABCMeta):
def __init__(self, plateau):
self.plateau=plateau
self.winner=False
@abstractmethod
def pieces_du_joueur(self):
......@@ -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()
......@@ -61,19 +66,9 @@ class Joueur(metaclass = ABCMeta):
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é
bool=self.pieces_du_joueur()[n].tour_effectué
elif coup== 'orientation':
......@@ -96,7 +91,8 @@ class Joueur(metaclass = ABCMeta):
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 +101,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.tour_effectué=False
self.plateau = plateau
self.tour_effectué = False
def __str__(self):
"""
......@@ -63,11 +58,11 @@ class Montagne(Piece):
"""
classe spécifiant Piece pour représenter une montagne
"""
def __init__ (self, abscisse, ordonnee, orientation, plateau):
def __init__(self, abscisse, ordonnee, orientation, plateau):
super().__init__(abscisse, ordonnee, orientation, plateau)
self.nom = str(self.car())
def car(self):
"""
Renvoie : str
......@@ -76,12 +71,10 @@ class Montagne(Piece):
return 'M'
class Animal(Piece,metaclass = ABCMeta):
def __init__ (self, abscisse, ordonnee, orientation, plateau):
class Animal(Piece, metaclass=ABCMeta):
def __init__(self, abscisse, ordonnee, orientation, plateau):
super().__init__(abscisse, ordonnee, orientation, plateau)
@abstractmethod
def car(self):
"""
......@@ -91,55 +84,52 @@ 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:
......@@ -157,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:
......@@ -180,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:
......@@ -203,74 +193,57 @@ 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 : '))
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) :
if (i == 0 or i == 4) or (j == 4 or j == 0):
self.coords = i, j
self.changement_orientation()
self.tour_effectué = True
bool = False
else :
print ('une pièce ne peut entrer sur le plateau que sur une case extérieure : rééssayez ')
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 : '))
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 :
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()
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 ')
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:
......@@ -287,22 +260,17 @@ 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):
self.tour_effectué = True
if self.car() == 'R':
self.coords = -2, self.numero
else :
else:
self.coords = 6, self.numero
print("votre pièce %c%i est sorti du plateau" % (
self.car(), self.numero))
def changement_orientation(self):
"""
la pièce change d'orientation
......@@ -323,11 +291,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
......@@ -338,8 +305,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,
......@@ -351,20 +316,19 @@ class Animal(Piece,metaclass = ABCMeta):
bool = True
while bool :
i= int(input('entrer la nouvelle abscisse : '))
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):
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
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
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")
......@@ -374,46 +338,40 @@ class Animal(Piece,metaclass = ABCMeta):
self.changement_orientation()
bool = False
self.tour_effectué = True
#def pousser(self, orientation):
# def pousser(self, orientation):
class Elephant(Animal):
nb_elephant = 0 # variable de classe
nb_elephant =0 # variable de classe
def __init__ (self, abscisse, ordonnee, orientation, plateau):
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.car()+str(self.numero))
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
nb_rhino =0 # variable de classe
def __init__ (self, abscisse, ordonnee, orientation, plateau):
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.car()+str(self.numero))
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
......@@ -165,18 +165,14 @@ class Plateau(list):
if bool==True and winner.car()=='R':
# self.ele=[]
# self.mont=[]
# self.rhino=[]
print('partie finie, le vainqueur est', self.joueur2(self).nom)
for piece in self:
piece='F'
if bool== True and winner.car()=='E' :
# self.ele = []
# self.mont = []
# self.rhino = []
print ('partie finie, le vainqueur est', self.joueur1(self).nom)
for piece in self:
......@@ -234,3 +230,4 @@ class Plateau(list):
if __name__ == "__main__":
plateau = Plateau(xmax=5, ymax=5, nb_montagne=3, joueur1=Theo, joueur2=Pauline)
Plateau.jouer(plateau)
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment