Comment ajouter des niveaux dans un jeu Python?

Utilisateur anonyme -  
Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour, je suis entrain d'améliorer un jeu python un utilisant juste tkinter,dans ce jeu tu dois mémoriser la position du balon rouge et avec les boutons de direction tu diriges ton balon vers la position de balon rouge.. tant tu en trouves rapidement, tant tu collectes plus de point, alors mon probleme c'est que je ne sais pas comment ajouter des niveaux, exemple: level 1: trouvez 5 positions, level 2 :trouver 10 position etc...
Voila le code de jeu :

from tkinter import *
from random import *
import time

global posJoueur ; global posBut ; global n ; global c ; global score
global nbBut ; global gameTime

score=0 ; posJoueur=[0,0] ; n=15 ; c=50

########### #### Gestion des déplacements #################################

def droite(event = None):
    posJoueur[0]+=50
    if posJoueur[0]>700:
        posJoueur[0]=700
    dep_droite()

def dep_droite():
    c1.delete(ALL)
    rond= c1.create_oval(posJoueur[0],posJoueur[1],posJoueur[0]+c, posJoueur[1]+c,fill='#fff')
    jouer()

def gauche(event = None):
    posJoueur[0]-=50
    if posJoueur[0]<0:
        posJoueur[0]=0
    dep_gauche()

def dep_gauche():
    c1.delete(ALL)
    rond = c1.create_oval(posJoueur[0],posJoueur[1],posJoueur[0]+c, posJoueur[1]+c,fill='#fff')
    jouer()

def bas(event = None):
    posJoueur[1]+=50
    if posJoueur[1]>700:
        posJoueur[1]=700
    dep_bas()

def dep_bas():
    c1.delete(ALL)
    rond = c1.create_oval(posJoueur[0],posJoueur[1],posJoueur[0]+c, posJoueur[1]+c,fill='#fff')
    jouer()

def haut(event = None):
    posJoueur[1]-=50
    if posJoueur[1]<0:
        posJoueur[1]=0
    dep_haut()

def dep_haut():
    c1.delete(ALL)
    rond = c1.create_oval(posJoueur[0],posJoueur[1],posJoueur[0]+c, posJoueur[1]+c,fill='#fff')
    jouer()


################# Gestion du jeu #########################################

def commencerJeu():
    global score ; global gameTime ; global nbBut ; global posJoueur
    global posBut
    nbBut=0
    gameTime=[time.time(),0]
    score=0
    posJoueur = [0, 0]
    posBut = [0, 0]
    But()

def But():
    global nbBut
    nbBut =nbBut+ 1
    posBut[0]=randint(0,14)*50
    posBut[1]=randint(0,14)*50
    but=c1.create_oval(posBut[0],posBut[1],posBut[0]+c,posBut[1]+c, fill="red")
    jouer()


def jouer():
    global score
    if posJoueur[0]==posBut[0] and posJoueur[1]==posBut[1]:
        if nbBut==5:
            gameTime[1]=time.time()
            score=round(1/(gameTime[1]-gameTime[0])*1000,2)
            affichageScore.set("Score =" +str(score))
            c1.create_text(c*n/2, c*n/2, font="Purisa",
                               text="Jeu terminé !",fill="red")
            c1.pack()
        else:
            But()


################# programme principale ####################################

f1=Tk()
f1.title("Python Game Challenge")
f1.bind("<Right>", droite) ; f1.bind("<Left>", gauche)
f1.bind("<Down>", bas) ; f1.bind("<Up>", haut)

l1 = Label(f1, text="Bienvenu dans mon jeu !")
l1.pack(side="top",ipadx=30,ipady=30)

affichageScore=StringVar()
affichageScore.set("Score =00.00")
l2 = Label(f1, textvariable=affichageScore)
l2.pack(side="right",ipadx=10,ipady=10)

b1=Button(f1,text="Jouer",fg='yellow',bg="black", command=commencerJeu)
b1.pack(side="left",ipadx=10,ipady=10)

b2=Button(f1,text="Fermer",fg='yellow',bg="black",command=f1.destroy)
b2.pack(side="left",ipadx=10,ipady=10)

c1=Canvas(f1,width=n*c,height=n*c, bg="black")
rond = c1.create_oval(posJoueur[0],posJoueur[1],posJoueur[0]+c, posJoueur[1]+c,fill='#fff')
c1.pack()
f1.mainloop()

