Collision pygame

Fermé
Manjuve - 26 juil. 2021 à 23:41
Manjuve Messages postés 3 Date d'inscription mardi 27 juillet 2021 Statut Membre Dernière intervention 27 juillet 2021 - 27 juil. 2021 à 18:09
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 lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
27 juil. 2021 à 11:35
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 mardi 27 juillet 2021 Statut Membre Dernière intervention 27 juillet 2021
27 juil. 2021 à 14:29
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 23306 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 1 novembre 2024 1 550
27 juil. 2021 à 15:01
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 mardi 27 juillet 2021 Statut Membre Dernière intervention 27 juillet 2021 > yg_be Messages postés 23306 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 1 novembre 2024
27 juil. 2021 à 18:09
ligne 52, et oui effectivement la variable n'a pas encore de valeur
0
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
Modifié le 27 juil. 2021 à 16:12
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 mardi 27 juillet 2021 Statut Membre Dernière intervention 27 juillet 2021
27 juil. 2021 à 18:08
ah oui merci!
0