énigme à chaque porte

Signaler
Messages postés
12
Date d'inscription
mardi 20 avril 2021
Statut
Membre
Dernière intervention
7 mai 2021
-
Messages postés
23
Date d'inscription
vendredi 12 juin 2020
Statut
Membre
Dernière intervention
7 mai 2021
-
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()

6 réponses

Messages postés
110
Date d'inscription
mardi 30 juillet 2013
Statut
Membre
Dernière intervention
27 avril 2021
12
Bonjour,

Manquent les images utilisées (fichiers correspondants) !?
Messages postés
12
Date d'inscription
mardi 20 avril 2021
Statut
Membre
Dernière intervention
7 mai 2021

Pas compris. Vous voulez tous les dossiers de mon projet le projet ? Si c'est ça, je ne sais pas comment on fait ?
Messages postés
23
Date d'inscription
vendredi 12 juin 2020
Statut
Membre
Dernière intervention
7 mai 2021
3
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 ?
Messages postés
12
Date d'inscription
mardi 20 avril 2021
Statut
Membre
Dernière intervention
7 mai 2021

non, je voudrais qu'a chaque fois qu'il est devant une porte ("C" dans le code) ça pose une énigme.
Messages postés
23
Date d'inscription
vendredi 12 juin 2020
Statut
Membre
Dernière intervention
7 mai 2021
3
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
Messages postés
12
Date d'inscription
mardi 20 avril 2021
Statut
Membre
Dernière intervention
7 mai 2021

et ça se code comment à peu près ?
Messages postés
23
Date d'inscription
vendredi 12 juin 2020
Statut
Membre
Dernière intervention
7 mai 2021
3
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, ..)