Я создаю игру Alien invasion из учебника по ускоренному изучению языка python.До этого момента мне удавалось, но теперь я вышел на эту стадию, и она все сломала, игра даже не запустится, не говоря уже о последней успешной попытке.я получаю сообщение об ошибке «У Alien нет атрибута _sprite__g»
Я проверил, что класс Alien правильно наследует от спрайта, и, насколько я могу судить, это так, но я все еще новичок в кодировании.Используется супер.Функция для наследования, и она работала до этого момента, теперь мне говорят, что она не имеет атрибута.
Это мой код (извините, есть немало).
основной файл - вторжение пришельцев.py
Alien_invasion.py
import sys
import pygame
from pygame.sprite import Group
from settings import Settings
from ship import Ship
from alien import Alien
import game_functions as gf
def run_game():
#Initialize pygame, settings and screen object.
pygame.init()
ai_settings=Settings()
screen=pygame.display.set_mode(
(ai_settings.screen_width, ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion")
#Make a ship, a group of bullets and a group of aliens.
ship = Ship(ai_settings, screen)
bullets = Group()
aliens = Group()
#Create the fleet of aliens.
gf.create_fleet(ai_settings, screen, aliens)
#Set the background colour.
bg_colour = (230, 230, 230)
#Start the main loop for the game.
while True:
gf.check_events(ai_settings, screen, ship, bullets)
ship.update()
bullets.update()
gf.update_bullets(bullets)
gf.update_screen(ai_settings, screen, ship, aliens, bullets)
run_game()
Alien.py
#Alien.py
import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
"""A class to represent a single alien in the fleet."""
def __init__(self, ai_settings, screen):
"""Initialize the alien and set its starting position."""
super(Alien, self).__init__
self.screen = screen
self.ai_settings = ai_settings
#Load the alien image and set its rect attribute.
self.image = pygame.image.load('images/alien.bmp')
self.rect = self.image.get_rect()
#Start each new alien near the top left of the screen.
self.rect.x = self.rect.width
self.rect.y = self.rect.height
#Store the alien's exact position.
self.x = float(self.rect.x)
def blitme(self):
"""Draw the alien at it's current location."""
self.screen.blit(self.image, self.rect)
Игра functions.py
#Game functions.py
import sys
import pygame
from bullet import Bullet
from alien import Alien
def check_keydown_events(event, ai_settings, screen, ship, bullets):
"""respond to keypresses."""
if event.key == pygame.K_RIGHT:
ship.moving_right =True
elif event.key == pygame.K_LEFT:
ship.moving_left = True
elif event.key == pygame.K_SPACE:
fire_bullet(ai_settings, screen, ship, bullets)
elif event.key == pygame.K_q:
sys.exit()
def fire_bullet(ai_settings, screen, ship, bullets):
"""Fire a bullet if limit is not reached yet. """
#Create a new bullet and add it to the bullets group.
if len(bullets) <ai_settings.bullets_allowed:
new_bullet = Bullet(ai_settings, screen, ship)
bullets.add(new_bullet)
def check_keyup_events(event, ship):
"""Respond to key releases."""
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key ==pygame.K_LEFT:
ship.moving_left = False
def check_events(ai_settings, screen, ship, bullets):
"""Respond to keypresses and mouse events. """
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
check_keydown_events(event, ai_settings, screen, ship, bullets)
elif event.type == pygame.KEYUP:
check_keyup_events(event, ship)
def update_screen(ai_settings, screen, ship, aliens, bullets):
"""update images on the screen and flip to the new screen."""
#Redraw the screen during each pass through the loop.
screen.fill(ai_settings.bg_color)
#Redraw all bullets behind ship and aliens.
for bullet in bullets.sprites():
bullet.draw_bullet()
ship.blitme()
alien.draw(screen)
def update_bullets(bullets):
"""Update position of bullets and get rid of old bullets."""
#Update bullet positions.
bullets.update()
#Get rid of bullets that have dissapeared.
for bullet in bullets.copy():
if bullet.rect.bottom <=0:
bullets.remove(bullet)
#Make the most recently drawn screen visible.
pygame.display.flip()
def create_fleet(ai_settings, screen, aliens):
"""Create a full fleet of aliens."""
#Ceate an alien and find the number of aliens in a row.
#Spacing between each alien is equal to one alien qidth.
alien = Alien(ai_settings, screen)
alien_width = alien.rect.width
available_space_x = ai_settings.screen_width - 2 * alien_width
number_aliens_x = int(available_space_x / (2 * alien_width))
#Create the first row of aliens.
for alien_number in range(number_aliens_x):
#Create an alien and place in in the row.
alien = Alien(ai_settings, screen)
alien.x = alien_width + 2 * alien_width * alien_number
alien.rect.x = alien.x
aliens.add(alien)
Вплоть до добавления кода для«Создать флот» все работало нормально, у меня был только один корабль, но игра запускалась, отображалась и контролировалась правильно.
В проекте есть еще пара файлов, но я не сделал, поскольку они не показалисьСоответствующий?я был сделан, чтобы сделать какие-либо корректировки к ним согласно учебнику.Я могу добавить их, если это необходимо.
** Примечание - в игровых функциях я пытался использовать «pygame.display.flip ()» после создания флота, но, похоже, это не имело значения.
Это моя ошибка отслеживания ..
Traceback (most recent call last):
File "D:\visual studios\Python\Learning Python\Python crash course\alien_invasion\alien_invasion.py", line 44, in <module>
run_game()
File "D:\visual studios\Python\Learning Python\Python crash course\alien_invasion\alien_invasion.py", line 27, in run_game
gf.create_fleet(ai_settings, screen, aliens)
File "D:\visual studios\Python\Learning Python\Python crash course\alien_invasion\game_functions.py", line 88, in create_fleet
aliens.add(alien)
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\pygame\sprite.py", line 361, in add
sprite.add_internal(self)
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\pygame\sprite.py", line 163, in add_internal
self.__g[group] = 0
AttributeError: 'Alien' object has no attribute '_Sprite__g'
Спасибо.