2011-10-22 1 views
1

Я следовал a tutorial, но получаю следующее сообщение об ошибке
AttributeError: Worm instance has no attribute 'move'
я не уверен, что именно это значит и как это исправить. Ошибка относится к линии 44 в направлении нижней линии является w.move()(это один в решается вид ниже)Что такое сообщение об ошибке - (AttributeError: экземпляр Worm не имеет атрибута «vx») и как я могу его исправить?

import pygame 

class Worm: 
    """A Worm.""" 
    def __init__(self, surface, x, y, length): 
     self.surface = surface 
     self.x = x 
     self.y = y 
     self.length = length 
     self.dir_x = 0 
     self.dir_y = -1 
     self.body = [] 
     self.crashed = False 

    def key_event(self, event): 
     """Handle Key events that affect the worm.""" 
     if event.key == pygame.K_UP: 
      self.dir_x = 0 
      self.dir_y = -1 
     elif event.key == pygame.K_DOWN: 
      self.dir_x = 0 
      self.dir_y = 1 
     elif event.key == pygame.K_DOWN: 
      self.dir_x = -1 
      self.dir_y = 0 
     elif event.key == pygame.K_DOWN: 
      self.dir_x = 1 
      self.dir_y = 0 
    def draw(self): 
     for x, y in self.body: 
      self.surface.set_at((x, y), (255, 255, 255)) 

width = 640 
height = 400 

screen = pygame.display.set_mode((width, height)) 
clock = pygame.time.Clock() 
running = True 

w = Worm(screen, width/2, height/2, 200) 

while running: 
    screen.fill((0, 0, 0)) 
    w.move() 
    w.draw() 

    if w.crashed or w.x <= 0 or w.x >= width -1 or w.y <= 0 or w.y >= height -1: 
     print "crash" 
     running = False 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 
     elif event.type == pygame.KEYDOWN: 
      w.key_event(event) 

    pygame.display.flip() 
    clock.tick(240) 

---------- Изменение --------

код:

import pygame 

class Worm: 
    """A Worm.""" 
    def __init__(self, surface, x, y, length): 
     self.surface = surface 
     self.x = x 
     self.y = y 
     self.length = length 
     self.dir_x = 0 
     self.dir_y = -1 
     self.body = [] 
     self.crashed = False 

    def key_event(self, event): 
     """Handle Key events that affect the worm.""" 
     if event.key == pygame.K_UP: 
      self.dir_x = 0 
      self.dir_y = -1 
     elif event.key == pygame.K_DOWN: 
      self.dir_x = 0 
      self.dir_y = 1 
     elif event.key == pygame.K_DOWN: 
      self.dir_x = -1 
      self.dir_y = 0 
     elif event.key == pygame.K_DOWN: 
      self.dir_x = 1 
      self.dir_y = 0 
    def draw(self): 
     for x, y in self.body: 
      self.surface.set_at((x, y), (255, 255, 255)) 
    def move(self): 
     """move worm.""" 
     self.x += self.vx 
     self.y += self.vy 

     if (self.x, sel.y) in self.body: 
      self.crashed = True 

     self.body.insert(0, (self.x, self.y)) 

     if len(self.body) > self.length: 
      self.body.pop() 

    def draw(self): 
     #for x, y self.body: 
     # self.surface.set_at((x, y),self.color) 
     x, y = self.body[0] 
     self.surface.set_at((x, y), self.color) 
     x, y = self.body[-1] 
     self.surface.set_at((x, y), (0, 0, 0)) 


width = 640 
height = 400 

screen = pygame.display.set_mode((width, height)) 
clock = pygame.time.Clock() 
running = True 

w = Worm(screen, width/2, height/2, 200) 

while running: 
    screen.fill((0, 0, 0)) 
    w.move() 
    w.draw() 

    if w.crashed or w.x <= 0 or w.x >= width -1 or w.y <= 0 or w.y >= height -1: 
     print "crash" 
     running = False 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 
     elif event.type == pygame.KEYDOWN: 
      w.key_event(event) 

    pygame.display.flip() 
    clock.tick(240) 

и ошибки -

Traceback (most recent call last): 
    File "C:/Users/Enrique/Dropbox/Public/snakegametutorial.py", line 65, in <module> 
    w.move() 
    File "C:/Users/Enrique/Dropbox/Public/snakegametutorial.py", line 34, in move 
    self.x += self.vx 
AttributeError: Worm instance has no attribute 'vx' 
+0

'w.move()' Move не существует , – Griffin

ответ

3

AttributeError указывает, что вы попытались получить доступ к свойству или методу объекта, который не был определен в определении класса объекта.

Кажется, что вы не продвинулись достаточно далеко в коде учебника, чтобы определить метод Worm.move(). Это происходит в строке 43 учебника, непосредственно перед Worm.draw(). Вы направляетесь к другому AttributeError по методу draw(), так как вы еще не определили его. Просто добавьте оба из них в определение класса Worm.

43  def move(self): 
44   """ Move the worm. """ 
45   self.x += self.vx 
46   self.y += self.vy 
47 
48   if (self.x, self.y) in self.body: 
49    self.crashed = True 
50 
51   self.body.insert(0, (self.x, self.y)) 
52 
53   if (self.grow_to > self.length): 
54    self.length += 1 
55 
56   if len(self.body) > self.length: 
57    self.body.pop() 
58 
59  def draw(self): 
60   #for x, y in self.body: 
61   # self.surface.set_at((x, y), self.color) 
62   x, y = self.body[0] 
63   self.surface.set_at((x, y), self.color) 
64   x, y = self.body[-1] 
65   self.surface.set_at((x, y), (0, 0, 0)) 

Update

Вы сейчас получать AttributeError на Worm.vx, потому что вам не хватает, что свойство (также vy) от Worm.__init__(). Сравните ваш код с кодом под заголовком Улучшенная игра на странице учебника. Когда вы сталкиваетесь с дополнительными ошибками, сравните определение класса с учебником.

Добавить в __init__()

def __init__(self, surface): 
    ... 
    ... 
    self.vx = 0 
    self.vy = -1 
    ... 
    ... 
+0

Спасибо им попробовать сейчас – enrique2334

+0

Я попробовал, но у меня появились новые erors.I думаю, я изменил программу, как вы сказали ... Я отправил ошибку и изменения вверх – enrique2334

+0

@ enrique2334 См. Обновление. Вам не хватает свойств vx, vy из учебника '__init __()' –

0

dir_x и dir_y являются ъх и Vy вы должны изменить их ... к Vx и уу ...