2016-07-29 11 views
2

Ich versuche ein Spiel zu bauen, das ein Schiff mit den Pfeiltasten nach links und rechts bewegt und Kugeln abfeuert, wenn die Leertaste gedrückt wird. Wenn ich die LEER mein Spiel stürzt ab, drücken und dieser Fehler angezeigt wird: Traceback (jüngste Aufforderung zuletzt):add() Argument nach * muss eine Sequenz sein, nicht Einstellungen

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

Hier ist mein Code:

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) 

Und schließlich die Hauptdatei:

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() 

Die Spur:

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 

Antwort

1

Ja Jokab hat recht, du hast den zusätzlichen Unterstrich vergessen. Für zukünftige Praxis ist es jedoch wichtig zu lernen, das Python zu lesen. Es gibt Ihnen normalerweise eine gute Vorstellung davon, wo das Problem liegt. Nehmen Sie zum Beispiel die , die Sie hier eingefügt haben. Python sagt zuerst, dass es ein Problem beim Ausführen von run_game() hatte. Also Python sagt dann, dass in Ihr Spiel läuft Funktion hat ein Problem beim Aufruf der Methode gf.check_events(ai_settings, screen, ship, bullets). Es schaute dann auf Ihre Initialisierung der Aufzählungsklasse new_bullet = Bullet(ai_settings, screen, ship und hat ein Problem damit. Und in der nächsten Zeile gibt es die TypeError. Nun, während Sie genau herausfinden konnten, was Python über die TypeError sagt, die eine praktikable Option ist. Aber wenn man es sich ansieht, könnte man feststellen, dass es ein Problem hat, das bullet-Objekt der Sprites-Gruppe hinzuzufügen. Was bedeutet, dass wenn ich Sie wäre, würde ich meine Suche in der Bullet Klasse beginnen. Und tatsächlich gibt es einen Tippfehler in Ihrer __init__ Funktion.

Während es nicht das Ende der Welt ist, wenn Sie nicht lernen, wie man Python liest, wird es Ihnen viel Zeit auf lange Sicht sparen.

2

Ihnen fehlt ein Unterstrich _ in Ihrer Bullet.__init__ Methode. Sie haben derzeit _init__ wenn es __init__ sein soll.

Dies führt in Python die Sprite.__init__ Methode mit ai_settings als erstes Argument nennen, da es nicht außer Kraft gesetzt __init__ für Bullet finden. Das führt zu Problemen.

+0

Das war's! Vielen Dank! –

+0

@MartinDimitrov Erwägen Sie, diese Antwort zu akzeptieren, wenn es Ihnen geholfen hat. :) – Jokab

Verwandte Themen