Modification sur un snake en python

Description

Dans le cadre d'un cours de correction de programme je dois effectuer une modification sur un code existant
http://www.pythonfrance.com/codes/PETIT-JEU-SERPENT-BASE_27797.aspx

Source / Exemple :


#! /usr/bin/python
# -*- coding: utf-8 -*-

'''
Created on 2012-12-10

@author: Francis
'''

from Tkinter import *
from random import randrange

# Définition de fonctions :
    # Fonction principale (déplacement) :
def avancer ():
    global car_coord, step, arret_bcl, car, pts, temp
    pomme()         # Création de la pomme
    pomRouge()          # Création du mur
    
    # Déplacement du serpent proprement dit :
    i = 0
    while (i <= (len(car)-1)):
        car_coord[i][0] = car_coord[i][0] + car_coord[i][2]
        car_coord[i][1] = car_coord[i][1] + car_coord[i][3]
        canv.coords(car[i], car_coord[i][0], car_coord[i][1], car_coord[i][0] + 10, car_coord[i][1] + 10)
        
        if (i == 0):
            temp[0] = [car_coord[i][2], car_coord[i][3]]
        else :
            temp[1] = [car_coord[i][2], car_coord[i][3]]
            car_coord[i][2] = temp[0][0]
            car_coord[i][3] = temp[0][1]
            temp[0] = temp[1]

            # Si le serpent se coupe la partie s'arrête :
            if ((car_coord[0][0] == car_coord[i][0]) and (car_coord[0][1] == car_coord[i][1])):
                arret_bcl = 1                
        i = i + 1
    # Si le serpent touche les bords il s'arrête (partie finie):
    if ((car_coord[0][0] == 0) or (car_coord[0][0] == 590)):
        arret_bcl = 1
    elif ((car_coord[0][1] == 0) or (car_coord[0][1] == 390)):
        arret_bcl = 1

    if (arret_bcl == 0):
        fen.after(50, avancer)

    #Fonction commencer :
def commencer():
    global car_coord, car, pts, arret_bcl, temp, pom_la, pom_ov, pomx, pomy, pomRougex, pomRougey, pomRouge_la, pomRouge_ov
    
    i = 0
    while (i <= (len(car)-1)):      # On supprime les carrés de l'anciens serpent
        canv.delete(car[i])
        i = i + 1
    canv.delete(pom_ov)     # On supprime le carré de la pomme restante à l'écran
    canv.delete(pomRouge_ov)    # On supprime le mur restant à l'écran

    # On réinitialise les variables propres au jeu :
    pts = 0
    car = [0] *4
    car_coord = 0, 0, 0, 0 *4
    arret_bcl = 0
    temp = 0,0*2
    pom_la, pom_ov, pomx, pomy = -1, 0, 0, 0
    pomRouge_la, pomRouge_ov, pomRougex, pomRougey = -1, 0, 0, 0

    # Création du serpent de début :
    i = 0
    while (i <= (len(car)-1)):      # On enregistre les coords de chaque carrés ds car_coord
        if (i == 0):
            car_coord[i] = [300, 200, -10, 0]
        else :
            car_coord[i] = [car_coord[i-1][0] + 10, 200, -10, 0]
            # On dessine les carrés :
        car[i] = canv.create_rectangle(car_coord[i][0], car_coord[i][1], car_coord[i][0] + 10, car_coord[i][1] + 10, fill='black')

        i = i + 1
    avancer()   # On commence la partie en invoquant la fonction avancer()

def pomRouge ():
    global pomRouge_la, pomRouge_ov, pomRougex, pomRougey, car, car_coord, pts
    if (pomRouge_la == 1):
        if ((car_coord[0][0] == pomRougex) and (car_coord[0][1] == pomRougey)):
            car.append(0)         # On ajoute une entrée ds la liste d'identificateur des carrés
            # On ajoute les infos propres au nvo carré :
            x, y = car_coord[len(car_coord)-1][0] - car_coord[len(car_coord)-1][2] , car_coord[len(car_coord)-1][1] - car_coord[len(car_coord)-1][3]
            stepx, stepy = car_coord[len(car_coord)-1][2], car_coord[len(car_coord)-1][3]
            car_coord.append([x, y, stepx, stepy])
            # On affiche le nvo carré :
            car[len(car)-1] = canv.create_rectangle(x, y, x+10, y+10, fill='black')
            
            car.append(0)          # On ajoute une entrée ds la liste d'identificateur des carrés
            # On ajoute les infos propres au nvo carré :
            x, y = car_coord[len(car_coord)-1][0] - car_coord[len(car_coord)-1][2] , car_coord[len(car_coord)-1][1] - car_coord[len(car_coord)-1][3]
            stepx, stepy = car_coord[len(car_coord)-1][2], car_coord[len(car_coord)-1][3]
            car_coord.append([x, y, stepx, stepy])
            # On affiche le nvo carré :
            car[len(car)-1] = canv.create_rectangle(x, y, x+10, y+10, fill='black')
            
            pts = pts + 20      # On incrémente les points de 10
            lb_pts.configure(text="Points = " + str(pts))   # On met à jour le label "points"
            pomRouge_la = 0
    else:
        pomRougex, pomRougey = (randrange(57) + 1)*10, (randrange(38) + 1)*10
        if (pomRouge_la != 0):
            pomRouge_ov = canv.create_rectangle(pomRougex, pomRougey, pomRougex+10, pomRougey+10, fill='red')
        else :
            canv.coords(pomRouge_ov, pomRougex, pomRougey, pomRougex+10, pomRougey+10)
        pomRouge_la = 1

    #Fonction "ptites pommes vertes" :
