Problème NameError quand je lance mon programme [Résolu]

Messages postés
49
Date d'inscription
mardi 10 mai 2016
Statut
Membre
Dernière intervention
1 septembre 2019
-
Bonjour, j'ai un problème sur un de mes projets en python.
Quand je le lance j'ai : "File "projet.py", line 166, in draw_window
for bird in birds:
NameError: name 'birds' is not defined

Voici le code :
import pygame 
import neat
import time 
import os 
import random 
pygame.font.init()

WIN_WIDTH = 500
WIN_HEIGHT = 800

BIRD_IMGS = [pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird1.png"))), pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird2.png"))), pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird3.png")))]
PIPE_IMG = pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "pipe.png")))
BASE_IMG = pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "base.png")))
BG_IMG = pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bg.png")))
STAT_FONT = pygame.font.SysFont("comicsans", 42)

class Bird:
 IMGS = BIRD_IMGS
 MAX_ROTATION = 25
 ROT_VEL = 20
 ANIMATION_TIME = 5

 def __init__(self, x, y):
  self.x = y
  self.y = y
  self.tilt = 0
  self.tick_count = 0
  self.vel = 0
  self.height = self.y
  self.img_count = 0
  self.img = self.IMGS[0]


 def jump(self):
  self.vel = -10.5
  self.tick_count = 0
  self.height = self.y

 def move(self):
  self.tick_count += 1

  d = self.vel*self.tick_count + 1.5*self.tick_count**2

  if d >= 16:
   d = 16

  if d < 0:
   d -= 2


  self.y = self.y + d


  if d < 0 or self.y < self.height + 50:
   if self.tilt < self.MAX_ROTATION:
    self.tilt = self.MAX_ROTATION
  else:
   if self.tilt > -90:
    self.tilt -= self.ROT_VEL

 def draw(self, win):
  self.img_count +=1 

  if self.img_count < self.ANIMATION_TIME:
   self.img = self.IMGS[0]
  elif self.img_count < self.ANIMATION_TIME*2:
   self.img = self.IMGS[1]
  elif self.img_count < self.ANIMATION_TIME*3:
   self.img = self.IMGS[2]
  elif self.img_count < self.ANIMATION_TIME*4:
   self.img = self.IMGS[1]
  elif self.img_count == self.ANIMATION_TIME*4 + 1:
   self.img = self.IMGS[0]
   self.img_count = 0

  if self.tilt <= -80:
   self.img = self.IMGS[1]
   self.img_count = self.ANIMATION_TIME*2

  rotated_image = pygame.transform.rotate(self.img, self.tilt)
  new_rect = rotated_image.get_rect(center=self.img.get_rect(topleft = (self.x, self.y)).center)
  win.blit(rotated_image, new_rect.topleft)

 def get_mask(self):
  return pygame.mask.from_surface(self.img)

class Pipe:
 GAP = 200
 VEL = 5

 def __init__(self, x):
  self.x = x
  self.height = 0
  self.gap = 100

  self.top = 0
  self.bottom = 0
  self.PIPE_TOP = pygame.transform.flip(PIPE_IMG, False, True)
  self.PIPE_BOTTOM = PIPE_IMG

  self.passed = False 
  self.set_height()

 def set_height(self):
  self.height = random.randrange(50, 450)
  self.top = self.height - self.PIPE_TOP.get_height()
  self.bottom = self.height + self.GAP

 def move(self):
  self.x -= self.VEL

 def draw(self, win):
  win.blit(self.PIPE_TOP, (self.x, self.top))
  win.blit(self.PIPE_BOTTOM, (self.x, self.bottom))

 def collide(self, bird):
  bird_mask = bird.get_mask()
  top_mask = pygame.mask.from_surface(self.PIPE_TOP)
  bottom_mask = pygame.mask.from_surface(self.PIPE_BOTTOM)

  top_offset = (self.x - bird.x, self.top - round(bird.y))
  bottom_offset = (self.x - bird.x, self.bottom - round(bird.y))

  b_point = bird_mask.overlap(bottom_mask, bottom_offset)
  t_point = bird_mask.overlap(top_mask, top_offset)

  if t_point or b_point:
   return True

  return False

