Je suis en train d'essayer de faire un jeu avec pygame, qui n'est d'autre que Snake et je rencontre plutôt pas mal de problèmes, je suis débutant dans le domaine et j'aimerai soliciter votre aide. J'aimerai bien que quelqu'un m'aide à créer le mouvement continu de mon serpent qui serait contrôler par les flèches. Si quelqu'un est d'accord de m'aider, qu'il me contacte car je ne sais pas comment faire pour mettre mon code et mes fichiers sur le site.
Je ne comprends pas bien ta demande, désolé, je débute en programmation.
J'ai utilisé des images pour constituer le serpent, avec des classes et des fonctions ...
Le problème est que je n'arrive pas à grand chose, je n'arrive pas à faire aller mon programme, je ne trouve pas comment concevoir le mouvement de mon serpent
La meilleure manière pour que les gens puissent t'aider sur le forum, est de poster le code que tu es entrain d'écrire. Sans ce code sous les yeux, ça va être très difficile de savoir ce qui ne vas pas , où sont les problèmes dans ton script etc...
De plus tu dis que tu es débutant, mais débutant en quoi: en Python ou en programmation? As-tu déjà codé des objets (en Python ou dans un autre langage)? Si tu débute avec complétement avec Pygame, ton projet me semble un poil trop ambitieux pour le moment. Ca n'a l'air de rien mais coder un simple jeu comme snake est déjà un projet complexe.
Peut-être que tu devrais d'abord te familiariser avec la bibliothèque Pygame... Il y a un tuto sur le site qui est pas trop mal fait pour débuter.
J'ai essayé comme josmyley de corriger les erreurs et j' ai réussi à lancer le jeu sans plantage mais il manque des choses dans la boucle de jeu notamment le rafraichissement de l' affichage. On peut constater grace au print que j' ai ajouté que le serpent bouge (pas comme il devrait mais il bouge), mais on ne l' affiche pas.
Voici le code dans l'etat où je le laisse ce soir et en dessous dans la balise secret un snake qui à été mon premier programme pygame.je l' ai jamais fini (le serpent peut toujours passer au travers de lui même, entre autres) mais il fonctionne, en tous cas chez moi sous python 2.6 et ubuntu.
J' ai remarqué en remettant le nez dans ce code que tu a du passer par le meme chemin que moi vu que le corps et la tête de mon serpent sont constitués de "tetebrouge.png"
ps: j' ai l' habitude de mettre mes images dans un dossier appelé "data" situé dans le meme dossier que mon "sn4ke.py" et j' ai modifié ton code pour me servir des images présentes dans ce dossier. Tu dois donc soit créer un dossier data et y déplacer tes images soit supprimer les "./data/".
#-*- coding: utf-8 -*-
import pygame, random
from random import randrange
from pygame.locals import *
pygame.init()
#Ouverture de la fenêtre Pygame
fenetre = pygame.display.set_mode((1000, 650))
class Serpent:
def __init__(self, width = 1000, height = 650):
self.pcsx, self.pcsy = 190, 300
self.queue = 4
self.corpserpent = pygame.image.load("./data/tetebrouge.png").convert_alpha()
self.position_corpserpent = self.corpserpent.get_rect()
self.position_corpserpent = self.position_corpserpent.move(self.pcsx,self.pcsy)
#Chargement des différentes têtes
self.persob = pygame.image.load("./data/tetebrouge.png").convert_alpha()
self.persoh = pygame.image.load("./data/tetebrouge.png").convert_alpha()
self.persod = pygame.image.load("./data/tetebrouge.png").convert_alpha()
self.persog = pygame.image.load("./data/tetebrouge.png").convert_alpha()
#Chargement de le tête actuelle car différentes directions
self.serpent = self.persod
self.position_serpent = self.serpent.get_rect()
self.position_serpent = self.position_serpent.move(200,300)
#Vitesse du serpent
self.horloge = pygame.time.Clock()
self.width = width
self.height = height
self.vitesse = 20
def gauche(self):
#le perso va vers la gauche de 3 pixels
self.serpent = self.persog
self.pcsx -= 3
def droite(self):
#le perso va vers la droite de 3 pixels
self.serpent = self.persod
self.pcsx += 3
def haut(self):
#On monte le perso de 3 pixels
self.serpent = self.persoh
self.pcsy -= 3
def bas(self):
#On descend le perso de 3 pixels
self.serpent = self.persob
self.pcsy += 3
def aff(self, ecran):
ecran.blit(self.corpserpent, (self.pcsx,self.pcsy))
ecran.blit(self.serpent, (200,300))
for i in range(self.queue):
self.pcsx = self.pcsx - 15
self.position_corpserpent = self.position_corpserpent.move(self.pcsx,self.pcsy)
ecran.blit(self.corpserpent, (self.pcsx,self.pcsy))
#Chargement et collage de personnages
class Pomme:
def __init__(self):
self.x, self.y = 300, 305
self.pomme = pygame.image.load("./data/ball.png").convert_alpha()
def aff(self, ecran):
ecran.blit(self.pomme, (self.x,self.y))
serp = Serpent()
serp.aff(fenetre)
pom = Pomme()
pom.aff(fenetre)
#Rafraîchissement de l'écran
pygame.display.flip()
#BOUCLE INFINIE
while 1:
serp.horloge.tick(4)
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
serp.haut()
elif event.key == pygame.K_DOWN:
serp.bas()
elif event.key == pygame.K_RIGHT:
serp.droite()
elif event.key == pygame.K_LEFT:
serp.gauche()
print (serp.pcsx, serp.pcsy)
#!/usr/bin/python
#-*- coding: utf-8 -*-
VERSION = "0.5.0"
try:
import sys
import random
import os
import pygame
from pygame.locals import *
except ImportError, err:
print "Impossible de charger le module. %s" % (err)
sys.exit(2)
def load_png(name):
fullname = os.path.join('data', name)
try:
image = pygame.image.load(fullname)
image.set_colorkey((255, 255, 255))
if image.get_alpha is None:
image = image.convert()
else:
image = image.convert_alpha()
except pygame.error, message:
print "Impossible de charger l'image : ", fullname
raise SystemExit, message
return image
screen_size = (400, 300)
class Tete(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = load_png('tetebrouge.png')
self.rect = self.image.get_rect()
screen = pygame.display.get_surface()
self.area = screen.get_rect()
self.sens = "stop"
self.pause = "stop"
self.hist = list()
self.pos = (self.rect.left, self.rect.top)
for z in range(5):
self.hist.append(self.pos)
def update(self):
if self.sens != "stop":
if self.sens == "up":
self.rect.top -= 4
if self.sens == "down":
self.rect.top +=4
if self.sens == "left":
self.rect.left -=4
if self.sens == "right":
self.rect.left +=4
self.pos = (self.rect.left, self.rect.top)
del self.hist[0]
self.hist.append(self.pos)
class Elt(pygame.sprite.Sprite):
def __init__(self, pos):
pygame.sprite.Sprite.__init__(self)
self.image = load_png('blocrouge.png')
self.rect = self.image.get_rect()
screen = pygame.display.get_surface()
self.area = screen.get_rect()
self.rect.left = pos[0]
self.rect.top = pos[1]
self.pos = (self.rect.left, self.rect.top)
self.hist = list()
for z in range(5):
self.hist.append(self.pos)
def update(self, pos):
self.pos = pos
del self.hist[0]
self.hist.append(self.pos)
class Apple(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = load_png('ball.png')
self.rect = self.image.get_rect()
self.pos = (0, 0)
self.new_pos()
def new_pos(self):
x = random.randrange(20, screen_size[0]-20)
y = random.randrange(20, screen_size[1]-20)
self.pos = (x, y)
def main():
# Initialisation de la fenêtre d'affichage
pygame.init()
screen = pygame.display.set_mode(screen_size)
pygame.display.set_caption('Sn4ke')
# Remplissage de l'arrière-plan
background = pygame.Surface(screen.get_size())
background = background.convert()
background.fill((50, 0, 50))
# Création des objets du jeu
apple = Apple()
tete = Tete()
elt = list()
elt.append(Elt(tete.pos))
# Affichage des objets
screen.blit(background, (0, 0))
screen.blit(apple.image, apple.pos)
screen.blit(tete.image, tete.rect)
# Initialisation de l' horloge
clock = pygame.time.Clock()
# Boucle principale ou boucle d' évennements
while 1:
# Vitesse du jeu
clock.tick(30)
if tete.sens != "stop":
# Mise à jour de la position des éléments du serpent
tete.update()
i = 1
elt[0].update(tete.hist[0])
while i < len(elt):
elt[i].update(elt[i-1].hist[0])
i += 1
# Détection de collision tête du serpent / pomme
if (tete.pos[0])-15 < apple.pos[0] < (tete.pos[0])+15:
if (tete.pos[1])-15 < apple.pos[1] < (tete.pos[1])+15:
elt.append(Elt(elt[-1].hist[0]))
apple = Apple()
# Gestion des entrées utilisateur
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
return
elif event.type == KEYDOWN:
if event.key == K_UP:
tete.sens = "up"
if event.key == K_DOWN:
tete.sens = "down"
if event.key == K_LEFT:
tete.sens = "left"
if event.key == K_RIGHT:
tete.sens = "right"
if event.key == K_SPACE:
if tete.sens == "stop":
tete.sens = tete.pause
else:
tete.pause = tete.sens
tete.sens = "stop"
if event.key == K_RETURN and tete.sens == "end":
main() #recommence une partie
# Détection de collision tête / bord de fenetre
if tete.pos[0] < 0 or tete.pos[0] > screen_size[0]-20:
tete.sens = "end"
if tete.pos[1] < 0 or tete.pos[1] > screen_size[1]-20:
tete.sens = "end"
# Affichage des éléments du jeu
screen.blit(background, (0, 0))
screen.blit(apple.image, apple.pos)
screen.blit(tete.image, tete.rect)
i=0
while i < len(elt):
screen.blit(elt[i].image, elt[i].pos)
i += 1
pygame.display.flip()
# Appel de la fonction principale
if __name__ == '__main__':
main()
Bonjour, merci de ton aide, ça m'a permit d'y voir plus clair ! Mais je ne vois toujours pas comment faire mon mouvement continu ... Si quelqu'un peut me mettre sur la voie ...
#-*- coding: utf-8 -*-
import pygame, random
from random import randrange
from pygame.locals import *
pygame.init()
#Ouverture de la fenêtre Pygame
fenetre = pygame.display.set_mode((1000, 650))
fond = pygame.image.load("background.jpg").convert()
pygame.display.set_caption("Mon Snake By Vandlor !! ")
class Serpent:
def __init__(self, width = 1000, height = 650):
self.pcsx, self.pcsy = 190, 300
self.nbcorps = 5
self.decx = 13
self.decy = 0
self.direction = "D" # G, H, B
self.corpserpent = pygame.image.load("serpent.png").convert_alpha()
self.position_corpserpent = self.corpserpent.get_rect()
self.position_corpserpent = self.position_corpserpent.move(self.pcsx,self.pcsy)
#Chargement des différentes têtes
self.persob = pygame.image.load("tetebrouge.png").convert_alpha()
self.persoh = pygame.image.load("tetehrouge.png").convert_alpha()
self.persod = pygame.image.load("tetedrouge.png").convert_alpha()
self.persog = pygame.image.load("tetegrouge.png").convert_alpha()
#Chargement de le tête actuelle car différentes directions
self.serpent = self.persod
self.position_serpent = self.serpent.get_rect()
self.position_serpent = self.position_serpent.move(200,300)
#Vitesse du serpent
self.horloge = pygame.time.Clock()
self.width = width
self.height = height
self.vitesse = 20
def avance(self):
if self.direction == "D":
self.droite()
elif self.direction == "H":
self.haut()
elif self.direction == "G":
self.gauche()
elif self.direction == "B":
self.bas()
def gauche(self):
self.direction = "G"
#le perso va vers la gauche de 3 pixels
self.serpent = self.persog
self.pcsx -= 8
self.decx = -13
self.decy = 0
def droite(self):
self.direction = "D"
#le perso va vers la droite de 3 pixels
self.serpent = self.persod
self.pcsx += 8
self.decx = 13
self.decy = 0
def haut(self):
self.direction = "H"
#On monte le perso de 3 pixels
self.serpent = self.persoh
self.pcsy -= 8
self.decx = 0
self.decy = -13
def bas(self):
self.direction = "B"
#On descend le perso de 3 pixels
self.serpent = self.persob
self.pcsy += 8
self.decx = 0
self.decy = 13
def aff(self, ecran, fond):
ecran.blit(fond, (0,0))
for i in range(1, self.nbcorps+1):
ecran.blit(self.corpserpent, (self.pcsx - (self.decx*(self.nbcorps+1-i)),self.pcsy - (self.decy*(self.nbcorps+1-i))))
ecran.blit(self.serpent, (self.pcsx,self.pcsy))
def vitesse (self):
return self.vitesse
#Chargement et collage de personnages
class Pomme:
def __init__(self):
self.px, self.py = 300, 305
self.pomme = pygame.image.load("pomme.png").convert_alpha()
def aff(self, ecran):
ecran.blit(self.pomme, (self.px,self.py))
serp = Serpent()
serp.aff(fenetre, fond)
pom = Pomme()
#Rafraîchissement de l'écran
pygame.display.flip()
pygame.key.set_repeat(200,50)
#BOUCLE INFINIE
while 1:
serp.horloge.tick(serp.vitesse)
serp.avance()
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
serp.haut()
elif event.key == pygame.K_DOWN:
serp.bas()
elif event.key == pygame.K_RIGHT:
serp.droite()
elif event.key == pygame.K_LEFT:
serp.gauche()
print (serp.pcsx, serp.pcsy)
#Rafraîchissement de l'écran
serp.aff(fenetre, fond)
pom.aff(fenetre)
pygame.display.flip()
Bonjour, j'ai un peu avancé, mon serpent bouge tout seul mais je ne vois pas comment faire pour que le mouvement du corps soit plus fluide, c'est à dire que les aurtres parties du corps suivent la tête.. Quelqu'un a une idée ou saurait m'aider ?
Bonne journée
Jeu en Pygame
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Python c'est bon, mangez-en.
Python c'est bon, mangez-en.
Python c'est bon, mangez-en.