punisher0785
Messages postés12Date d'inscriptionmardi 20 avril 2021StatutMembreDernière intervention 7 mai 2021
-
Modifié le 26 avril 2021 à 14:15
Gandalfix
Messages postés60Date d'inscriptionvendredi 12 juin 2020StatutMembreDernière intervention 8 mai 2023
-
17 mai 2021 à 11:23
Bonjour, voici un code qui fait un jeu ou il faut ouvrir des portes en répondant à des énigmes, jusqu'a une statue ou l'on gagne. le seul problème c'est que je n'arrive pas à coder l'énigme quand on et sur la porte et que la porte disparaisse si la réponse est juste ou que la porte reste et que le personnage recule d'une case si c'est faux. Est ce que quelqun saurait comment faire ?
voici le code:
from tkinter import *
from tkinter import ttk
from tkinter.messagebox import *
from tkinter.simpledialog import *
import time
import sys
import os
## Fonctions et procédures
def droite (event):
global jeu, posX, posY, direction, niveau_fini
## On ne se préoccupe que des déplacements possibles
## Mouvement possible si niveau non fini
if niveau_fini==False:
## Bonne direction ?
if direction=='D':
## case de droite existante
if posX<14:
## Case de droite vide
if jeu[posY][posX+1]=='V':
## On change les coordonnées du personnage
posX=posX+1
## On place le personnage
jeu[posY][posX]='D'
## On modifie l'ancienne case (vide)
jeu[posY][posX-1]='V'
## Case de droite avec une caisse
elif jeu[posY][posX+1]=='C':
## On regarde si on a une case après
if posX<13 :
## On regarde si cette case est vide
if jeu[posY][posX+2]=='V':
## On déplace la caisse
jeu[posY][posX+2]='V'
## On change les coordonnée du personnage
posX=posX+1
## On place le personnage
jeu[posY][posX]='D'
# On modifie l'ancienne case (vide)
jeu[posY][posX-1]='V'
## Case de droite avec la sortie
elif jeu[posY][posX+1]=='O':
## On met case vide
jeu[posY][posX]='V'
## On met sortie + perso sur nouvelle case
jeu[posY][posX+1]='E'
## on déclare le niveau terminé
niveau_fini=True
## On affiche le tout
affichage(canv)
dialogue_question()
## Si direction autre que droite
else :
direction='D'
jeu[posY][posX]=direction
## On affiche le tout
affichage(canv)
def gauche(event):
global jeu, posX, posY, direction, niveau_fini
## On ne se préoccupe que des déplacements possibles
## Mouvement possible si niveau non fin
if niveau_fini==False:
## Bonne direction ?
if direction=='G':
## case de gauche existante
if posX>0:
## Case de gauche vide
if jeu[posY][posX-1]=='V':
## On change les coordonnées du personnage
posX=posX-1
## On place le personnage
jeu[posY][posX]='G'
## On modifie l'ancienne case (vide)
jeu[posY][posX+1]='V'
## Case de gauche avec une caisse
elif jeu[posY][posX-1]=='C':
## On regarde si on a une case après
if posX>1 :
## On regarde si cette case est vide
if jeu[posY][posX-2]=='V':
## On déplace la caisse
jeu[posY][posX-2]='V'
## On change les coordonnée du personnage
posX=posX-1
## On place le personnage
jeu[posY][posX]='G'
# On modifie l'ancienne case (vide)
jeu[posY][posX+1]='V'
## Case de gauche avec la sortie
elif jeu[posY][posX-1]=='O':
## On met case vide
jeu[posY][posX]='V'
## On met sortie + perso sur nouvelle case
jeu[posY][posX-1]='K'
## On déclare le niveau terminé
niveau_fini=True
## On affiche le tout
affichage(canv)
dialogue_question()
## Si direction autre que gauche
else :
direction='G'
jeu[posY][posX]=direction
## On affiche le tout
affichage(canv)
## On met le focus sur création de niveau
def haut(event):
global jeu, posX, posY, direction, niveau_fini
## On ne se préoccupe que des déplacements possibles
## Mouvement possible si niveau non fin
if niveau_fini==False:
## Bonne direction ?
if direction=='H':
## case du haut existante
if posY>0:
## Case du haut vide
if jeu[posY-1][posX]=='V':
## On change les coordonnées du personnage
posY=posY-1
## On place le personnage
jeu[posY][posX]='H'
## On modifie l'ancienne case (vide)
jeu[posY+1][posX]='V'
## Case du haut avec une caisse
elif jeu[posY-1][posX]=='C':
## On regarde si on a une case après
if posY>1 :
## On regarde si cette case est vide
if jeu[posY-2][posX]=='V':
## On déplace la caisse
jeu[posY-2][posX]='V'
## On change les coordonnée du personnage
posY=posY-1
## On place le personnage
jeu[posY][posX]='H'
# On modifie l'ancienne case (vide)
jeu[posY+1][posX]='V'
## Case du haut avec la sortie
elif jeu[posY-1][posX]=='O':
## On met case vide
jeu[posY][posX]='V'
## On met sortie + perso sur nouvelle case
jeu[posY-1][posX]='I'
## On déclare le niveau terminé
niveau_fini=True
## On affiche le tout
affichage(canv)
dialogue_question()
## Si direction autre que haut
else :
direction='H'
jeu[posY][posX]=direction
## On affiche le tout
affichage(canv)
## On met le focus sur création de niveau
def bas(event):
global jeu, posX, posY, direction, niveau_fini
## On ne se préoccupe que des déplacements possibles
## Mouvement possible si niveau non fin
if niveau_fini==False:
## Bonne direction ?
if direction=='B':
## case du bas existante
if posY<14:
## Case du bas vide
if jeu[posY+1][posX]=='V':
## On change les coordonnées du personnage
posY=posY+1
## On place le personnage
jeu[posY][posX]='B'
## On modifie l'ancienne case (vide)
jeu[posY-1][posX]='V'
## Case du bas avec une caisse
elif jeu[posY+1][posX]=='C':
## On regarde si on a une case après
if posY<13 :
## On regarde si cette case est vide
if jeu[posY+2][posX]=='V':
## On déplace la caisse
jeu[posY+2][posX]='V'
## On change les coordonnée du personnage
posY=posY+1
## On place le personnage
jeu[posY][posX]='B'
# On modifie l'ancienne case (vide)
jeu[posY-1][posX]='V'
## Case du bas avec la sortie
elif jeu[posY+1][posX]=='O':
## On met case vide
jeu[posY][posX]='V'
## On met sortie + perso sur nouvelle case
jeu[posY+1][posX]='J'
## On déclare le niveau terminé
niveau_fini=True
## On affiche le tout
affichage(canv)
dialogue_question()
## Si direction autre que bas
else :
direction='B'
jeu[posY][posX]=direction
## On affiche le tout
affichage(canv)
## On met le focus sur création de niveau
def reinitialiser():
combo_change()
def combo_change(event=None):
ouverture_fichier(Niveau.niv)
def ouverture_fichier(fi):
global jeu, listejeu
fich= open(fi,'r')
if fi=='Modèle.niv':
listejeu[:]=[]
for ligne in fich :
a=ligne.rstrip('\n\r')
listejeu.append(list(a))
else:
jeu[:]=[]
for ligne in fich :
a=ligne.rstrip('\n\r')
jeu.append(list(a))
fich.close()
def affichage(can):
global jeu, posX, posY, direction
can.delete(ALL)
y=0
x=0
while y<15:
while x <15:
if jeu[y][x]=='M':
can.create_image(x*50,y*50,image=mur,anchor='nw')
elif jeu[y][x]=='C':
can.create_image(x*50,y*50,image=caisse,anchor='nw')
elif jeu[y][x]=='O':
can.create_image(x*50,y*50,image=sortie,anchor='nw')
elif jeu[y][x]=='H':
can.create_image(x*50,y*50,image=persoH,anchor='nw')
posX=x
posY=y
direction='H'
elif jeu[y][x]=='D':
can.create_image(x*50,y*50,image=persoD,anchor='nw')
posX=x
posY=y
direction='D'
elif jeu[y][x]=='B':
can.create_image(x*50,y*50,image=persoB,anchor='nw')
posX=x
posY=y
direction='B'
elif jeu[y][x]=='G':
can.create_image(x*50,y*50,image=persoG,anchor='nw')
posX=x
posY=y
direction='G'
elif jeu[y][x]=='J':
can.create_image(x*50,y*50,image=sortie,anchor='nw')
can.create_image(x*50,y*50,image=persoB,anchor='nw')
elif jeu[y][x]=='K':
can.create_image(x*50,y*50,image=sortie,anchor='nw')
can.create_image(x*50,y*50,image=persoG,anchor='nw')
elif jeu[y][x]=='E':
can.create_image(x*50,y*50,image=sortie,anchor='nw')
can.create_image(x*50,y*50,image=persoD,anchor='nw')
elif jeu[y][x]=='I':
can.create_image(x*50,y*50,image=sortie,anchor='nw')
can.create_image(x*50,y*50,image=persoH,anchor='nw')
x=x+1
x=0
y=y+1
def quitter_fen():
## Quitter le jeu
reponse = tkinter.messagebox.askyesno("Terminer le jeu","Voulez-vous réellement quitter ? \n Cliquer « Oui » pour finir")
if reponse :
## On quitte le programme
fen.quit()
def dialogue_question():
global nbre_niveau, listecombo
reponse = tkinter.messagebox.showinfo("BRAVO!!!","Vous avez réussi le jeu avec succès!")
fen.quit()
## Fin fonctions et procédures
fen=Tk()
## Variables et Images
fonte=('Arial',11,'bold')
posX=0
posY=0
niveau_fini=False
persoD=PhotoImage(file='D.png')
mini_persoD=PhotoImage(file='mini_D.png')
persoH=PhotoImage(file='H.png')
mini_persoH=PhotoImage(file='mini_H.png')
persoG=PhotoImage(file='G.png')
mini_persoG=PhotoImage(file='mini_G.png')
persoB=PhotoImage(file='B.png')
mini_persoB=PhotoImage(file='mini_B.png')
mur=PhotoImage(file='Mur.png')
mini_mur=PhotoImage(file='Mini_mur.png')
caisse=PhotoImage(file='Caisse.png')
mini_caisse=PhotoImage(file='Mini_Caisse.png')
sortie=PhotoImage(file='Sortie.png')
mini_sortie=PhotoImage(file='mini_Sortie.png')
piece_trou=PhotoImage(file='LabelSortie.png')
piece_mur=PhotoImage(file='LabelMur.png')
piece_caisse=PhotoImage(file='LabelCaisse.png')
piece_perso=PhotoImage(file='LabelPerso.png')
vide=PhotoImage(file='Vide.png')
mini_vide=PhotoImage(file='mini_Vide.png')
jeu=[]
listejeu=[]
listecombo=[]
direction='H'
sel='H'
## Intérieur FenêtreAnnyBrinx
fen.title('ESCAPE GAME AVEC LE CHEVALIER LANCELOT!')
fen.configure(bg='black')
fen.resizable(height=False,width=False)
if sys.platform.startswith('win32') :
fen.iconphoto(True, PhotoImage(file='chevalier.png'))
canv=Canvas(fen,height=750,width=750,bg='white',bd=0,highlightthickness=0)
canv.grid(row=0,column=0,rowspan=3)
fr1=Frame(fen,bg='black')
fr1.grid(row=0,column=1,padx=5)
canv_pieces=Canvas(fr1,height=200,width=200,bg='white',bd=0,highlightthickness=0)
canv_pieces.grid(row=0,column=0)
canv_pieces.create_image(0,0,image=piece_mur,anchor='nw')
canv_pieces.create_image(0,50,image=piece_caisse,anchor='nw')
canv_pieces.create_image(0,100,image=piece_trou,anchor='nw')
canv_pieces.create_image(0,150,image=piece_perso,anchor='nw')
fr3=Frame(fen,bg='black')
fr3.grid(row=2,column=1,padx=5)
btquitter=ttk.Button(fr3,style='BW.TButton',text='Quitter',width=23,command=quitter_fen)
btquitter.grid(row=4,column=0)
ouverture_fichier('Niveau2.niv')
affichage(canv)
w=960
h=750
ws = fen.winfo_screenwidth()
hs = fen.winfo_screenheight()
a=(ws-w)//2
b=(hs-h)//2
fen.geometry("%dx%d+%d+%d" % (w, h, a, b))
## Fin placement de la fenêtre
## Fonction de fermeture de la fenêtre
fen.protocol("WM_DELETE_WINDOW",quitter_fen)
## Fin fonction fermeture de fenêtre
## Liens d'action
canv.bind_all('<Right>',droite)
canv.bind_all('<Left>',gauche)
canv.bind_all('<Down>',bas)
canv.bind_all('<Up>',haut)
fen.mainloop()
fen.destroy()
Gandalfix
Messages postés60Date d'inscriptionvendredi 12 juin 2020StatutMembreDernière intervention 8 mai 20237 30 avril 2021 à 11:36
Bonjour,
Personnellement, je n'ai pas compris le rapport entre votre question et le code présenté.
Vous voulez poser une énigme quand le personnage arrive à la sortie ? Et passer au niveau suivant si la réponse est bonne ou reculer d'une case si la réponse est mauvaise ?
Gandalfix
Messages postés60Date d'inscriptionvendredi 12 juin 2020StatutMembreDernière intervention 8 mai 20237 6 mai 2021 à 20:41
Bonjour,
En lisant votre code, le "C" représente une caisse et non une sortie ("O")
Sinon, pour votre problème :
1. Si le joueur s'est déplacé dans la bonne direction est que la case suivante est une sortie, créer une fenêtre enfant (Toplevel) qui comprend :
a. un label qui accueillera l'énigme
b. un entry pour que le joueur y place la réponse (ou des radiobutton dont l'un contient la bonne réponse)
c. un bouton qui contrôlera si la réponse est bonne
2. si le joueur ne se déplaçait pas dans la bonne direction, ouvrir cette fenêtre quand il change de direction (la bonne)
Exemple 1 : le joueur monte et la sortie est une case plus haut, appeler la fenêtre.
Exemple 2: le joueur monte et la sortie est une case à droite, attendre qu'il ait appuyé sur la touche de droite, changer la direction du personnage et appeler la fenêtre
punisher0785
Messages postés12Date d'inscriptionmardi 20 avril 2021StatutMembreDernière intervention 7 mai 2021 7 mai 2021 à 17:18
Gandalfix
Messages postés60Date d'inscriptionvendredi 12 juin 2020StatutMembreDernière intervention 8 mai 20237 7 mai 2021 à 18:43
Bonjour,
Si votre question concerne la création de fenêtres enfants (Toplevel), regardez dans mes petits jeux ce que font les fonctions "aide" et "AP".
Ensuite il suffit d'adapter à vos besoins, les Toplevel pouvant accueillir n'importe quel widget.
Le bouton devra lancer une fonction qui se chargera de comparer la valeur fournie par le joueur à la valeur attendue.
Le tout est de savoir comment vous aller stocker vos énigmes et vos réponses (variables, listes ou fichiers, ..)