Collision pygame

Bonjour, je commence en pygame et je me suis lancé le défi de coder un petit jeu (snake) par moi-même sachant que j'en ai déjà codé plusieurs en suivant des tutos. Pour les collisions j'ai trouvé la fonction colliderect que j'avais déjà utilisée auparavant mais quand j'exécut le programme j'obtiens l'erreur suivante : NameError: name 'food' is not defined

voici mon code :

import pygame
import random
import time
import sys

from pygame.constants import K_DOWN, K_LEFT, K_RIGHT, K_UP
pygame.init()

NB_COL = 10
NB_ROW = 15
CELL_SIZE = 40
screen = pygame.display.set_mode(size=(NB_COL * CELL_SIZE, NB_ROW * CELL_SIZE))
timer = pygame.time.Clock()
game_on = True

def grid():
for i in range (NB_COL):
for j in range (NB_ROW):
rect = pygame.Rect(i*CELL_SIZE, j*CELL_SIZE, CELL_SIZE, CELL_SIZE)
pygame.draw.rect(screen, pygame.Color("black"), rect, width = 1)
def food_move():
x = random.randrange(0,360,40)
y = random.randrange(0,560,40)
global food
food = pygame.Rect(x, y, CELL_SIZE, CELL_SIZE)
food = pygame.draw.rect(screen, pygame.Color("green"), food)

def snake_move():
x = 40
y = 40
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x-=40
elif event.key == pygame.K_RIGHT:
x+=40
elif event.key == pygame.K_UP:
y-=40
elif event.key == pygame.K_DOWN:
y +=40
global snake
snake = pygame.Rect(x, y, CELL_SIZE, CELL_SIZE)
pygame.draw.rect(screen, pygame.Color("red"), snake)

while game_on:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
screen.fill(pygame.Color("white"))
grid()
if food.colliderect(snake) == -1:
food_move()
snake_move()
pygame.display.update()
timer.tick(60)
Pouvez vous m'aider svp?
P-S Je débute sur le forum donc si ma question n'est pas claire n'hésitez pas à le dire

Configuration: Windows / Chrome 92.0.4515.107

4 réponses

  • Votes
  • Date
  • Date décroissante
  1. import pygame
    import random
    import time
    import sys
    
    from pygame.constants import K_DOWN, K_LEFT, K_RIGHT, K_UP
    pygame.init()
    
    NB_COL = 10
    NB_ROW = 15
    CELL_SIZE = 40
    screen = pygame.display.set_mode(size=(NB_COL * CELL_SIZE, NB_ROW * CELL_SIZE))
    timer = pygame.time.Clock()
    game_on = True
    
    def grid():
        for i in range (NB_COL):
            for j in  range (NB_ROW):
                rect = pygame.Rect(i*CELL_SIZE, j*CELL_SIZE, CELL_SIZE, CELL_SIZE)
                pygame.draw.rect(screen, pygame.Color("black"), rect, width = 1)
    def food_move():
        x = random.randrange(0,360,40)
        y = random.randrange(0,560,40)
        global food
        food = pygame.Rect(x, y, CELL_SIZE, CELL_SIZE)
        food = pygame.draw.rect(screen, pygame.Color("green"), food)
    
    def snake_move():
        x = 40
        y = 40
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                x-=40
            elif event.key == pygame.K_RIGHT:
                x+=40
            elif event.key == pygame.K_UP:
                y-=40
            elif event.key == pygame.K_DOWN:
                y +=40   
        global snake
        snake = pygame.Rect(x, y, CELL_SIZE, CELL_SIZE)
        pygame.draw.rect(screen, pygame.Color("red"), snake)
    
    
    while game_on:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
        screen.fill(pygame.Color("white"))
        grid()
        if food.colliderect(snake) == -1:
            food_move()
        snake_move()
        pygame.display.update()
        timer.tick(60)
    1. Contributeur
      le message d'erreur mentionne-t-il un numéro de ligne?
      es-tu certain que la variable foot a déjà une valeur au moment où tu exécutes cette ligne?
    2. @yg_beligne 52, et oui effectivement la variable n'a pas encore de valeur
  2. A la ligne 52 food est inconnue

    Elle est initialisée juste après dans la fonction food_move() ... trop tard