Объект 'bool' не имеет атрибута 'rect' - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь пересмотреть мой код и сделать его объектно-ориентированным, но теперь он не работает.Всякий раз, когда я звоню if snake.rect.colliderect(food.rect), он возвращает AttributeError: 'bool' object has no attribute 'rect'.Вот остальная часть моего кода, если это поможет.

import pygame,sys,random
from pygame.locals import *

pygame.init()

RES = (500,500)

rectangle_height = 20
rectangle_width = 20

GREEN = (0,255,0)
WHITE = (255,255,255)
BLACK = (0,0,0)
RED = (255,0,0)

clock = pygame.time.Clock()
win = pygame.display.set_mode(RES)
pygame.display.set_caption("Snake")

class Snake():
    def __init__(self, color, width, height):
        self.image = pygame.Surface((rectangle_width,rectangle_height))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.speed = 20  
        self.move = (0,0)

class Food():
    def __init__(self,color,width,height):
        self.image = pygame.Surface((rectangle_width,rectangle_height))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.x = random.randrange(20,500,20) 
        self.rect.y = random.randrange(20,500,20) 

        self.state = True

def event_loop(snake,food):
    while True:
        win.fill(BLACK)

        # for x in range(0,win_width,20):
        #     pygame.draw.line(win,WHITE,(x,0),(x,500))

        # for y in range(0,win_height,20):
        #     pygame.draw.line(win,WHITE,(0,y),(500,y))

        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == KEYDOWN:
                if event.key == K_RIGHT:
                    snake.move = (snake.speed,0)
                elif event.key == K_LEFT:
                    snake.move = (-snake.speed,0)
                elif event.key == K_UP:
                    snake.move = (0,-snake.speed)
                elif event.key == K_DOWN:
                    snake.move = (0,snake.speed)

        if snake.rect.colliderect(food.rect):
            food.state = False

        if food.state:
            win.blit(food.image,food.rect)
        else:
            food.rect.x = random.randrange(20,500,20) 
            food.rect.y = random.randrange(20,500,20) 
            win.blit(food.image,food.rect)
            food = True

        win.blit(snake.image,snake.rect)
        snake.rect.move_ip(snake.move)
        snake.rect.clamp_ip(win.get_rect())

        pygame.display.update()
        clock.tick(5)

snake = Snake(GREEN,rectangle_width,rectangle_height)
food = Food(RED,rectangle_width,rectangle_height)
event_loop(snake,food)

1 Ответ

0 голосов
/ 03 марта 2019

Это потому, что вы присваиваете значение food дважды.Первый раз на уровне файла:

food = Food(RED,rectangle_width,rectangle_height)

Это нормально, и ваш код, вероятно, сработает, если вы не во второй раз устанавливаете food в своем event_loop:

food = True

После этого вызова food является логическим значением, и, следовательно, вы получаете ошибку, которая говорит о том, что bools не имеет свойства rect.

Удалите это второе назначение, и оно должно решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...