Wall_Is_You/wall_is_you.py

260 lines
8.2 KiB
Python
Executable File
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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()