8 réponses

  1. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    Bonjour,

    L'indentation étant importante en Python, merci de copier/coller ici ton code complet avec les balises de code
    mode d'emploi:
    https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

    Visuellement, ça doit ressembler à ceci (avec la coloration syntaxique) :

    def test():
        print('test')
    
    test()
    
    0
    1. Utilisateur anonyme
       
      Pouvez vous m'aider??
      0
  2. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    Ah, on y voit clair maintenant que ton code a été modifié !

    Au fait, tu savait que l'on peut écrire:
    global posJoueur, posBut, n, c, score

    au lieu de :
    global posJoueur ; global posBut ; global n ; global c ; global score


    Il faut plutôt écrire
    l1 = Label(f1, text="Bienvenue dans mon jeu !")
    au lieu de
    l1 = Label(f1, text="Bienvenu dans mon jeu !")


    Pour le choix du niveau, tu sais déjà faire des labels et des boutons, tu pourrais ajouter
    une liste déroulante qui permettrait de sélectionner "niveau 1 :trouvez 5 positions", etc
    Et en fonction du choix de l'utilisateur, tu changes le test de la valeur de nbBut
    (je pense que c'est cette variable qui donne le nb de positions trouvées)
    0
  3. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    Hello Mallek,

    Qu'en penses-tu ?
    0
    1. Utilisateur anonyme
       
      Bonjour Phil_1857 , ça ne marche pas malheureusement, mon objectif est d'ajouter une fonction qui va me rend jouer au niveau suivant directement ...
      0
  4. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    Ah ok,

    hé bien dans ce cas, tu peux faire ça:

    initialiser en début de code une variable
    niveau = 5


    dans la fonction jouer(), changer le test

    if nbBut==5:


    par:

    if nbBut==niveau:


    Dans cette branche du test, après affichage du score, tu ajoute ceci:

    niveau = 10
    nbBut = 0
    But() ;#pour recommencer à jouer au niveau suivant
    

    (enlever le message jeu terminé, ou le mettre vraiment quand on a épuisé tous les niveaux)
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    En tout cas, à part ce truc de niveaux, ton code marche super bien !

    Ah au fait, suite à mon précédent message:

    C'est
    niveau += 5
    et non pas
     niveau = 10

    Sinon, il n'y aurait que 2 niveaux: 5 et 10
    0
  7. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    Bonjour,

    Tu viens d'ouvrir un autre appel, tu peux donc fermer celui-là ...
    0
  8. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    Tu as fermé l'autre appel, donc on ne peut pas répondre

    J'ai refait ton jeu avec les niveau, ça marche très bien en fait:

    # -*- coding:Latin-1 -*-
    
    from tkinter import *
    from random import *
    import time
    
    class G():
    	
        ball_dia = 50
        rond = None
        but = None
        posx = 0
        posy = 0
        posButx = 0
        posButy = 0
        nbut = 0
        niveau = 2
    
    def commencerJeu():
        G.rond = c1.create_oval(G.posx,G.posy,G.posx+G.ball_dia,G.posy+G.ball_dia,fill='#fff')
        But()
    
    def But():
    
        G.nbut += 1
        G.posButx=randint(0,9)*50
        G.posButy=randint(0,9)*50
    
        G.but=c1.create_oval(G.posButx,G.posButy,G.posButx+G.ball_dia,G.posButy+G.ball_dia, fill="red")
        jouer()
    
    def jouer():
    
        if(G.posx == G.posButx and G.posy == G.posButy):
            if(G.nbut == G.niveau):
                G.nbut = 0
                G.niveau += 1
                l1['text'] = 'Gagné, on passe au niveau : '+str(G.niveau)
                But()
            else:
                But()
    
    def droite(event):
        c1.delete(ALL)
        G.posx+=50
        if(G.posx > 450): G.posx=450
        G.rond = c1.create_oval(G.posx,G.posy,G.posx+G.ball_dia,G.posy+G.ball_dia,fill='#fff')
        jouer()
    
    def gauche(event):
        c1.delete(ALL)
        G.posx-=50
        if(G.posx < 0): G.posx=0
        G.rond = c1.create_oval(G.posx,G.posy,G.posx+G.ball_dia,G.posy+G.ball_dia,fill='#fff')
        jouer()
    
    def haut(event):
        c1.delete(ALL)
        G.posy-=50
        if(G.posy < 0): G.posy=0
        G.rond = c1.create_oval(G.posx,G.posy,G.posx+G.ball_dia,G.posy+G.ball_dia,fill='#fff')
        jouer()
    
    def bas(event):
        c1.delete(ALL)
        G.posy+=50
        if(G.posy > 450): G.posy=450
        G.rond = c1.create_oval(G.posx,G.posy,G.posx+G.ball_dia,G.posy+G.ball_dia,fill='#fff')
        jouer()
    
    f1=Tk()
    f1.title("Python Game Challenge")
    f1.geometry('600x600+300+50')
    f1.bind("<Right>", droite) ; f1.bind("<Left>", gauche)
    f1.bind("<Down>", bas) ; f1.bind("<Up>", haut)
    
    c1=Canvas(f1,width=500,height=500, bg="black")
    c1.place(x=10, y=10)
    
    l1 = Label(f1, text = 'Niveau : '+str(G.niveau))
    l1.place(x=200, y=550)
    
    l2 = Label(f1, text = 'Score : 0.0')
    l2.place(x=400, y=550)
    
    b1=Button(f1,text="Jouer",fg='yellow',bg="black", command=commencerJeu)
    b1.place(x=10, y=550)
    
    f1.mainloop()
    0
  9. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    Bonjour Mallek,

    Alors, ou en es tu ? Tu abandonnes ?

    As-tu copié/collé mon code dans un fichier pour l'exécuter ?

    Tu verrais que ca marche bien ....
    0