2017-06-15 55 views
-1

有人可以幫我解決這個錯誤沒有屬性:Python是拋出AttributeError的:「船舶」對象有「bullet_width」

AttributeError: 'Ship' object has no attribute 'bullet_width'. 

我仍然在學習。我只是想創建一個由「外星人入侵」的書命名的遊戲,但每次我試圖KEYDOWN空時將拋出

AttributeError: 'Ship' object has no attribute 'bullet_width'. 

我也不比我其他什麼錯誤意味着在某處丟失請求。

任何幫助和我在做什麼錯誤的解釋將不勝感激。先謝謝你。而遺憾的可能有一些中國人在它,如果它讓你不舒服,因爲我是中國人。

這裏是我的模型:

alien_invasion.py

import sys 
import pygame 
from pygame.sprite import Group 

from settings import Settings 
from ship import Ship 
import game_functions as gf 

def run_game(): 
    #初始化pygame、設置和屏幕對象 
    pygame.init() 
    ai_settings = Settings() 
    screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_hight)) 
    pygame.display.set_caption("Alien Invavsion") 

    #設置背景色 
    bg_color=(230,230,230) 

    #創建一艘飛船 
    ship = Ship(ai_settings, screen) 
    #創建一個用於存儲子彈的編組 
    bullets = Group() 

    #開始遊戲的主循環 
    while True: 
     #監視鍵盤和鼠標事件 
     gf.check_events(ai_settings, screen, ship, bullets) 
     ship.update() 
     bullets.update() 
     gf.updata_screen(ai_settings, screen, ship, bullets) 

run_game() 

settings.py

class Settings(): 
    """存儲《外星人入侵》的所有設置的類""" 

    def __init__(self): 
     """初始化遊戲的設置""" 
     #屏幕設置 
     self.screen_width = 1200 
     self.screen_hight = 700 
     self.bg_color = (250,250,250) 

     #飛船的位置 
     self.ship_speed_factor = 1.5 

     #子彈設置 
     self.bullet_speed_factor = 1 
     self.bullet_width = 3 
     self.bullet_height = 15 
     self.bullet_color = 60, 60, 60 

game_functions.py

import sys 
from bullet import Bullet 
import pygame 

def check_keydown_events(event, ai_settings, screen, ship, bullets): 
    """響應按鍵""" 
    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: 
     #創建一顆子彈,並將其加入到編組bullets中 
     new_bullet = Bullet(ai_settings, screen, ship) 
     bullets.add(new_bullet) 

def check_keyup_events(event, ship): 
    """響應鬆開 """ 
    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): 
    """響應按鍵和鼠標事件""" 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      sys.exit() 

     elif event.type == pygame.KEYDOWN: 
      check_keydown_events(event, ship, screen, bullets, ai_settings) 
     elif event.type == pygame.KEYUP: 
       check_keyup_events(event,ship) 


def updata_screen(ai_settings, screen, ship, bullets): 
    """更新屏幕上的圖像,並切換到新屏幕""" 
    # 每次循環時都重繪屏幕 
    screen.fill(ai_settings.bg_color) 
    #在飛船和外星人後面重繪所有子彈 
    for bullet in bullets.sprites(): 
     bullet.draw_bullet() 

    ship.blitme() 

    # 讓最近繪製的屏幕可見 
    pygame.display.flip() 

ship.py

import pygame 

class Ship(): 
    def __init__(self, ai_settings, screen): 
     """初始化飛船並設置其初始位置""" 
     self.screen=screen 
     self.ai_settings = ai_settings 

     #加載飛船圖像並獲取其外接矩形 
     self.image = pygame.image.load('images/ship.bmp') 
     self.rect = self.image.get_rect() 
     self.screen_rect = screen.get_rect() 

     #將每艘新飛船放在屏幕底部中央 
     self.rect.centerx = self.screen_rect.centerx 
     self.rect.bottom = self.screen_rect.bottom 

     #在飛船的屬性center中存儲小數值 
     self.center = float(self.rect.centerx) 

     #移動標誌 
     self.moving_right = False 
     self.moving_left = False 

    def update(self): 
     """根據移動標誌調整飛船的位置""" 
     #更新飛船的center值,而不是rect 
     if self.moving_right and self.rect.right < self.screen_rect.right: 
      self.center += self.ai_settings.ship_speed_factor 
     if self.moving_left and self.rect.left > 0: 
      self.center -= self.ai_settings.ship_speed_factor 

     #根據self.centerx跟新的rect對象 
     self.rect.centerx = self.center 

    def blitme(self): 
     """在指定位置繪製飛船""" 
     self.screen.blit(self.image, self.rect) 

