Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Snake] Problème pour diriger le serpent

    27 juillet 2017 à 22:53:45

    Hey ! J'essaye de faire un snake avec un menu pour m'entraîner, mais je rencontre maintenant un gros problème, sûrement du au fait que j'ai changé l'organisation du programme, mais je n'arrive pas à comprendre pourquoi il est là.

    Mes touches pour diriger le snake (les flèches) ne marchent pas. J'ai vérifié que j'avais bien mis les bonnes commandes, que rien n'empêchait l'action de se produire, et je n'ai rien trouvé (en tout cas rien que je ne connaisse). Le snake se dirige donc vers le bas (sa direction par défaut) et ne tourne pas, même si j'appuie sur le touches.

    Je vous laisse donc le code, en espérant que quelqu'un sache m'expliquer ce qu'il se passe.

    #Le fichier principal du jeu
    import pygame
    from pygame.locals import *
    from random import randint
    from constantes import *
    from fonctions import *
    
    pygame.init()
    
    #Couleurs
    white = 255, 255, 255
    black = 0, 0, 0
    green_1 = 128, 255, 0
    green_2 = 0, 64, 0
    green_3 = 156, 209, 31
    red = 128, 0, 0
    red_2 = 141, 41, 27
    
    #FPS
    fps_cap = 10
    clock = pygame.time.Clock()
    
    global orientation, down, up, right, left
    #Déplacements
    orientation = 0
    down = (0,+1)
    up = (0,-1)
    right = (+1,0)
    left = (-1,0)
    
    #BOUCLE PRINCIPALE
    running = 1
    while running:
    	
    	#Création de la fenêtre
    	screen = pygame.display.set_mode((width,height+150))
    	#Personnalisation de la fenêtre
    	icone = pygame.image.load(img_icone).convert_alpha()
    	pygame.display.set_icon(icone)
    	pygame.display.set_caption(titre_fenetre)
    	#On crée le menu
    	menu()
    	pygame.display.flip()
    	running_menu = 1
    	running_game = 1
    	
    	#BOUCLE DU MENU
    	while running_menu:
    	
    		#On reset les données du jeu
    		reset()
    		
    		#On rappelle les rectangles, et on reconnait si la souris passe sur eux
    		rect_jouer = pygame.draw.rect(screen, red_2, [195, 295, 250, 70])
    		rect_instructions = pygame.draw.rect(screen, red_2, [195, 435, 250, 70])
    		rect_quitter = pygame.draw.rect(screen, red_2, [195, 575, 250, 70])
    		mouse_xy = pygame.mouse.get_pos()
    		over_jouer = rect_jouer.collidepoint(mouse_xy)
    		over_instructions = rect_instructions.collidepoint(mouse_xy)
    		over_quitter = rect_quitter.collidepoint(mouse_xy)
    		
    		#Gestion des événements du menu
    		for event in pygame.event.get():
    			#Si le joueur appuie sur 'QUIT'
    			if event.type == MOUSEBUTTONDOWN and over_quitter or event.type == QUIT:
    				running_menu = 0
    				running_game = 0
    				running = 0
    			#Si le joueur appuie sur 'PLAY'
    			if event.type == MOUSEBUTTONDOWN and over_jouer:
    				running_menu = 0
    				
    	#BOUCLE DE JEU
    	while running_game:
    		
    		#On limite les fps
    		clock.tick(fps_cap)
    		#Gestion des événements du jeu
    		for event in pygame.event.get():
    			if event.type == QUIT:
    				running_game = 0
    				running = 0
    			if event.type == KEYDOWN:
    				if event.key == K_UP:
    					if orientation != down:
    						orientation = up
    				if event.key == K_RIGHT:
    					if orientation != left:
    						orientation = right
    				if event.key == K_DOWN:
    					if orientation != up:
    						orientation = down
    				if event.key == K_LEFT:
    					if orientation != right:
    						orientation = left
    		#On met à jour l'écran
    		update()
    		render(screen)
    		pygame.display.flip()
    #Le fichier contenant les fonctions
    import pygame
    from pygame.locals import *
    from constantes import *
    from random import randint
    
    pygame.init()
    
    #Les variables communes
    global screen, white, black, green_1, green_2, green_3, red, red_2
    #La fenêtre
    screen = pygame.display.set_mode((width,height+150))
    #Couleurs
    white = 255, 255, 255
    black = 0, 0, 0
    green_1 = 128, 255, 0
    green_2 = 0, 64, 0
    green_3 = 156, 209, 31
    red = 128, 0, 0
    red_2 = 141, 41, 27
    
    def menu():
    	"""Fonction permettant d'afficher les boutons 'jouer, 'instructions' et 'quitter',
    	et le rectangle 'crédits' du bas"""
    	global screen, clock
    	green_2 = 0, 64, 0
    	green_3 = 156, 209, 31
    	red_2 = 141, 41, 27
    	white = 255, 255, 255
    	#Le fond
    	screen.fill(green_3)
    	#Les rectangles
    	rect_jouer = pygame.draw.rect(screen, red_2, [195, 295, 250, 70])
    	rect_instructions = pygame.draw.rect(screen, red_2, [195, 435, 250, 70])
    	rect_quitter = pygame.draw.rect(screen, red_2, [195, 575, 250, 70])
    	rect_credits = pygame.draw.rect(screen, green_2, [0, 750, 640, 40])
    	#Les textes
    	#On définit la police
    	pol_title = pygame.font.SysFont("Perpetua Titling MT", 120)
    	pol_boutons = pygame.font.SysFont("Perpetua Titling MT", 35)
    	pol_credits = pygame.font.SysFont("Perpetua Titling MT", 25)
    	#On définit le texte
    	txt_title = pol_title.render("SNAKE", True, white)
    	txt_bouton_j = pol_boutons.render("PLAY", True, white)
    	txt_bouton_i = pol_boutons.render("INSTRUCTIONS", True, white)
    	txt_bouton_q = pol_boutons.render("QUIT", True, white)
    	txt_credits = pol_credits.render("Developped by Chwett", True, white)
    	#On récupère les rectangles
    	pos_title = txt_title.get_rect()
    	pos_bouton_j = txt_bouton_j.get_rect()
    	pos_bouton_i = txt_bouton_i.get_rect()
    	pos_bouton_q = txt_bouton_j.get_rect()
    	pos_credits = txt_credits.get_rect()
    	pos_title.centerx = screen.get_rect().centerx
    	pos_bouton_j.centerx = screen.get_rect().centerx
    	pos_bouton_i.centerx = screen.get_rect().centerx
    	pos_bouton_q.centerx = screen.get_rect().centerx
    	pos_credits.centerx = screen.get_rect().centerx
    	pos_title.centery = 100
    	pos_bouton_j.centery = 330
    	pos_bouton_i.centery = 470
    	pos_bouton_q.centery = 610
    	pos_credits.centery = 770
    	#On colle sur la fenêtre
    	screen.blit(txt_title, pos_title)
    	screen.blit(txt_bouton_j, pos_bouton_j)
    	screen.blit(txt_bouton_i, pos_bouton_i)
    	screen.blit(txt_bouton_q, pos_bouton_q)
    	screen.blit(txt_credits, pos_credits)
    	
    def update():
    	"""Fonction permettant de contrôler l'affichage du snake"""
    	global bonus, snake_parts, snake_size, orientation, over, score
    	x,y = snake_parts[-1]
    	x += orientation[0]
    	y += orientation[1]
    	new_part = (x,y)
    	
    	#Si le serpent va sur le bonus
    	if new_part == bonus:
    		snake_size += 1
    		new_bonus()
    		score += 1
    	#Si le serpent se cogne à lui-même
    	if new_part in snake_parts:
    		over = True
    	#Si on sort de l'écran
    	if not 0 <= x < nx:
    		over = True
    	if not 0 <= y < ny:
    		over = True
    	#Si on perd
    	
    	#On ajoute une tête au serpent
    	snake_parts.append(new_part)
    	#On supprime la dernière case du serpent
    	if len(snake_parts) > snake_size:
    		del snake_parts[0]
    			
    def render(screen):
    	"""Fonction permettant d'afficher les éléments du jeu"""
    	screen.fill(green_1)
    	x, y = bonus
    	draw_cell(screen, bonus, red)
    	for part in snake_parts:
    		draw_cell(screen, part, green_2)
    		
    def draw_cell(screen, cell, color):
    	"""Fonction permettant de créer les éléments du jeu"""
    	pygame.draw.rect(screen, color, (cell[0]*size,cell[1]*size,size,size))
    
    def new_bonus():
    	"""Fonction permettant de générer le bonus aléatoirement"""
    	global bonus
    	x = randint(0, nx-1)
    	y = randint(0, ny-1)
    	bonus = (x,y+4)
    	
    def reset():
    	"""Fonction permettant de reset tous les paramètres de début de 
    	partie lorsqu'on perd"""
    	global snake_parts, snake_size, orientation, over, score
    	new_bonus()
    	snake_parts = [(0,4)]
    	snake_size = 4
    	score = 0
    	down = (0,+1)
    	orientation = down
    	over = False
    #Et enfin les constantes
    import pygame
    from pygame.locals import *
    
    #Images
    img_icone = "images/icone.jpg"
    
    #Textes
    titre_fenetre = "Snake"
    
    #Nombre de cases par axe
    nx = 20
    ny = 20
    
    #Dimensions
    size = 32
    width = nx * size
    height = ny * size

    Merci d'avance à ceux qui voudront bien m'aider :)




    • Partager sur Facebook
    • Partager sur Twitter

    [Snake] Problème pour diriger le serpent

    × 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