Petit jeu de serpent de base

Soyez le premier à donner votre avis sur cette source.

Vue 10 098 fois - Téléchargée 790 fois

Description

Ba c'est un simple petit jeu de serpent de base (je débute ;-) avec gestion des points, de collisions,.... ENfin même si il est simple il reste tout de même complet.

Source / Exemple :


# -*- coding: cp1252 -*-
# Ce programme est un simple petit jeu de serpent

# Les imports :
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
    
    # 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
    
    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

    # 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

    # 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()

    #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

# 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 :


Voilà je début donc soyez indulgents. Menfin j'ai my cette source plus pour aider ceux qui comme moi débute ds ce language (fort passionant en passant).

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
55
Date d'inscription
mardi 6 juin 2006
Statut
Membre
Dernière intervention
20 janvier 2009

je commence a m'interresser au python, et bien je crois que ce code m'a seduit, allez 10.
Messages postés
262
Date d'inscription
lundi 26 août 2002
Statut
Membre
Dernière intervention
24 août 2005

Ué c sur la POO c tout de meme vachement mieux. Ben ecoute bon courage pour ton projet. Moi je vais continue a apprendre yen a tellement et c si bon... lol

@+

Pingouin
Messages postés
19
Date d'inscription
mardi 25 novembre 2003
Statut
Membre
Dernière intervention
10 mars 2006

Merci bcp pour ton commentaire.
Euh bas jy avais penser. Pour le moment jsuis sur un pti projet de traceur de fonction mathématiques assez complet en POO (enfin le plus que je puis ;-). Mais quand jaurais fini (si jle fini car je suis feigant) et bien pas de prob.

Mais merci bcp de my avoir fait penser.
Sur le dernier code (le traceur de fonctions), jai vraiment découvert la POO, et .... fiou ..... jsuis vraiment tombé amoureux. Ca facilite vraiment bcp le travail. Et ya bcp plus dorganisation et moins de bidouillage.

A++
Messages postés
262
Date d'inscription
lundi 26 août 2002
Statut
Membre
Dernière intervention
24 août 2005

Source modeste certes, mais comme moi aussi je débute, plus jeunot encore en Python que toi a mon avis ;-), je ne peux que te féliciter. Au moins...ca marche lol
Quelques suggestions : retard à l'affichage, la pomme apparait dans le serpent mais j'ai po d'idée...
Ce qui m'intéresse vraiment : est ce que ca ne pourrait pas etre une base intéressante pour apréhender directement et de facon simple la programmation orientée objet en créant une classe pour éviter les varaibles global et surtout expérimenter un peu tout ca ? si ca te tente je veux bien te filer un coup de main ca m'aidera sans doute (et peut etre toi aussi) à me familiariser avec le langage (j'etais deja content de tout comprendre a ton script lol)
Voia c tout
Et franchement...Python...c bien lol

@+

Pingouin

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.