Collision pygame

Manjuve -  
Manjuve Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -
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

Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
Bonjour,


L'indentation étant importante en Python, merci de copier/coller ici ton code complet avec les balises de code
mode d'emploi:
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Visuellement, ça doit ressembler à ceci (avec la coloration syntaxique) :

def test():
    print('test')

test()
0
Manjuve Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 
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)
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
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?
0
Manjuve Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
ligne 52, et oui effectivement la variable n'a pas encore de valeur
0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
A la ligne 52 food est inconnue

Elle est initialisée juste après dans la fonction food_move() ... trop tard
0
Manjuve Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 
ah oui merci!
0