def pomme ():
    global pom_la, pom_ov, pomx, pomy, car, car_coord, pts
    if (pom_la == 1):
        if ((car_coord[0][0] == pomx) and (car_coord[0][1] == pomy)):
            car.append(0)         # On ajoute une entrée ds la liste d'identificateur des carrés
            # On ajoute les infos propres au nvo carré :
            x, y = car_coord[len(car_coord)-1][0] - car_coord[len(car_coord)-1][2] , car_coord[len(car_coord)-1][1] - car_coord[len(car_coord)-1][3]
            stepx, stepy = car_coord[len(car_coord)-1][2], car_coord[len(car_coord)-1][3]
            car_coord.append([x, y, stepx, stepy])
            # On affiche le nvo carré :
            car[len(car)-1] = canv.create_rectangle(x, y, x+10, y+10, fill='black')
            
            pts = pts + 10      # On incrémente les points de 10
            lb_pts.configure(text="Points = " + str(pts))   # On met à jour le label "points" 
            pom_la = 0
    else:
        pomx, pomy = (randrange(57) + 1)*10, (randrange(38) + 1)*10
        if (pom_la != 0):
            pom_ov = canv.create_rectangle(pomx, pomy, pomx+10, pomy+10, fill='green')
        else :
            canv.coords(pom_ov, pomx, pomy, pomx+10, pomy+10)
        pom_la = 1
    
    # Fonction de déplcament spécifique à chaque touche :
def left(event):
    global car_coord
    if (car_coord[0][2] != 10):
        car_coord[0][2] = -10
        car_coord[0][3] = 0
    
def right(event):
    global car_coord
    if (car_coord[0][2] != -10):
        car_coord[0][2] = 10
        car_coord[0][3] = 0
    
def up(event):
    global car_coord
    if (car_coord[0][3] != 10):
        car_coord[0][2] = 0
        car_coord[0][3] = -10
    
def down(event):
    global car_coord
    if (car_coord[0][3] != -10):
        car_coord[0][2] = 0
        car_coord[0][3] = 10

# Définition des vrariables (utilisées  en global pour certaines) :
pts = 0        # Nbr de points
car = [0] *4        # Identifiants de chaque carré (5 au début)
car_coord = 0, 0, 0, 0 *4      # Coords de chaque carré + pas en x et y pour chaque carré
arret_bcl = 0       # Variable de "condition" pour quitter la fonction "avancer"
temp = 0,0*2    # Var temporaire utilisée pour un échange de valeurs ds la fonction "avancer"
pom_la, pom_ov, pomx, pomy = -1, 0, 0, 0      # Var pour gérer la pomme
pomRouge_la, pomRouge_ov, pomRougex, pomRougey = -1, 0, 0, 0  # Var pour gérer le mur

# Création du widget maitre :
fen = Tk()
fen.title('Jeu de serpent by Gulius')
fen.bind("<Left>", left)
fen.bind("<Right>", right)
fen.bind("<Up>", up)
fen.bind("<Down>", down)

# Création des widgets esclaves :
Label(fen, text='Serpent by Gulius', font="weight=BOLD").grid(row=0, sticky=W, padx=10)
lb_pts = Label(fen, text='Points = aucun')
lb_pts.grid(row=0, column=1, sticky=E, padx=20)
canv = Canvas(fen, width=600, height=400, bg='blue')
canv.grid(row=1, column=0, columnspan=2)
Button(fen, text='New game', command=commencer).grid(row=2, column=0, padx=30, pady=30)
Button(fen, text='Quiter', command=fen.quit).grid(row=2, column=1, padx=30, pady=30)

# Main :
fen.mainloop()

# After main :
fen.destroy()

Conclusion :


J'ai fais l'ajout d'une pomme rouge qui permet de grossir votre serpent deux fois plus vite et de gagner des points plus rapidement.

P.s. Je suis débutant en Python.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.