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