您的位置:首页技术文章
文章详情页

python3.x - Python中出现AttributeError: object has no attribute

【字号: 日期:2022-06-27 18:08:45浏览:15作者:猪猪

问题描述

按照书上的编写的一个python的飞船游戏 代码也都是按照书上的编写的 但就不知道问题出在哪里

AttributeError: ’Ship’ object has no attribute ’bullet_width’

到运行飞船左右移动的时候都是没有问题的,但是到了创建子弹和发生的时候就出现问题了下面是具体代码:

alien_invasion.py

import sysimport pygamefrom pygame.sprite import Groupfrom settings import Settingsfrom ship import Shipimport game_functions as gfdef 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 = 1200self.screen_hight = 700self.bg_color = (250,250,250)#飞船的位置self.ship_speed_factor = 1.5#子弹设置self.bullet_speed_factor = 1self.bullet_width = 3self.bullet_height = 15self.bullet_color = 60, 60, 60

game_functions.py

import sysfrom bullet import Bulletimport pygamedef 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 = Falsedef 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 pygameclass Ship(): def __init__(self, ai_settings, screen):'''初始化飞船并设置其初始位置'''self.screen=screenself.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.centerxself.rect.bottom = self.screen_rect.bottom#在飞船的属性center中存储小数值self.center = float(self.rect.centerx)#移动标志self.moving_right = Falseself.moving_left = False def update(self):'''根据移动标志调整飞船的位置'''#更新飞船的center值,而不是rectif self.moving_right and self.rect.right < self.screen_rect.right: self.center += self.ai_settings.ship_speed_factorif 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 pygamefrom pygame.sprite import Spriteclass 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.centerxself.rect.top = ship = ship.rect.top#存储用小数表示的子弹位置self.y =float(self.rect.y)self.color = ai_settings.bullet_colorself.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)

到这里为止就是全部的程序了,请问哪位大佬可以指点一下,谢谢

问题解答

回答1:

check_events中check_keydown_events(event, ship, screen, bullets, ai_settings)的参数顺序不对,自行调整

回答2:

显然你提供的代码看不到ship对象的bullet_width属性的设置和获取有关代码,你的bullet_width是给settings设置的。

可能你在有地方写成ship.bullet 了吧,代码好像没有都贴出来,多找找吧,还有你的error 信息前面应该有行号,看看那个文件哪一行出了错误。

回答3:

这应该是python2的示例吧,试试python2的环境

回答4:

反馈是这样写的,但是我调试了好久还是没有效果,我觉得问题是出在

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

但是还是不太清楚具体应该怎么操作,大神能帮忙看看吗?谢谢

标签: Python 编程
相关文章: