Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 04/11/2006, à 01:35

Spartan117

Python Swinnen exercice 8.33

Salut à tous,
Je me suis lancé dans l'étude de Python comme vous l'aurez surement deviné et je suis arrivé jusqu'à l'exercice 8.33 sans encombre. Et maintenant je bloque completement sur le jeu du Snake. Voici l'énoncé:

8.33. Écrivez un programme pour le jeu du serpent : un « serpent » (constitué en faite d'une
courte ligne de carrés) se déplace sur le canevas dans l'une des 4 directions : droite, gauche,
haut, bas. Le joueur peut à tout moment changer la direction suivie par le serpent à l'aide
des touches fléchées du clavier. Sur le canevas se trouvent également des « proies » (des
petits cercles fixes disposés au hasard). Il faut diriger le serpent de manière à ce qu'il
« mange » les proies sans arriver en contact avec les bords du canevas. A chaque fois
qu'une proie est mangée, le serpent s'allonge d'un carré, le joueur gagne un point, et une
nouvelle proie apparaît ailleurs. La partie s'arrête lorsque le serpent touche l'une des parois,
ou lorsqu'il a atteint une certaine taille.

J'ai tout réussi ( déplacement de la tête du serpent, système de comptage des points, les ennemis, arrêt de la partie ...etc) sauf la queue du serpent qui le suit dans sa trajectoire et qui grandie à chaque point marqué. Bref je tourne en rond.
Alors je demandes votre aide siouplè.

Voici mon travail jusque là.

# -*- coding:Latin-1 -*-
from Tkinter import *
from random import randrange

def move(dx, dy):
    " Je déplace la balle à travers le canevas can."
    global x1, y1, x2, y2, ind, h, b, g, d
    x1 = x1 + dx
    x2 = x2 + dx
    y1 = y1 + dy
    y2 = y2 + dy
    can.coords(balle, x1, y1, x2, y2)
    if x1==0 or x2==570 or y1==0 or y2==480:
        stop()
        chaine.configure(text= "Vous avez perdu !! Vous avez marqué en tout " + str(ind)+" points.", fg = 'red')
        h, b, g, d = 1, 1, 1, 1

def haut():
    " Je déplace la balle vers le haut."
    global index
    if index == 8:
        move(0, -5)
        fen.after(50, haut)
def bas():
    " Je déplace la balle vers le bas."
    global index
    if index == 2:
        move(0, 5)
        fen.after(50, bas)
def gauche():
    " Je déplace la balle vers la gauche."
    global index
    if index == 4:
        move(-5, 0)
        fen.after(50, gauche)
def droite():
    " Je déplace la balle vers la droite."
    global index
    if index == 6:
        move(5, 0)
        fen.after(50, droite)

def depl_haut(event):
    " J'invoque la fonction qui déplace la balle vers le haut."
    global index, h, b, g, d
    if h == 0:
        h, b, g, d = 1, 0, 0, 0
        index = 8
        haut()
def depl_bas(event):
    " J'invoque la fonction qui déplace la balle vers le bas."
    global index, h, b, g, d
    if b == 0:
        h, b, g, d = 0, 1, 0, 0
        index = 2
        bas()
def depl_gauche(event):
    " J'invoque la fonction qui déplace la balle vers la gauche."
    global index, h, b, g, d
    if g == 0:
        h, b, g, d = 0, 0, 1, 0
        index = 4
        gauche()
def depl_droite(event):
    " J'invoque la fonction qui déplace la balle vers la droite."
    global index, h, b, g, d
    if d == 0:
        h, b, g, d = 0, 0, 0, 1
        index = 6
        droite()

def ennemi():
    " J'envoie un ennemi dans le canevas."
    global xx, yy
    xx = randrange(570)
    yy = randrange(480)
    can.coords(enn, xx, yy, xx+10, yy+10)

def point():
    " Je compte les points du joueur et détecte si celui-ci en gagne un."
    global x1, y1, x2, y2, xx, yy, ind
    if x1<xx<x2 and y1<yy<y2:
        ind = ind + 1
        ennemi()
        chaine.configure(text="Nombre de points = "+ str(ind))

def compt():
    " J'invoque la fonction point()."
    point()
    fen.after(10, compt)

