Pieges/piege.py

259 lines
8.4 KiB
Python
Raw 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 game
## VARIABLES DE CONFIGURATION
LARGEUR_FENETRE = 900
HAUTEUR_FENETRE = 900
OFFSET_X = 230
OFFSET_Y = 100
DIM = game.DIM
VERTICAL = game.VERTICAL
HORIZONTAL = game.HORIZONTAL
PLACEMENT=0
TIRETTES=1
FIN=2
def run_game(joueur1, joueur2, plateau):
"""
Running game
@params joueur1, joueur2, players (class Joueur)
plateau, game board (class Plateau)
@return void
"""
# A variable that allows to store/check the current phase during the game
gamephase = PLACEMENT
retry = False
# Current player (XXX, joueur1 commence toujours)
currentplayer = joueur1
nextplayer = joueur2
fltk.cree_fenetre(LARGEUR_FENETRE, HAUTEUR_FENETRE)
fltk.texte(LARGEUR_FENETRE/2, HAUTEUR_FENETRE/20,
"Pièges",
couleur="black",
taille=30,
ancrage='center')
modeles = {
"tirette_horiz":"sprites/tirette.png",
"barre_horiz":"sprites/barre.png",
"tirette_vert":"sprites/tirette2.png",
"barre_vert":"sprites/barre2.png",
"bille1":"sprites/bille1.png",
"bille2":"sprites/bille2.png",
"tour_de_plateau":"sprites/bois3.png",
"case1":"sprites/bois1.png",
"case2":"sprites/bois2.png",
"trou": "sprites/trou.png",
"trou_horiz": "sprites/trou_partiel1.png",
"trou_vert": "sprites/trou_partiel2.png"
}
# Boucle principale
while gamephase != FIN:
fltk.mise_a_jour()
plateau.mise_à_jour()
if not retry:
# inversion des rôles
currentplayer, nextplayer = nextplayer, currentplayer
if currentplayer is joueur1:
strjoueur = "joueur1"
elif currentplayer is joueur2:
strjoueur = "joueur2"
if gamephase == PLACEMENT:
strphase = "placement des billes"
elif gamephase == TIRETTES:
strphase = "manipulation des tirettes"
fltk.efface("joueur")
fltk.texte(LARGEUR_FENETRE/2, HAUTEUR_FENETRE/10,
"Phase {} : au tour du {}".format(strphase, strjoueur),
couleur="green",
taille=10,
ancrage='center',
tag="joueur")
else:
retry = False
# Affichage plateau
# Tirettes verticales
for i in range(DIM):
#XXX récupérer la position de la tirette -> n
# boucler x fois pour afficher des barres
n = plateau.tirettes[0][i].position
fltk.image( OFFSET_X + (i+1)*62,
OFFSET_Y + (DIM+1)*62 + n*30,
modeles["tirette_vert"],
ancrage = "center",
largeur=50,
hauteur=50,
tag="{}".format(i))
for x in range(n):
fltk.image( OFFSET_X + (i+1)*62,
OFFSET_Y + (DIM+1)*62 + x*30,
modeles["barre_vert"],
ancrage = "center",
largeur=50,
hauteur=50,
tag="{}".format(i))
# Tirettes horizontales
for j in range(DIM):
#XXX récupérer la position de la tirette -> n
# boucler x fois pour afficher des barres
n = plateau.tirettes[1][j].position
fltk.image( OFFSET_X + 20 + (0)*62 - n*30,
OFFSET_Y + 20 + (j+1)*62,
modeles["tirette_horiz"],
ancrage = "center",
largeur=55,
hauteur=55,
tag="{}".format(i))
for x in range(n):
fltk.image( OFFSET_X + 20 + (0)*62 - x*30,
OFFSET_Y + 20 + (j+1)*62,
modeles["barre_horiz"],
ancrage = "center",
largeur=50,
hauteur=50,
tag="{}".format(i))
# Plateau
for i in range(0,DIM):
for j in range(0,DIM):
# Choix du type de sprite selon position
if (i+j) % 2 == 0:
type_modele = "case1"
else:
type_modele = "case2"
fltk.image( OFFSET_X + 2 + (i+1)*62,
OFFSET_Y + 20 + (j+1)*62,
modeles[type_modele],
ancrage = "center",
largeur=60,
hauteur=60,
tag="{},{}".format(i,j))
potentiel_trou = plateau.est_ce_un_trou(i,j)
if potentiel_trou != 0:
if potentiel_trou == 2:
modele_trou = modeles["trou"]
elif potentiel_trou == HORIZONTAL:
modele_trou = modeles["trou_horiz"]
elif potentiel_trou == VERTICAL:
modele_trou = modeles["trou_vert"]
fltk.image( OFFSET_X + 2 + (i+1)*62,
OFFSET_Y + 20 + (j+1)*62,
modele_trou,
ancrage = "center",
largeur=60,
hauteur=60,
tag="{},{}".format(i,j))
# Billes
for bille in plateau.billes:
if bille[2] is joueur1:
fltk.image( OFFSET_X + 2 + (bille[0]+1)*62,
OFFSET_Y + 20 + (bille[1]+1)*62,
modeles["bille1"],
ancrage = "center",
largeur=30,
hauteur=30,
tag="{},{}".format(i,j))
if bille[2] is joueur2:
fltk.image( OFFSET_X + 2 + (bille[0]+1)*62,
OFFSET_Y + 20 + (bille[1]+1)*62,
modeles["bille2"],
ancrage = "center",
largeur=30,
hauteur=30,
tag="{},{}".format(i,j))
#XXX Affichage instructions liées au mode de jeu
fltk.mise_a_jour()
event = fltk.attend_ev()
if "Quitte" in fltk.type_ev(event):
for i in range(DIM):
for j in range(DIM):
fltk.efface("{},{}".format(i,j))
fltk.ferme_fenetre()
return
if "Touche" in fltk.type_ev(event) and "Escape" in fltk.touche(event):
for i in range(DIM):
for j in range(DIM):
fltk.efface("{},{}".format(i,j))
fltk.ferme_fenetre()
return
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 gamephase == PLACEMENT:
i = int( (x - OFFSET_X - 2 + 62/2)/62 - 1)
j = int( (y - OFFSET_Y - 20 + 62/2)/62 - 1)
if i<DIM and j<DIM and i>=0 and j>=0:
print(" case {},{}".format(i,j))
retry = not currentplayer.placer_bille(i,j)
if len(plateau.billes) == 10:
gamephase = TIRETTES
elif gamephase == TIRETTES:
# XXX
i = int( (x - OFFSET_X - 2 + 62/2)/62 - 1)
j = int( (y - OFFSET_Y - 20 + 62/2)/62 - 1)
print(" case {},{}".format(i,j))
## Fonction principale
def main():
importlib.reload(fltk) # corrige un bug sérieux de fltk avec les images
plateau = game.Plateau()
joueur1 = game.Joueur(plateau)
joueur2 = game.Joueur(plateau)
run_game(joueur1, joueur2, plateau)
return 0
main()