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