2016-07-29 3 views
2

Я пытаюсь создать игру, которая перемещает корабль влево и вправо с помощью клавиш со стрелками и запускает пули при нажатии пробела. Когда я нажать клавишу ПРОБЕЛ меня игра вылетает и эта ошибка показывается: Traceback (самый последний вызов последнего):add() аргумент после * должен быть последовательностью, а не настройками

TypeError: add() argument after * must be a sequence, not Settings 

Вот мой код:

class Settings(): 
    """A class to store all settings for Alien Invasion.""" 

    def __init__(self): 
     """Initialize the game's settings.""" 
     # Screen settings 
     self.screen_width = 800 
     self.screen_height = 480 
     self.bg_color = (230, 230, 230) 

     # Ship settings 
     self.ship_speed_factor = 1.5 

     # Bullet settings 
     self.bullet_speed_factor = 1 
     self.bullet_width = 3 
     self.bullet_height = 15 
     self.bullet_color = 60, 60, 60 

import pygame 
from pygame.sprite import Sprite 

class Bullet(Sprite): 
    """A class to manage bullets fired from the ship""" 

    def _init__(self, ai_settings, screen, ship): 
     """Create a bullet object at the ship's current position.""" 
     super(Bullet, self).__init__() 
     self.screen = screen 

     # Create a bullet rect at (0, 0) and then set correct position. 
     self.rect = pygame.Rect(0, 0, ai_settings.bullet_width, ai_settings.bullet_height) 
     self.rect.centerx = ship.rect.centerx 
     self.rect.top = ship.rect.top 

     # Store the bullet's position as a decimal value. 
     self.y = float(self.rect.y) 

     self.color = ai_settings.bullet_color 
     self.speed_factor = ai_settings.bullet_speed_factor 

    def update(self): 
     """Move the bullet up the screen""" 
     # Update the decimal position of the bullet. 
     self.y -= self.speed_factor 
     # Update the rect position. 
     self.rect.y = self.y 

    def draw_bullet(self): 
     """Draw the bullet to the screen.""" 
     pygame.draw.rect(self.screen, self.color, self.rect) 

import sys 

import pygame 

from bullet import Bullet 

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: 
     # Create a new bullet and add it to the bullets group. 
     new_bullet = Bullet(ai_settings, screen, ship) 
     bullets.add(new_bullet) 

def check_keyup_events(event, ship): 
    """Respind 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) 

И, наконец, главный файл:

import pygame 
from pygame.sprite import Group 

from settings import Settings 
from ship import Ship 
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. 
    ship = Ship(ai_settings, screen) 
    # Make a group to store bullets in. 
    bullets = Group() 

    # Start the main loop for the game. 
    while True: 

     # Watch the keyboard and mouse events. 
     gf.check_events(ai_settings, screen, ship, bullets) 
     ship.update() 
     bullets.update() 
     gf.update_screen(ai_settings, screen, ship, bullets) 

run_game() 

трассировка:

Traceback (most recent call last): 
    File "C:\Users\martin\Desktop\python_work\alien_invasion\alien_invasion.py", line 30, in <module> 
    run_game() 
    File "C:\Users\martin\Desktop\python_work\alien_invasion\alien_invasion.py", line 25, in run_game 
    gf.check_events(ai_settings, screen, ship, bullets) 
    File "C:\Users\martin\Desktop\python_work\alien_invasion\game_functions.py", line 33, in check_events 
    check_keydown_events(event, ai_settings, screen, ship, bullets) 
    File "C:\Users\martin\Desktop\python_work\alien_invasion\game_functions.py", line 15, in check_keydown_events 
    new_bullet = Bullet(ai_settings, screen, ship) 
    File "C:\Users\martin\Anaconda3\lib\site-packages\pygame\sprite.py", line 124, in __init__ 
    self.add(*groups) 
    File "C:\Users\martin\Anaconda3\lib\site-packages\pygame\sprite.py", line 142, in add 
    self.add(*group) 
TypeError: add() argument after * must be a sequence, not Settings 

ответ

1

Да Jokab прав, вы забыли дополнительное подчеркивание. Однако для будущей практики важно научиться читать Python . Это обычно дает вам хорошее представление о том, где проблема. Например, возьмите здесь . Сначала Python сообщает, что у него была проблема с запуском run_game(). Таким образом, python затем говорит, что в вашей функции запуска игры имеет проблему вызова метода gf.check_events(ai_settings, screen, ship, bullets). Затем он посмотрел на вашу инициализацию класса bullet new_bullet = Bullet(ai_settings, screen, ship и возникла проблема с ним. И в самой следующей строке было дано TypeError. Теперь, хотя вы можете точно определить, что говорит python о TypeError, что является жизнеспособным вариантом. Но просто взглянув на него, вы можете определить, что проблема связана с добавлением объекта bullet к группе спрайтов. Это означает, что если бы я был вами, я бы начал поиск в классе Bullet. И, конечно же, в вашей функции __init__ есть опечатка.

Хотя это еще не конец света, если вы не научитесь читать python , это сэкономит вам много времени в долгосрочной перспективе.

2

Вам не нужен символ _ в вашем методе Bullet.__init__. У вас есть _init__, когда он должен быть __init__.

Это приводит к Python вызова Sprite.__init__ метода с ai_settings в качестве первого аргумента, так как он не может найти любой переопределен __init__ для Bullet. Это приводит к проблемам.

+0

Вот и все! Спасибо! –

+0

@MartinDimitrov Рассмотрите возможность принятия этого ответа, если он вам поможет. :) – Jokab