как реализовать класс?

#python #python-3.x #class

#python #python-3.x #класс

Вопрос:

Я выполнял упражнение, и нам нужно создать caterpillar с атрибутом size из другой функции. В приведенном ниже коде я добавил атрибут size от 0 до 3.

 class Caterpillar:

    def __init__(self):
        self.size = random.randrange(0, 3)
        x = random.randrange(50, 950)
        y = random.randrange(50, 950)
        self.xcoord = x
        self.ycoord = y
  

Однако в приведенном ниже коде, когда я попытался добавить размер в этой строке pygame.draw.ellipse(screen, red, [x, y, size, 40, 45]) , но я получил ошибку.

 def draw_critter(self, screen):
        x = self.xcoord
        y = self.ycoord
        size = self.size
        pygame.draw.ellipse(screen, red, [x, y, 40, 45])
        pygame.draw.ellipse(screen, black, [x   6, y   10, 10, 15])
        pygame.draw.ellipse(screen, black, [x   24, y   10, 10, 15])
        pygame.draw.line(screen, black, (x   11, y   1), (x   9, y - 10), 3)
        pygame.draw.line(screen, black, (x   25, y   1), (x   26, y - 10), 3)
  

Я не понимаю, почему я получаю эту ошибку

 File "D:/UniFiles/Sem/159/critters.py", line 53, in <module>
    critter.draw_critter(screen)
  File "D:UniFilesSem159mycritters.py", line 27, in draw_critter
    pygame.draw.ellipse(screen, red, [x, y, size, 40, 45])
TypeError: Invalid recstyle argument
  

Я не уверен, действительно ли я понимаю, как работает класс. Не мог бы кто-нибудь, пожалуйста, показать мне пример того, как я могу реализовать функцию draw_critter для создания всей гусеницы, а не только головки.

Комментарии:

1. Как draw.ellipse определяется? Сообщение об ошибке указывает на несоответствие того, что ожидала функция, и того, что вы ей подавали.

2. Проблема не в реализации вашего класса, а в вашем pygame.draw.ellipse использовании. Проверьте документы по API для этого — похоже, что он ожидает pygame. Прямоугольный объект, а не список.

3. Я не понимаю, что вы имеете в виду? но я использую эти коды выше для основного кода и другого кода, где он рисует элементарный элемент

4. Это означает, что вы неправильно используете API.

5. не могли бы вы, пожалуйста, привести мне пример того, как я должен это сделать? Извините, я действительно не понимаю. даже если я прочитаю это.

Ответ №1:

Посмотрите документы API для ellipse https://www.pygame.org/docs/ref/draw.html#pygame.draw.ellipse

ellipse() ожидает:

 pygame.draw.ellipse()
    draw an ellipse
    ellipse(surface, color, rect) -> Rect
    ellipse(surface, color, rect, width=0) -> Rect
  

А что такое Rect? Он ожидает этого:

 pygame.Rect
    pygame object for storing rectangular coordinates
    Rect(left, top, width, height) -> Rect
    Rect((left, top), (width, height)) -> Rect
    Rect(object) -> Rect
  

В нем нигде не упоминается параметр size.

Я не совсем уверен, что вы пытаетесь сделать, но звучит так, будто вы хотите одно длинное многоточие для caterpillar? Тогда, может быть, вы можете просто нарисовать size количество многоточий и немного расставить их.

Например:

 for s in range(self.size):
    pygame.draw.ellipse(screen, red, [x   s*10, y, 40, 45])
  

Это только один способ, я понятия не имею, как вы хотите, чтобы это выглядело.