class Base:
 VEL = 5
 WIDTH = BASE_IMG.get_width()
 IMG = BASE_IMG

 def __init__(self, y):
  self.y = y
  self.x1 = 0
  self.x2 = self.WIDTH

 def move(self):
  self.x1 -= self.VEL
  self.x2 -= self.VEL

  if self.x1 + self.WIDTH < 0:
   self.x1 = self.x2 + self.WIDTH

  if self.x2 + self.WIDTH < 0:
   self.x2 = self.x1 + self.WIDTH

 def draw(self, win):
  win.blit(self.IMG, (self.x1, self.y))
  win.blit(self.IMG, (self.x2, self.y))

def draw_window(win, bird, pipes, base, score):
 win.blit(BG_IMG, (0,0))

 for pipe in pipes:
  pipe.draw(win)

 text = STAT_FONT.render("Score : " + str(score), 1,(255,255,255))
 win.blit(text, (WIN_WIDTH - 370 - text.get_width(), 10))

 base.draw(win)
 for bird in birds:
  bird.draw(win)

 pygame.display.update()


def main(genomes, config):
 nets = []
 ge = []
 birds = []

 for _, g in genomes:
  net = neat.nn.FeedForwardNetwork.create(g, config)
  nets.append(net)
  birds.append(Bird(230, 350))
  g.fitness = 0
  ge.append(g)


 base = Base(730)
 pipes = [Pipe(700)]
 win = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
 clock = pygame.time.Clock()

 score = 0

 run = True
 while run:
  clock.tick(30)
  for event in pygame.event.get():
   if event.type == pygame.QUIT:
    run = False
    pygame.quit()
    quit()

  pipe_ind = 0
  if len(birds) > 0:
   if len(pipes) > 1 and birds[0].x > pipes[0].x + pipes[0].PIPE_TOP.get_width():
    pipe_ind = 1
  else:
   run = False
   break

  for x, bird in enumerate(birds):
   bird.move()
   ge[x].fitness += 0.1

   output = nets[x].activate((bird.y, abs(bird.y - pipes[pipe_ind].height), abs(bird.y - pipes[pipe_ind].bottom)))

   if output[0] > 0.5:
    bird.jump()

  add_pipe = False 
  rem = []
  for pipe in pipes:
   for x, bird in enumerate(birds):
    if pipe.collide(bird):
     ge[x].fitness -= 1
     birds.pop(x)
     nets.pop(x)
     ge.pop(x)


    if not pipe.passed and pipe.x < bird.x:
     pipe.passed = True
     add_pipe = True

   if pipe.x + pipe.PIPE_TOP.get_width() < 0:
     rem.append(pipe)
   
   pipe.move()

  if add_pipe:
   score += 1
   for g in ge:
    g.fitness += 5
   pipes.append(Pipe(600))

  for r in rem:
   pipes.remove(r)

  for x, bird in enumerate(birds):
   if bird.y + bird.img.get_height() >= 730 or bird.y < 0:
    birds.pop(x)
    nets.pop(x)
    ge.pop(x)

  base.move()
  draw_window (win, birds, pipes, base, score)


def run(config_path):
 config = neat.config.Config(neat.DefaultGenome, neat.DefaultReproduction,
  neat.DefaultSpeciesSet, neat.DefaultStagnation,
  config_path)

 p = neat.Population(config)

 p.add_reporter(neat.StdOutReporter(True))
 stats = neat.StatisticsReporter()
 p.add_reporter(stats)

 winner = p.run(main,50)

if __name__ == "__main__":
 local_dir = os.path.dirname(__file__)
 config_path = os.path.join(local_dir, 'NeatConfig.txt')
 run(config_path)


Merci de m'aider. Au revoir !
Afficher la suite 

1 réponse

Messages postés
8433
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
3 septembre 2019
417
0
Merci
bonjour,
le message t'indique que le nom "birds" est inconnu dans la fonction draw_window.
à ce que je vois, le message est correct.
je pense que tu ne devrais pas ainsi utiliser les mêmes noms de variable partout, cela crée de la confusion.
Commenter la réponse de yg_be