Séance du 14 avril 2023

This commit is contained in:
Adrien Bourmault 2023-04-14 11:25:38 +02:00
parent 85da9981d1
commit addd3606e8
No known key found for this signature in database
GPG Key ID: 6EB408FE0ACEC664
1 changed files with 190 additions and 0 deletions

190
wall_is_you.py Normal file
View File

@ -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()