2023-04-14 11:25:38 +02:00
|
|
|
|
#!/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)
|
2023-04-28 11:31:18 +02:00
|
|
|
|
#
|
|
|
|
|
# Doc FLTK : https://antoinemeyer.frama.io/fltk/
|
2023-05-21 16:45:56 +02:00
|
|
|
|
import random, fltk, time, os, importlib
|
2023-05-10 10:09:36 +02:00
|
|
|
|
import maps
|
|
|
|
|
import game
|
2023-04-14 11:25:38 +02:00
|
|
|
|
|
|
|
|
|
## VARIABLES DE CONFIGURATION
|
2023-04-27 11:24:19 +02:00
|
|
|
|
TAILLE_DONJON = 6
|
2023-05-10 10:09:36 +02:00
|
|
|
|
LARGEUR_FENETRE = 800
|
|
|
|
|
HAUTEUR_FENETRE = 400
|
2023-04-14 11:25:38 +02:00
|
|
|
|
|
|
|
|
|
## Variables globales
|
|
|
|
|
|
|
|
|
|
donjon = [] # liste de salles (N,E,S,O)
|
2023-04-27 11:24:19 +02:00
|
|
|
|
dragons = [] # liste de dragons
|
2023-04-14 11:25:38 +02:00
|
|
|
|
N = 0
|
|
|
|
|
E = 1
|
|
|
|
|
S = 2
|
|
|
|
|
O = 3
|
|
|
|
|
|
|
|
|
|
aventurier = {
|
2023-04-27 11:24:19 +02:00
|
|
|
|
'position' : (0,0),
|
|
|
|
|
'niveau' : 1,
|
|
|
|
|
'vivant': True
|
2023-04-14 11:25:38 +02:00
|
|
|
|
}
|
|
|
|
|
|
2023-05-10 10:09:36 +02:00
|
|
|
|
## Fonctions
|
|
|
|
|
def selection_menu():
|
2023-04-27 11:24:19 +02:00
|
|
|
|
"""
|
2023-05-10 10:09:36 +02:00
|
|
|
|
Home selection menu
|
2023-04-14 11:25:38 +02:00
|
|
|
|
@params void
|
2023-05-10 10:09:36 +02:00
|
|
|
|
@return path, chemin d'accès à un fichier de map
|
2023-04-14 11:25:38 +02:00
|
|
|
|
"""
|
2023-04-27 11:24:19 +02:00
|
|
|
|
|
2023-05-10 10:09:36 +02:00
|
|
|
|
list_maps = os.listdir("maps")
|
2023-04-27 11:24:19 +02:00
|
|
|
|
|
2023-05-10 10:09:36 +02:00
|
|
|
|
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')
|
2023-04-14 11:25:38 +02:00
|
|
|
|
else:
|
2023-05-10 10:09:36 +02:00
|
|
|
|
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()
|
2023-04-27 11:24:19 +02:00
|
|
|
|
|
2023-05-10 10:09:36 +02:00
|
|
|
|
if "Quitte" in fltk.type_ev(event):
|
2023-05-21 16:45:56 +02:00
|
|
|
|
fltk.efface_tout()
|
2023-05-10 10:09:36 +02:00
|
|
|
|
fltk.ferme_fenetre()
|
|
|
|
|
return None
|
2023-04-27 11:24:19 +02:00
|
|
|
|
|
2023-05-10 10:09:36 +02:00
|
|
|
|
if "Touche" in fltk.type_ev(event) and "Escape" in fltk.touche(event):
|
2023-05-21 16:45:56 +02:00
|
|
|
|
fltk.efface_tout()
|
2023-05-10 10:09:36 +02:00
|
|
|
|
fltk.ferme_fenetre()
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
if "ClicGauche" in fltk.type_ev(event):
|
2023-05-10 10:13:30 +02:00
|
|
|
|
# XXX à améliorer
|
2023-05-10 10:09:36 +02:00
|
|
|
|
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):
|
2023-04-27 11:24:19 +02:00
|
|
|
|
continue
|
2023-05-10 10:09:36 +02:00
|
|
|
|
|
2023-05-21 16:45:56 +02:00
|
|
|
|
fltk.efface_tout()
|
2023-05-10 10:09:36 +02:00
|
|
|
|
fltk.ferme_fenetre()
|
|
|
|
|
return "./maps/" + list_maps[x_n+y_n*4]
|
2023-04-28 11:05:41 +02:00
|
|
|
|
|
2023-05-10 10:09:36 +02:00
|
|
|
|
fltk.ferme_fenetre()
|
|
|
|
|
return "./maps/map1.txt"
|
2023-04-28 11:05:41 +02:00
|
|
|
|
|
2023-05-10 10:09:36 +02:00
|
|
|
|
def run_game():
|
2023-04-28 11:05:41 +02:00
|
|
|
|
"""
|
2023-05-10 10:09:36 +02:00
|
|
|
|
Running game
|
2023-04-28 11:05:41 +02:00
|
|
|
|
@params void
|
2023-05-10 10:09:36 +02:00
|
|
|
|
@return void
|
2023-04-28 11:05:41 +02:00
|
|
|
|
"""
|
2023-04-14 11:25:38 +02:00
|
|
|
|
|
2023-05-21 16:45:56 +02:00
|
|
|
|
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
|
2023-04-14 11:25:38 +02:00
|
|
|
|
def main():
|
2023-05-10 10:09:36 +02:00
|
|
|
|
while True:
|
2023-05-21 16:45:56 +02:00
|
|
|
|
importlib.reload(fltk) # corrige un bug sérieux de fltk avec les images
|
2023-05-10 10:09:36 +02:00
|
|
|
|
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:
|
2023-05-21 16:45:56 +02:00
|
|
|
|
print("Erreur de chargement de la map : {}".format(map_choice))
|
2023-05-10 10:09:36 +02:00
|
|
|
|
return 1
|
|
|
|
|
|
2023-04-14 11:25:38 +02:00
|
|
|
|
return 0
|
|
|
|
|
|
|
|
|
|
main()
|