生椰拿铁太狼 2022-10-19 11:49 采纳率: 75%
浏览 37
已结题

外星人大战中一直报错窗口显示不出来

一直运行不起来,要么窗口闪一下要么就没窗口,困扰了两天实在是看不懂了,好像是ship那个函数有问题。
而且那些形参比如self什么的作用看不懂啊
这是系统的报错:

Traceback (most recent call last):
  File "c:\game\alien_invasion.py", line 62, in <module>
    ai=AlienInvasion()
  File "c:\game\alien_invasion.py", line 18, in __init__
    self.ship=Ship(self)
  File "c:\game\ship.py", line 14, in __init__
    ship_rect= self.ship_image.get_rect()
AttributeError: 'Ship' object has no attribute 'ship_image'

Alien_Invasion.py

import pygame
import sys

from settings import Settings
from ship import Ship

class AlienInvasion:
    """管理游戏资源和行为的类"""

    def __init__(self):
        """初始化屏幕"""
        pygame.init()
        self.settings=Settings()
        self.screen=pygame.display.set_mode((0,0),pygame.FULLSCREEN)
        self.settings.screen=self.screen.get_rect().width
        self.settings.screen=self.screen.get_rect().height
        pygame.display.set_caption("Alien Invasion")
        self.ship=Ship(self)
        """有问题"""

    def run_game(self):
        """开始游戏的主循环"""
        while True:
            self._check_events()
            self.ship.updata()
            self._updata_screen()

    def _check_events(self):
            """监视捕获鼠标与键盘操作"""
            for event in pygame.event.get():
                if event.type==pygame.QUIT:
                    sys.exit()
                elif event.type == pygame.KEYDOWN:
                    self._check_ketdown_events(event)
                elif event.type == pygame.KEYUP:
                    self._check_ketup_events(event)
    """将开和关重构为函数"""
    def _check_keydown_events(self,event):
        if event.key == pygame.K_LEFT:
            self.moving_left=True
        elif event.key == pygame.K_RIGHT:
            self.moving_right=True
        elif event.key==pygame.K_q:
            sys.exit()
    def _check_keyup_events(self,event):
        if event.key == pygame.K_LEFT:
            self.moving_left=False
        elif event.key == pygame.K_RIGHT:
            self.moving_right=False

    
    def _updata_screen(self):
            """更新屏幕中图像,并切换到新屏幕"""
            self.screen.fill(self.settings.bg_color)
            self.ship.blitme()
            pygame.display.flip()



    """这里也有问题"""
    #创建游戏实例并运行游戏
ai=AlienInvasion()
ai.__init__()
ai.run_game()

Ship.py

import sys
import pygame

class Ship:
   # 飞船

   def __init__(self,ai_game):
      """初始化飞船并设置其初始位置"""
      self.screen=ai_game.screen
      self.settings=ai_game.settings
      self.screen_rect=ai_game.screen.get_rect()
      """加载飞船图像并获取其外接矩形"""
      ship_image=pygame.image.load('images/ship.bmp')
      ship_rect= self.ship_image.get_rect()
      """将新飞船放在屏幕底部中央"""
      #看这里
      ship_rect.midbottom=self.screen_rect.midbottom
      """移速设置小数值"""
      self.x=float(self.rect.x)
      #移动开关
      self.moving_left=False
      self.moving_right=False

   def updata(self):
      """限制飞船移动"""
      if self.moving_left and self.rect.left>0:
         self.x -= self.self.settings.ship_speed
      if self.moving_right and self.rect.right<self.screen_rect.right:
         self.x += self.self.settings.ship_speed
      #根据self.x更新rect对象
      self.rect.x = self.x

   def blitme(self):
      """在指定位置绘制飞船"""
      self.screen.rect(self.image,self.rect)


Settings.py

import pygame

class Settings():
    """储存外星人大战的所有设置"""
 
    def __init__(self):
        """初始化游戏的设置"""
        # 屏幕设置
        self.screen_width = 1200;
        self.screen_height = 800;
        self.bg_color = (230, 230, 230)
        """速度设置"""
        self.ship_speed=1.5
        """子弹设置"""
        self.bullet_speed=1.0
        self.bullet_weight=3
        self.bullet_height=15
        self.bullet_color=(60,60,60)


Bullet.py

import pygame
from pygame.sprite import Sprite

class Bullet(Sprite):
    """管理飞船所发射的子弹的类"""
    def __init__(self,ai_game):
        """在飞船当前位置创建一个文件夹"""
        super().__init__()
        self.screen=ai_game.screen
        self.settings=ai_game.settings 
        self.color=self.settings.bullet_color

        #在(0,0)处创建一个表示子弹的矩形,再设置正确的位置
        self.rect=pygame.Rect(0,0,self.settings.bullet_width,self.settings.bullet_height)
        self.rect.midtop=ai_game.ship.rect.midtop

        #存储用小数表示的子弹位置
        self.y=float(self.rect.y)
    
    def updata(self):
        """向上移动的字弹"""
        #更新表示子弹位置的小数值
        #更新表示子弹的rect的位置
        self.rect.y


  • 写回答

1条回答 默认 最新

  • [小G] 2022-10-19 13:01
    关注

    ship.py的14行,self.ship_image的self去掉吧

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月2日
  • 已采纳回答 12月25日
  • 创建了问题 10月19日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效