bullet.py

import pygame 
from pygame.sprite import Sprite 

class Bullet(Sprite): 
    """一個對飛船發射子彈的進行管理的類""" 

    def __init__(self, ai_settings, screen, ship): 
     """在飛船所處位置創建一個子彈對象""" 
     super(Bullet, self).__init__() 
     self.screen = screen 

     #在(0,0)處創建一個表示子彈移動的矩形,再設置正確的位置 
     self.rect = pygame.Rect(0, 0, ai_settings.bullet_width, 
           ai_settings.bullet_height) 
     self.rect.conterx = ship.rect.centerx 
     self.rect.top = ship = ship.rect.top 

     #存儲用小數表示的子彈位置 
     self.y =float(self.rect.y) 

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

    def update(self): 
     """向上移動子彈""" 
     #更新表示子彈位置的小數值 
     self.y -= self.speed_factor 
     #更新表示子彈的rect的位置 
     self.rect.y = self.y 


    def draw_bullet(self): 
     """在屏幕上繪製子彈""" 
     pygame.draw.rect(self.screen, self.color, self.rect) 
+3

除非你給出了上述代碼中的哪一行提示錯誤,否則不可能提供幫助。嗯,不僅僅是提示:它是哪一行? – barny

回答

1

發生了什麼事是Ship對象有它bullet_width屬性訪問,它不存在。好像你混淆了一些參數的順序,以便它認爲船舶是具有bullet_width屬性,像Bullet()Settings()的對象。

按Ctrl + F爲.bullet_width

class Settings(): 
    def __init__(self): 
     self.bullet_width = 3 
class Bullet(Sprite): 
    def __init__(self, ai_settings, screen, ship): 
     self.rect = pygame.Rect(0, 0, ai_settings.bullet_width, 
           ai_settings.bullet_height) 

這似乎是第二個。按Ctrl + F爲Bullet(

def check_keydown_events(event, ai_settings, screen, ship, bullets): 
    new_bullet = Bullet(ai_settings, screen, ship) 

好了,現在按Ctrl + F爲check_keydown_events(

def check_events(ai_settings, screen, ship, bullets): 
    elif event.type == pygame.KEYDOWN: 
     check_keydown_events(event, ship, screen, bullets, ai_settings) 

AHAH!你大概意思check_keydown_events(event, ai_settings, screen, ship, bullets),爲ship正在爲ai_settings,這是造成錯誤傳遞。


當你得到這樣的錯誤時,你知道某件事並不是它說的那樣。在這種情況下,請使用調試器並在錯誤發生之前放置一個斷點,然後檢查這些對象。在任何情況下,方便print('DEBUG:', everything_neccessary)會立即顯示你的問題是什麼:

class Bullet(Sprite): 
    def __init__(self, ai_settings, screen, ship): 
     print('DEBUG:', 'ai_settings', ai_settings) 

# OUTPUT 
DEBUG: ai_settings <Ship object at 0xxxx> 
# That doesn't seem right! It should be a `<Settings object at 0xxxx>` 
+0

對不起,我還是不明白如何解決這個錯誤。 ....我是否設想d將「'check_keydown_events(event,ship,screen,bullets,ai_settings)''改爲''check_keydown_events(event,ai_settings,screen,ship,bullets)''? – awc789

+0

好的!所以欣賞! – awc789

0

你從代碼至少運送對象上沒有一個bullet_width。它看起來像保存在ai_settings內。以上是完整的代碼嗎?或者有沒有在你的代碼中的另一個位置,你可能會試圖訪問ship.bullet_width當你真正需要輸入ship.ai_settings.bullet_width而這引發錯誤?

-1

我也學習Python中,有2個問題,我覺得你參考:1。 game_functions.py: 一個。更新錯誤,應該更新 b。在check_keydown_events的順序是錯誤的*(check_keydown_events(事件,船舶,屏幕,子彈,ai_settings)*,正確的順序如下: check_keydown_events(事件,ai_setting,屏幕,船舶,子彈) 2. alien_invasion.py bg_c​​olor反覆對比ship.py (換句話說,你已經設置屬性「bg_color」在ship.py,沒有必要重複在alien_invasion.py)

希望能幫到您〜

+0

我發現主要問題可能是:bullet.py ---- self.rect = ship = ship.rect.top,需要刪除中心「ship」settings.py -----屬性「hight」不一致'高度'alien_invasion.py ----將updata更改爲更新 –

相關問題