#!/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) # # Doc FLTK : https://antoinemeyer.frama.io/fltk/ import random, fltk, time, os, importlib import maps import game ## VARIABLES DE CONFIGURATION TAILLE_DONJON = 6 LARGEUR_FENETRE = 800 HAUTEUR_FENETRE = 400 ## 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' : 1, 'vivant': True } ## Fonctions def selection_menu(): """ Home selection menu @params void @return path, chemin d'accès à un fichier de map """ list_maps = os.listdir("maps") fltk.cree_fenetre(LARGEUR_FENETRE, HAUTEUR_FENETRE) fltk.texte(LARGEUR_FENETRE/2, HAUTEUR_FENETRE/8, "Bienvenue dans Wall is You !", couleur="black", taille=40, ancrage='center') fltk.texte(LARGEUR_FENETRE/2, HAUTEUR_FENETRE/4, "Vous allez pouvoir sélectionner un donjon auquel jouer" " dans la liste ci-dessous." " Cliquez sur le donjon de votre choix pour y jouer.", couleur="black", taille=10, ancrage='center') fltk.texte(LARGEUR_FENETRE/2, HAUTEUR_FENETRE/3, "Tapez Echap pour quitter le jeu", couleur="green", taille=10, ancrage='center') if len(list_maps) == 0: fltk.texte(LARGEUR_FENETRE/2, HAUTEUR_FENETRE/2, "Aucun donjon jouable installé.", couleur="red", taille=30, ancrage='center') else: x1 = LARGEUR_FENETRE/40 x2 = HAUTEUR_FENETRE/2.22 y1 = HAUTEUR_FENETRE/2.22 y2 = LARGEUR_FENETRE/3 for i in range(len(list_maps)): fltk.rectangle(x1, y1, x2, y2, remplissage="white") fltk.texte(x1+(x2-x1)/2, y1+(y2-y1)/2, list_maps[i].replace(".txt", ""), couleur="blue", taille=20, ancrage='center') x1 += LARGEUR_FENETRE/4 x2 += LARGEUR_FENETRE/4 if max(x1, x2) > LARGEUR_FENETRE: x1 = LARGEUR_FENETRE/40 x2 = HAUTEUR_FENETRE/2.22 y1 += HAUTEUR_FENETRE/3.5 y2 += HAUTEUR_FENETRE/3.5 while True: event = fltk.attend_ev() if "Quitte" in fltk.type_ev(event): fltk.efface_tout() fltk.ferme_fenetre() return None if "Touche" in fltk.type_ev(event) and "Escape" in fltk.touche(event): fltk.efface_tout() fltk.ferme_fenetre() return None if "ClicGauche" in fltk.type_ev(event): # XXX à améliorer x = fltk.abscisse(event) y = fltk.ordonnee(event) x_i = LARGEUR_FENETRE/40 y_i = HAUTEUR_FENETRE/2.22 x_n = int((x - x_i) / (LARGEUR_FENETRE/4)) y_n = int((y - y_i) / (HAUTEUR_FENETRE/3.5)) if x_n+y_n*4 < 0 or x_n+y_n*4 >= len(list_maps): continue fltk.efface_tout() fltk.ferme_fenetre() return "./maps/" + list_maps[x_n+y_n*4] fltk.ferme_fenetre() return "./maps/map1.txt" def run_game(): """ Running game @params void @return void """ LARGEUR_FENETRE = 800 HAUTEUR_FENETRE = 800 fltk.cree_fenetre(LARGEUR_FENETRE, HAUTEUR_FENETRE) fltk.texte(LARGEUR_FENETRE/2, HAUTEUR_FENETRE/20, "Wall is You : map {}".format(maps.NOM_MAP), couleur="black", taille=30, ancrage='center') fltk.texte(LARGEUR_FENETRE/2, HAUTEUR_FENETRE/10, "Cliquez sur une salle pour entraîner sa rotation. " "Appuyez sur Entrée pour valider votre tour.", couleur="black", taille=10, ancrage='center') fltk.texte(LARGEUR_FENETRE/2, HAUTEUR_FENETRE/8, "Tapez Echap pour quitter le jeu", couleur="green", taille=10, ancrage='center') modeles = { (True,)*4 : "salle_4", (False, False, False, True) : "salle_1_O", (False, True, False, False) : "salle_1_E", (False, False, True, False) : "salle_1_S", (True, False, False, False) : "salle_1_N", (False, True, True, False) : "salle_2_E_S", (False, False, True, True) : "salle_2_S_O", (True, False, False, True) : "salle_2_O_N", (True, True, False, False) : "salle_2_N_E", (True, False, True, False) : "salle_2_N_S", (False, True, False, True) : "salle_2_O_E", (False, True, True, True) : "salle_3_E_S_O", (True, True, False, True) : "salle_3_O_N_E", (True, True, True, False) : "salle_3_N_E_S", (True, False, True, True) : "salle_3_S_O_N" } while True: fltk.mise_a_jour() # Affichage donjon for i in range(6): for j in range(6): fltk.image( 100+i*100, 150+j*100, 'media/{}.png'.format(modeles[donjon[i][j]]), ancrage = "nw", largeur=100, hauteur=100, tag="{},{}".format(i,j)) # Affichage aventurier fltk.image( 110+aventurier["position"][0]*100, 170+aventurier["position"][1]*100, 'media/Knight_s.png', ancrage = "nw", largeur=39, hauteur=50) # Affichage dragon for dragon in dragons: fltk.image( 143+dragon["position"][0]*100, 170+dragon["position"][1]*100, 'media/Dragon_s.png', ancrage = "nw", largeur=39, hauteur=50) event = fltk.attend_ev() if "Quitte" in fltk.type_ev(event): for i in range(6): for j in range(6): fltk.efface("{},{}".format(i,j)) fltk.ferme_fenetre() return None if "Touche" in fltk.type_ev(event) and "Escape" in fltk.touche(event): for i in range(6): for j in range(6): fltk.efface("{},{}".format(i,j)) fltk.ferme_fenetre() fltk.ferme_fenetre() return None if "Touche" in fltk.type_ev(event) and "Return" in fltk.touche(event): print("Validation tour") intent = game.intention(donjon, aventurier["position"], dragons) print(intent) if "ClicGauche" in fltk.type_ev(event): # XXX à améliorer x = fltk.abscisse(event) y = fltk.ordonnee(event) print("Clic sur coords ({},{})".format(x,y)) if x > 100 and y > 150 and x < 700 and y < 750: x_n = int((x - 100) / 100) y_n = int((y - 150) / 100) print("Rotation de salle ({},{}) demandée".format(x_n, y_n)) game.pivoter_donjon(donjon, (x_n, y_n)) ## Fonction principale def main(): while True: importlib.reload(fltk) # corrige un bug sérieux de fltk avec les images map_choice = selection_menu() if not map_choice: break else: print("chargement de {}".format(map_choice)) if maps.charger(map_choice, donjon, dragons, aventurier): run_game() else: print("Erreur de chargement de la map : {}".format(map_choice)) return 1 return 0 main()