Partage
  • Partager sur Facebook
  • Partager sur Twitter

Jeu en Pygame

    28 avril 2011 à 11:37:31

    Bonjour,


    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.



    Merci, bonne journée.
    • Partager sur Facebook
    • Partager sur Twitter
      28 avril 2011 à 11:59:23

      t'as pensé à quelle structure pour le tableau et le serpent ?
      • Partager sur Facebook
      • Partager sur Twitter

      Python c'est bon, mangez-en. 

        28 avril 2011 à 12:10:28

        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 ...
        • Partager sur Facebook
        • Partager sur Twitter
          28 avril 2011 à 12:22:40

          alors c'est moi qui ne comprends pas ... tu peux préciser le problème ?
          • Partager sur Facebook
          • Partager sur Twitter

          Python c'est bon, mangez-en. 

            28 avril 2011 à 12:26:03

            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
            • Partager sur Facebook
            • Partager sur Twitter
              28 avril 2011 à 13:43:22

              Salut iMhooTeP, :)

              Bienvenue sur le forum python! :D

              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.
              • Partager sur Facebook
              • Partager sur Twitter
                29 avril 2011 à 8:45:32

                #-*- 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("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 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("pomme.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 continuer:
                	self.horloge.tick(4)
                	for event in pygame.event.get():
                		elif event.type == pygame.KEYDOWN:
                			if event.key   == pygame.K_UP:
                				Serpent.haut
                				self.perso.image = self.perso.persoh              
                			elif event.key == pygame.K_DOWN:
                				Serpent.bas
                				self.perso.image = self.perso.persob 
                			elif event.key == pygame.K_RIGHT:
                				Serpent.droite
                				self.perso.image = self.perso.persod   
                			elif event.key == pygame.K_LEFT:
                				Serpent.gauche
                				self.perso.image = self.perso.persog
                


                Oui je suis débutant en programmation, je connais le python mais pas tant que ça, j'ai déjà fait quelques petits programmes, mais très simple.
                • Partager sur Facebook
                • Partager sur Twitter
                  29 avril 2011 à 14:53:40

                  j'ai essayé de corriger pas mal de fautes, mais le problème est de certains attributs n'existent pas ...
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Python c'est bon, mangez-en. 

                    29 avril 2011 à 23:42:01

                    Salut

                    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" :p

                    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()
                    
                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 mai 2011 à 14:05:02

                      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 ...

                      Bonne journée
                      • Partager sur Facebook
                      • Partager sur Twitter
                        12 mai 2011 à 11:50:25

                        #-*- 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
                        • Partager sur Facebook
                        • Partager sur Twitter

                        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.
                        • Editeur
                        • Markdown