Séance du 14 avril 2023
This commit is contained in:
parent
85da9981d1
commit
addd3606e8
|
@ -0,0 +1,190 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
# Concept :
|
||||
# - Donjon : action par tour, manipule des salles
|
||||
# - Salles : passages vers des directions cardinales, contiennent des dragons
|
||||
# - Dragons : plusieurs niveaux, tous différents
|
||||
#
|
||||
# - Aventurier : déplacement tour par tour de salle en salle vers l'intention
|
||||
# - Intention : cible le dragon le plus fort accessible (orgueil)
|
||||
|
||||
import random
|
||||
|
||||
## VARIABLES DE CONFIGURATION
|
||||
TAILLE_DONJON = 3
|
||||
|
||||
## Variables globales
|
||||
|
||||
donjon = [] # liste de salles (N,E,S,O)
|
||||
N = 0
|
||||
E = 1
|
||||
S = 2
|
||||
O = 3
|
||||
|
||||
aventurier = {
|
||||
'position' : (0,0)
|
||||
'niveau' : 0
|
||||
}
|
||||
|
||||
dragon0 = {
|
||||
'position' : (0,0)
|
||||
'niveau' : 0
|
||||
}
|
||||
|
||||
## 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
|
||||
return (res0, res1, res2, res3)
|
||||
|
||||
|
||||
def peupler_donjon():
|
||||
"""
|
||||
Créer l'état initial du donjon au début du jeu
|
||||
@params void
|
||||
@return void
|
||||
"""
|
||||
global donjon
|
||||
|
||||
for i in range(TAILLE_DONJON):
|
||||
donjon.append(créer_salle())
|
||||
|
||||
|
||||
def pivoter_donjon(donjon, position):
|
||||
"""
|
||||
Pivote la salle pointée par @position dans @donjon
|
||||
@params donjon, une liste contenant des salles
|
||||
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]
|
||||
|
||||
def connecte(donjon, pos0, pos1):
|
||||
"""
|
||||
Vérifie que les salles pointées par @pos0 et @pos1 dans @donjon
|
||||
sont adjacentes et connectées
|
||||
@params donjon, une liste contenant des salles
|
||||
pos0, un tuple identifiant une salle
|
||||
pos1, un tuple identifiant une salle
|
||||
@return booléen
|
||||
"""
|
||||
global donjon
|
||||
|
||||
x0 = pos0[0]
|
||||
y0 = pos0[1]
|
||||
x1 = pos1[0]
|
||||
y1 = pos1[1]
|
||||
|
||||
# Calcul des distances
|
||||
axe0 = pos0[0]-pos1[0]
|
||||
axe1 = pos0[1]-pos1[1]
|
||||
distance = abs(axe0) + abs(axe0)
|
||||
|
||||
# Vérifier l'adjacence
|
||||
if distance(pos0,pos1) > 1:
|
||||
return False
|
||||
|
||||
# Chercher point de connexion
|
||||
if axe0 == 0:
|
||||
if axe1 < 0:
|
||||
# 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:
|
||||
# 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
|
||||
else:
|
||||
if axe0 < 0:
|
||||
# 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:
|
||||
# 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
|
||||
|
||||
# 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
|
||||
se trouve)
|
||||
dragons, une liste de dragons
|
||||
@return booléen
|
||||
"""
|
||||
global visite
|
||||
|
||||
résultats = []
|
||||
|
||||
# Déjà visité
|
||||
if position in visite:
|
||||
return None
|
||||
|
||||
visite.append(position) # XXX -> on doit avoir visite en global !
|
||||
|
||||
# Cas de base
|
||||
for dragon in dragons:
|
||||
if position == dragon["position"]:
|
||||
return ([position], dragon["niveau"])
|
||||
|
||||
cibles = #XXX -> liste de toutes les connexions
|
||||
|
||||
for cible in cibles:
|
||||
résultats.append(calcul_chemin(donjon, cible, dragons, visite))
|
||||
|
||||
# Aucun couple dans résultats
|
||||
if résultats == [None] * len(résultats):
|
||||
return None
|
||||
else:
|
||||
niveau = 0
|
||||
candidat = (0,0)
|
||||
for couple in résultats:
|
||||
if couple[1] > niveau:
|
||||
niveau = couple[1]
|
||||
candidat = (couple[0], couple[1])
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def intention(donjon, position, dragons):
|
||||
"""
|
||||
Calcule récursivement le chemin à parcourir jusqu'à un dragon du plus haut
|
||||
niveau accessible
|
||||
@params donjon, une liste contenant des salles
|
||||
position, un tuple identifiant une salle (dans laquelle l'aventurier
|
||||
se trouve)
|
||||
dragons, une liste de dragons
|
||||
@return liste, chemin à parcourir
|
||||
"""
|
||||
|
||||
visite = []
|
||||
niveau = 0
|
||||
|
||||
return calcul_chemin(donjon, position, dragons, visite, niveau):
|
||||
|
||||
|
||||
## Fonction principale
|
||||
|
||||
def main():
|
||||
return 0
|
||||
|
||||
main()
|
Loading…
Reference in New Issue