diff --git a/wall_is_you.py b/wall_is_you.py new file mode 100644 index 0000000..961f082 --- /dev/null +++ b/wall_is_you.py @@ -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()