python从入门到实践中的飞船项目,其显示AttributeError: 'Ship' object has no attribute 'screen,怎么解决?

问题如标题所述,代码运行显示如下错误:AttributeError: 'Ship' object has no attribute 'screen
代码如下:
分为三个文件:ship.py,alien_invasion.py,settings.py
# ship.py

import pygame


class Ship():

    def __init__(self, screen):
        # 初始化飞船并获取其初始位置

        # 加载飞船图像并获取其外接矩形
        self.image = pygame.image.load("images/ship.bmp")  # 返回了飞船的surface,并存储到self.image
        self.rect = self.image.get_rect()  # 通过get_rect()活动相应surface的属性rect。(矩形即rect对象)
        self.screen_rect = screen.get_rect()  # 将矩形存储到self.screent_rect

        # 将每艘新飞船放到屏幕底部中央
        self.rect.centerx = self.screen_rect.centerx  
        self.rect.bottom = self.screen_rect.bottom

    def blitme(self):  # 定义此方法,让它根据self.rect的位置将图像绘制到屏幕上
        # 在指定位置绘制飞船
        self.screen.blit(self.image, self.rect)
# alien_invasion.py

import pygame

from settings import Settings
from ship import Ship
# 导入所需模块

def run_game():
    # 初始化游戏并创建一个屏幕对象
    pygame.init()  # 初始化背景设置
    ai_settings = Settings()

    screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")  # 显示在屏幕的左上角

    # 设置背景色
    # bg_color = (230,230,230) # RGB(红绿蓝三色)

    # 创建一艘飞船ship
    ship = Ship(ai_settings, screen)

    # 游戏的主循环
    while True:  
          # 监视键盘和鼠标事件
         for event in pygame.event.get():  # 事件循环
             # pygame.event.get()方法,所有的键盘和鼠标事件都会促使for循环运行。
             if event.type == pygame.QUIT:
                 # 若玩家单机游戏窗口的关闭按钮,将检测到pygame.QUIT事件,我们将调用sys.exit()来退出游戏
                 sys.exit()
        
        # 每次循环都重绘屏幕
        screen.fill(bg_color)  # 用背景色填充屏幕,只接受一个实参,一种颜色
        ship.blitme()
        
        # 让最近绘制的屏幕可见
        pygame.display.flip()  

run_game()
# settings.py

class Settings():
    # 存储alien_invasion的所有设置的类
    def __init__(self):
        # 初始化游戏设置
        # 屏幕设置
        self.screen_width = 1200
        self.screen_height = 800
        self.bg_color = (230, 230, 230)
个人觉得可能是由于screen的数据类型没有搞清楚,但是查了好久不知道那里错了。
谢谢大家的帮助!

你 Ship()类中只定义了 self.screen_rect 属性,没有定义 self.screen 属性啊

Ship的def init():方法中应该加上self.screen = screen 吧

# ship.py
 
import pygame
 
 
class Ship():
 
    def __init__(self, screen):
        # 初始化飞船并获取其初始位置
 
        # 加载飞船图像并获取其外接矩形
        self.screen = screen  #****************加上这行 
        self.image = pygame.image.load("images/ship.bmp")  # 返回了飞船的surface,并存储到self.image
        self.rect = self.image.get_rect()  # 通过get_rect()活动相应surface的属性rect。(矩形即rect对象)
        self.screen_rect = screen.get_rect()  # 将矩形存储到self.screent_rect
 
        # 将每艘新飞船放到屏幕底部中央
        self.rect.centerx = self.screen_rect.centerx  
        self.rect.bottom = self.screen_rect.bottom
 
    def blitme(self):  # 定义此方法,让它根据self.rect的位置将图像绘制到屏幕上
        # 在指定位置绘制飞船
        self.screen.blit(self.image, self.rect)

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632