#python #pygame
#python #pygame
Вопрос:
Я следовал руководству, но продолжаю получать следующую ошибку
AttributeError: Worm instance has no attribute 'move'
Я не совсем уверен, что это значит или как это исправить. Ошибка относится к строке 44 в нижней части строки w.move()
(решаемая ниже)
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'
Комментарии:
1.
w.move()
Move не существует.
Ответ №1:
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))
Обновить
Теперь вы получаете AttributeError
on Worm.vx
, потому что у вас отсутствует это свойство (также vy
) Worm.__init__()
. Сравните свой код с кодом под заголовком Улучшенная игра на странице руководства. Когда вы столкнетесь с дальнейшими ошибками, сравните свое определение класса с определением из учебника.
Добавить в __init__()
def __init__(self, surface):
...
...
self.vx = 0
self.vy = -1
...
...
Комментарии:
1. я попробовал, но у меня появились новые ошибки. Я думаю, что я изменил программу, как вы сказали … я опубликовал ошибку и внес изменения сверху
2. @enrique2334 Смотрите обновление. Вам не хватает свойств vx, vy из руководства
__init__()
3. Пожалуйста, обратите внимание на общую схему. Как только вы поймете, что означают «экземпляр» и «атрибут», сообщение об ошибке, в котором говорится «Экземпляр X не имеет атрибута ‘y'», означает именно то, что оно говорит, и совершенно ясно.
Ответ №2:
dir_x
и dir_y
являются ли vx и vy, вы должны изменить их … на vx и vy…