Tâche 1 : debug connecte(), ajout intention(), rencontre(), fin_partie()
This commit is contained in:
parent
addd3606e8
commit
71dc09d42f
193
wall_is_you.py
193
wall_is_you.py
|
@ -11,40 +11,54 @@
|
|||
import random
|
||||
|
||||
## VARIABLES DE CONFIGURATION
|
||||
TAILLE_DONJON = 3
|
||||
TAILLE_DONJON = 6
|
||||
|
||||
## Variables globales
|
||||
|
||||
donjon = [] # liste de salles (N,E,S,O)
|
||||
dragons = [] # liste de dragons
|
||||
N = 0
|
||||
E = 1
|
||||
S = 2
|
||||
O = 3
|
||||
|
||||
aventurier = {
|
||||
'position' : (0,0)
|
||||
'niveau' : 0
|
||||
}
|
||||
|
||||
dragon0 = {
|
||||
'position' : (0,0)
|
||||
'niveau' : 0
|
||||
'position' : (0,0),
|
||||
'niveau' : 1,
|
||||
'vivant': True
|
||||
}
|
||||
|
||||
## Fonctions utilitaires
|
||||
|
||||
def créer_salle():
|
||||
"""
|
||||
"""
|
||||
Créer une salle aléatoire
|
||||
@params void
|
||||
@return une salle, tuple de taille 4
|
||||
"""
|
||||
res0 = True if (random.random() * 100 > 50) else False
|
||||
res1 = True if (random.random() * 100 > 50) else False
|
||||
res2 = True if (random.random() * 100 > 50) else False
|
||||
res3 = True if (random.random() * 100 > 50) else False
|
||||
res0 = True if random.random() * 100 > 50 else False
|
||||
res1 = True if random.random() * 100 > 50 else False
|
||||
res2 = True if random.random() * 100 > 50 else False
|
||||
res3 = True if random.random() * 100 > 50 else False
|
||||
|
||||
return (res0, res1, res2, res3)
|
||||
|
||||
def créer_dragon(pos):
|
||||
"""
|
||||
Créer un dragon dans la salle @pos
|
||||
@params pos, un tuple
|
||||
@return un dragon, dictionnaire
|
||||
"""
|
||||
niveau = 0
|
||||
|
||||
while niveau == 0:
|
||||
niveau = int(random.random() * 20)
|
||||
for dragon in dragons:
|
||||
if dragon["niveau"] == niveau:
|
||||
niveau = 0
|
||||
break
|
||||
|
||||
return { 'position' : pos, 'niveau' : niveau }
|
||||
|
||||
def peupler_donjon():
|
||||
"""
|
||||
|
@ -53,9 +67,20 @@ def peupler_donjon():
|
|||
@return void
|
||||
"""
|
||||
global donjon
|
||||
global dragons
|
||||
|
||||
donjon.clear()
|
||||
dragons.clear()
|
||||
|
||||
for i in range(TAILLE_DONJON):
|
||||
donjon.append(créer_salle())
|
||||
ligne = []
|
||||
for j in range(TAILLE_DONJON):
|
||||
ligne.append(créer_salle())
|
||||
|
||||
if random.random() * 100 > 75: # 25% de chance
|
||||
dragons.append(créer_dragon((i,j)))
|
||||
donjon.append(ligne)
|
||||
|
||||
|
||||
|
||||
def pivoter_donjon(donjon, position):
|
||||
|
@ -65,12 +90,12 @@ def pivoter_donjon(donjon, position):
|
|||
position, un tuple identifiant une salle
|
||||
@return void
|
||||
"""
|
||||
global donjon
|
||||
|
||||
x = position[0]
|
||||
y = position[1]
|
||||
|
||||
donjon[x][y] = donjon[x][y][-1] + donjon[x][y][:-1]
|
||||
donjon[x][y] = tuple([donjon[x][y][-1]] + list(donjon[x][y][:-1]))
|
||||
|
||||
|
||||
def connecte(donjon, pos0, pos1):
|
||||
"""
|
||||
|
@ -81,47 +106,54 @@ def connecte(donjon, pos0, pos1):
|
|||
pos1, un tuple identifiant une salle
|
||||
@return booléen
|
||||
"""
|
||||
global donjon
|
||||
|
||||
x0 = pos0[0]
|
||||
y0 = pos0[1]
|
||||
x1 = pos1[0]
|
||||
y1 = pos1[1]
|
||||
|
||||
# On vérifie les limites
|
||||
if x0 < 0 or y0 < 0 or x1 < 0 or y1 < 0:
|
||||
return False
|
||||
|
||||
if x0 >= len(donjon) or y0 >= len(donjon) or x1 >= len(donjon) or y1 >= len(donjon):
|
||||
return False
|
||||
|
||||
|
||||
# Calcul des distances
|
||||
axe0 = pos0[0]-pos1[0]
|
||||
axe1 = pos0[1]-pos1[1]
|
||||
distance = abs(axe0) + abs(axe0)
|
||||
axe0 = x0 - x1
|
||||
axe1 = y0 - y1
|
||||
distance = abs(axe0) + abs(axe1)
|
||||
|
||||
|
||||
# Vérifier l'adjacence
|
||||
if distance(pos0,pos1) > 1:
|
||||
if distance > 1:
|
||||
return False
|
||||
|
||||
# Chercher point de connexion
|
||||
if axe0 == 0:
|
||||
if axe1 < 0:
|
||||
if axe1 == 0:
|
||||
if axe0 <= -1:
|
||||
# le pôle sud de pos1 touche le pôle nord de pos0
|
||||
if not donjon[x1][y1][S] or not donjon[x0][y0][N]:
|
||||
return False
|
||||
else:
|
||||
if donjon[x1][y1][S] and donjon[x0][y0][N]:
|
||||
return True
|
||||
elif axe0 >= 1:
|
||||
# le pôle sud de pos0 touche le pôle nord de pos1
|
||||
if not donjon[x0][y0][S] or not donjon[x1][y1][N]:
|
||||
return False
|
||||
if donjon[x0][y0][S] and donjon[x1][y1][N]:
|
||||
return True
|
||||
else:
|
||||
if axe0 < 0:
|
||||
if axe1 <= -1:
|
||||
# le pôle est de pos1 touche le pôle ouest de pos0
|
||||
if not donjon[x1][y1][E] or not donjon[x0][y0][O]:
|
||||
return False
|
||||
else:
|
||||
if donjon[x1][y1][E] and donjon[x0][y0][O]:
|
||||
return True
|
||||
elif axe1 >= 1:
|
||||
# le pôle est de pos0 touche le pôle ouest de pos1
|
||||
if not donjon[x0][y0][E] or not donjon[x1][y1][O]:
|
||||
return False
|
||||
return True
|
||||
if donjon[x0][y0][E] and donjon[x1][y1][O]:
|
||||
return True
|
||||
return False
|
||||
|
||||
# XXX
|
||||
|
||||
def calcul_chemin(donjon, position, dragons, visite):
|
||||
"""
|
||||
"""
|
||||
Support récursif pour intention
|
||||
@params donjon, une liste contenant des salles
|
||||
position, un tuple identifiant une salle (dans laquelle l'aventurier
|
||||
|
@ -129,41 +161,55 @@ def calcul_chemin(donjon, position, dragons, visite):
|
|||
dragons, une liste de dragons
|
||||
@return booléen
|
||||
"""
|
||||
global visite
|
||||
|
||||
cid = int(random.random() * 100)
|
||||
print("[{} calcul_chemin()] position {} et visite {}".format(cid, position, visite))
|
||||
|
||||
résultats = []
|
||||
|
||||
# Déjà visité
|
||||
if position in visite:
|
||||
print("[{} calcul_chemin()] Déjà visité".format(cid))
|
||||
return None
|
||||
|
||||
visite.append(position) # XXX -> on doit avoir visite en global !
|
||||
else:
|
||||
visite.add(position)
|
||||
|
||||
# Cas de base
|
||||
for dragon in dragons:
|
||||
if position == dragon["position"]:
|
||||
print("[{} calcul_chemin()] Dragon trouvé".format(cid))
|
||||
return ([position], dragon["niveau"])
|
||||
|
||||
cibles = #XXX -> liste de toutes les connexions
|
||||
|
||||
for cible in cibles:
|
||||
résultats.append(calcul_chemin(donjon, cible, dragons, visite))
|
||||
# Test récursif des potentielles connexions
|
||||
x, y = position
|
||||
|
||||
if connecte(donjon, position, (x+1,y)):
|
||||
résultats.append(calcul_chemin(donjon, (x+1,y), dragons, visite))
|
||||
|
||||
if connecte(donjon, position, (x-1,y)):
|
||||
résultats.append(calcul_chemin(donjon, (x-1,y), dragons, visite))
|
||||
|
||||
if connecte(donjon, position, (x,y+1)):
|
||||
résultats.append(calcul_chemin(donjon, (x,y+1), dragons, visite))
|
||||
|
||||
if connecte(donjon, position, (x,y-1)):
|
||||
résultats.append(calcul_chemin(donjon, (x,y-1), dragons, visite))
|
||||
|
||||
# Aucun couple dans résultats
|
||||
if résultats == [None] * len(résultats):
|
||||
print("[{} calcul_chemin()] Aucun dragon trouvé".format(cid))
|
||||
return None
|
||||
else:
|
||||
print("[{} calcul_chemin()] Plusieurs candidats : {}".format(cid, résultats))
|
||||
niveau = 0
|
||||
candidat = (0,0)
|
||||
for couple in résultats:
|
||||
if couple is None:
|
||||
continue
|
||||
if couple[1] > niveau:
|
||||
niveau = couple[1]
|
||||
candidat = (couple[0], couple[1])
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
print("[{} calcul_chemin()] Meilleur candidat : {}".format(cid, candidat))
|
||||
return candidat
|
||||
|
||||
def intention(donjon, position, dragons):
|
||||
"""
|
||||
|
@ -176,12 +222,53 @@ def intention(donjon, position, dragons):
|
|||
@return liste, chemin à parcourir
|
||||
"""
|
||||
|
||||
visite = []
|
||||
niveau = 0
|
||||
visite = set()
|
||||
|
||||
return calcul_chemin(donjon, position, dragons, visite, niveau):
|
||||
return calcul_chemin(donjon, position, dragons, visite)
|
||||
|
||||
def rencontre(aventurier, dragons):
|
||||
"""
|
||||
Vérifie si l'@aventurier est à la même position qu'un dragon de @dragons et
|
||||
agit en conséquence
|
||||
@params aventurier, dictionnaire représentant un aventurier
|
||||
dragons, liste de dragons (dictionnaires)
|
||||
@return void
|
||||
"""
|
||||
versus = False
|
||||
ennemi = None
|
||||
|
||||
for dragon in dragons:
|
||||
if aventurier["position"] == dragon["position"]:
|
||||
versus = True
|
||||
ennemi = dragon
|
||||
|
||||
# Un dragon sauvage apparaît !
|
||||
if versus:
|
||||
if ennemi["niveau"] <= aventurier["niveau"]:
|
||||
# Victoire
|
||||
dragons.remove(ennemi)
|
||||
aventurier["niveau"] = aventurier["niveau"] + 1
|
||||
else:
|
||||
# Décès
|
||||
aventurier["vivant"] = False
|
||||
|
||||
def appliquer_chemin(aventurier, dragons, chemin):
|
||||
pass
|
||||
|
||||
def fin_partie(aventurier, dragons):
|
||||
"""
|
||||
@return 1 si la partie est gagnée (tous les dragons ont été tués),
|
||||
-1 si la partie est perdue (l’aventurier a été tué),
|
||||
0 si la partie continue.
|
||||
"""
|
||||
if len(dragons) == 0:
|
||||
return 1
|
||||
elif not aventurier["vivant"]:
|
||||
return -1
|
||||
else:
|
||||
return 0
|
||||
|
||||
|
||||
## Fonction principale
|
||||
|
||||
def main():
|
||||
|
|
Loading…
Reference in New Issue