def stop():
    " Je stoppe l'animation."
    global index
    index = 0

def stopp(event):
    " J'invoque la fonction qui stoppe l'animation."
    stop()

x1, y1, x2, y2 = 100, 100, 130, 130
index = 0
h, b, g, d = 0, 0, 0, 0
xx = randrange(570)
yy = randrange(480)
ind = 0

fen = Tk()
fen.title("Essais pour le jeu du serpent")
can = Canvas(fen, width=570, height=480, bg='white')
can.pack(pady=10, padx=10)
enn = can.create_oval(xx, yy, xx+10, yy+10, fill='red', outline='black', width=5)
balle = can.create_oval(x1, y1, x2, y2, fill='blue', outline='black', width=3)
chaine = Label(fen, text= "Nombre de points = 0")
chaine.pack()
fen.bind("<o>", depl_haut)
fen.bind("<l>", depl_bas)
fen.bind("<m>", depl_droite)
fen.bind("<k>", depl_gauche)
fen.bind("<p>", stopp)
compt()
fen.mainloop()

Toutes les suggestions, remarques ou modifications à faire sont les bienvenues. Merci d'avance :

Hors ligne

#2 Le 04/11/2006, à 16:54

Ratur

Re : Python Swinnen exercice 8.33

Ahhh le fameux jeu du serpent smile
J'ai fait l'exercice il y a pas mal de temps, et comme j'ai pas tout à fait le temps de regarder ça maintenant, je te poste ma version à moi, qui est néanmoins assez semblable (mais pas toujours très propre big_smile). Tu trouveras les infos dont tu as besoin dans la première procédure du code

from Tkinter import *
from random import randrange

# definition des gestionnaires d'evenements :

# Procedure generale de deplacement de la tete du serpent
def move1() :
    "deplacement de serpent1"
    global x, y, dx, dy, flag, temps, bX, bY, score, cX, cY
    nn = len(x)-1
    # Procedure de deplacement de chacun des segments de la queue du serpent :
    while nn > 0:    
        x[nn], y[nn] = x[nn-1], y[nn-1]
        nn = nn-1
    # Procedure de deplacement de la tete du serpent
    x[0],y[0] = x[0]+dx, y[0]+dy
    # concerne les extremites de l'aire
    if x[0] > (cX[1]-10) or x[0]< (cX[0]+15) or y[0]>(cY[1]-10) or y[0]< (cY[0]+15):
        flag = 0
        perdu_gagne.configure(text= "Vous avez perdu !")
    segment = 2
    # Si la tete du serpent touche un des segments de sa queue
    while segment < len(x):
        if x[segment] == x[0] and y[segment] == y[0]:
            flag = 0
            perdu_gagne.configure(text= "Vous avez perdu !")
        segment +=1
    nnn = 0
    while nnn < len(x):
        can1.coords(serpent[nnn],x[nnn]-10,y[nnn]-10,x[nnn]+10,y[nnn]+10)       # recalcule les coordonnees
        nnn += 1
    if flag > 0 and x[0] == bX and y[0] == bY:
        # Le serpent touche le bonus
        score = score +1
        scoreBoard.configure(text = 'Score : '+ str(score))
        placeBonus()
        ajouteSegment()
    if score%10 == 0 and score!=0 and score!=maxScore:
        niveauSuivant()
        score += 1
    if score == maxScore:
        # Fin du jeu quand le score atteind 10
        perdu_gagne.configure(text= "Vous avez gagne !")
        flag = 0
    if flag > 0:
        fen1.after(temps,move1)         # Relance la boucle

# Procedures de changement de direction
def depl_gauche(event):
    global dx, dy, flag
    if flag > 0 and dx==0:
        dx,dy = -20, 0
def depl_bas(event):
    global dx, dy, flag
    if flag > 0 and dy==0:
        dx, dy = 0, 20
def depl_haut(event):
    global dx, dy, flag
    if flag > 0 and dy==0:
        dx, dy = 0, -20
def depl_droite(event):
    global dx, dy, flag
    if flag > 0 and dx==0:
        dx, dy = 20, 0

def stop_it():
    "arret de l'animation"
    global flag
    flag =0

