énigme à chaque porte

punisher0785 Messages postés 12 Date d'inscription mardi 20 avril 2021 Statut Membre Dernière intervention 7 mai 2021 - Modifié le 26 avril 2021 à 14:15
Gandalfix Messages postés 60 Date d'inscription vendredi 12 juin 2020 Statut Membre Derniè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()

7 réponses

hbouia Messages postés 112 Date d'inscription mardi 30 juillet 2013 Statut Membre Dernière intervention 22 novembre 2022 12
27 avril 2021 à 12:36
Bonjour,

Manquent les images utilisées (fichiers correspondants) !?
0
punisher0785 Messages postés 12 Date d'inscription mardi 20 avril 2021 Statut Membre Dernière intervention 7 mai 2021
30 avril 2021 à 10:21
Pas compris. Vous voulez tous les dossiers de mon projet le projet ? Si c'est ça, je ne sais pas comment on fait ?
0
Gandalfix Messages postés 60 Date d'inscription vendredi 12 juin 2020 Statut Membre Dernière intervention 8 mai 2023 7
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 ?
0
punisher0785 Messages postés 12 Date d'inscription mardi 20 avril 2021 Statut Membre Dernière intervention 7 mai 2021
6 mai 2021 à 17:48
non, je voudrais qu'a chaque fois qu'il est devant une porte ("C" dans le code) ça pose une énigme.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Gandalfix Messages postés 60 Date d'inscription vendredi 12 juin 2020 Statut Membre Dernière intervention 8 mai 2023 7
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
0
punisher0785 Messages postés 12 Date d'inscription mardi 20 avril 2021 Statut Membre Dernière intervention 7 mai 2021
7 mai 2021 à 17:18
et ça se code comment à peu près ?
0
Gandalfix Messages postés 60 Date d'inscription vendredi 12 juin 2020 Statut Membre Dernière intervention 8 mai 2023 7
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, ..)
0
Gandalfix Messages postés 60 Date d'inscription vendredi 12 juin 2020 Statut Membre Dernière intervention 8 mai 2023 7
17 mai 2021 à 11:23
Bonjour,

Avez-vous réussi ?

0