def start_it():
    "demarrage de l'animation"
    global flag, dx, dy
    if flag ==0:                    # pour ne lancer qu'un seule boucle
        flag=1
        move1()

def placeBonus():
    "place aleatoirement un bonus sur le canvas"
    global boX, bX, boY, bY, cX, cY
    boX, boY= randrange(cX[1]/20-1), randrange(cY[1]/20-1)          # Genere la coordonnee de la case du bonus
    bX,bY = boX*20+20, boY*20+20                    # Coordonnee du centre du bonus
    test = 0
    # On verifie si le bonus n'apparait pas sur le serpent
    while test < len(x) :
        if bX== x[test] and bY == y[test]:
            placeBonus()                            # Si c'est le cas, on re-genere la position
        test +=1
    can1.coords(bonusBalle, bX-8, bY-8, bX+8, bY+8) # Place le bonus

def ajouteSegment():
    "ajoute un segment a la queue du serpent"
    global x, y
    derX = x[len(x)-1]
    derY = y[len(y)-1]
    x.append(derX)
    y.append(derY)
    serpent.append(0)
    nS = len(x)-1
    serpent[nS] = can1.create_oval(derX-10,derY-10,derX+10,derY+10,width=2, fill='red')

def niveauSuivant():
    "defini la procedure de passage au niveau suivant"
    global niveau, x, y, temps
    perdu_gagne.configure(text= "Level done !")
    niveau = niveau +1                   # incremente le compteur de score
    niveauBoard.configure(text= "Niveau "+str(niveau))
    temps = temps - 39                   # augmente la vitesse
    
# ======== Programme principal ============

# les variables suivantes seront utilisees de maniere globale
x = [100,80,60,40,20]   # coordonnees initiales du serpent
y = [40,40,40,40,40]	# A l'origine, le serpent comprend 5 segments
serpent = [0]*5
dx, dy = 20, 0          # vitesse itiniale
flag = 0                # declancheur de l'animation
temps = 350             # temps de pause entre chaque avancement
boX, boY = 15,18        # bonus initial
bX,bY = boX*20, boY*20  
score = 0               # score initial
maxScore = 60		# score maximal
niveau = 1              # niveau initial
cX = [0,600]		# represente les coordonnees des coins du canvas
cY = [0,460]		# Obligatoirement des multiples de 20

# Creation du widget principal
fen1 = Tk()
fen1.title("Jeu du serpent : Attrapez les bonus oranges !")
# Creation des widget esclaves :
can1 = Canvas(fen1,bg='black', height=cY[1], width=cX[1])
can1.grid(row=2, column=1,padx = 5, pady = 5,rowspan=8)
n = 0
while n < len(x):
    serpent[n] = can1.create_oval(x[n]-10,y[n]-10,x[n]+10,y[n]+10,width=2, fill='red')
    n += 1
bonusBalle = can1.create_oval(bX-8, bY-8, bX+8, bY+8, width=2, fill='orange')
# Label s'affichant occasionnellement :
perdu_gagne = Label(fen1)
perdu_gagne.grid(row=2,column=2)
Button(fen1,text='Quitter',width=8,command=fen1.quit).grid(row=9,column=2, pady=5,padx=5)
Button(fen1,text='Demarrer',width=8,command=start_it).grid(row=3,column=2, pady=5,padx=5)
Button(fen1,text='Arreter',width=8,command=stop_it).grid(row=4,column=2)
fra = Frame(fen1)
fra.grid(row=5,column=2)
Frame(fen1, height=150).grid(row=8,column=2)
fen1.bind('<z>', depl_haut)
fen1.bind('<s>', depl_bas)
fen1.bind('<q>', depl_gauche)
fen1.bind('<d>', depl_droite)
# Label affichant le score :
scoreBoard = Label(fen1, text='Score : 0')
scoreBoard.grid(row=6, column=2)
niveauBoard = Label(fen1, text='Niveau 1')
niveauBoard.grid(row=7, column=2)

fen1.mainloop()

Hors ligne

#3 Le 04/11/2006, à 19:26

Spartan117

Re : Python Swinnen exercice 8.33

Okay merci je vais étudier ton code et on verra bien.

Hors ligne