sadou 2022-11-17 08:57 采纳率: 50%
浏览 6

python语法结构

在编写外星人入侵游戏时,到了发射子弹的环节,按下空格键就会报错 退出。代码如下
用代码块功能插入代码,请勿粘贴截图
import sys

import pygame

from settings import Settings
from ship import Ship
from bullet import Bullet 

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

    def __init__(self):
        """初始化游戏并创建游戏资源"""
        pygame.init()
        self.settings = Settings() 

        self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))
        pygame.display.set_caption("Alien Invasion")

        self.ship = Ship(self)
        """这里是新加的子弹编组"""
        self.bullets = pygame.sprite.Group()

        #设置背景颜色。
        self.bg_color = (0,230,255)

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

            """这里加入了子弹位置的循环"""
            self.bullets.update()
            self._update_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_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)

   
            

        """这是下面11.10号新加的"""
                    
    def _check_keydown_events(self,event):
        """响应按键"""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = True

        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = True
        elif event.key == pygame.K_q:
            sys.exit()

        elif event.key == pygame.K_SPACE: 
            #空格发射子弹
            self._fire_bullet()

    def _check_keyup_events(self,event):
        """响应松开"""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = False
            
        if event.key == pygame.K_LEFT:
            self.ship.moving_left = False
                                    
    def _fire_bullet(self):
        """c创建一颗子弹 加入编组 bullets"""
        new_bullet = Bullet(self)
        self.bullets.add(new_bullet)
                        
    def _update_screen(self):
        """更新屏幕 图像,并切换到新屏幕 """
        self.screen.fill(self.bg_color)
        self.ship.blitme()

        for bullet in self.bullets.sprites():
            bullet.draw_bullet()

        pygame.display.flip()



if __name__ == '__main__':
    #创建游戏实例 并运行游戏。
    ai = AlienInvasion() 
    ai.run_game()


运行结果及报错
Traceback (most recent call last):

  File "D:\python_work\alien_invasion\alien_invasion.py", line 47, in _check_events
    self._check_keydown_events(event)
  File "D:\python_work\alien_invasion\alien_invasion.py", line 68, in _check_keydown_events
    self._fire_bullet()
  File "D:\python_work\alien_invasion\alien_invasion.py", line 81, in _fire_bullet
    self.bullets.add(new_bullet)
  File "C:\Users\NINGMEI\AppData\Roaming\Python\Python37\site-packages\pygame\sprite.py", line 444, in add
    sprite.add_internal(self)
  File "C:\Users\NINGMEI\AppData\Roaming\Python\Python37\site-packages\pygame\sprite.py", line 160, in add_internal
    self.__g[group] = 0
AttributeError: 'Bullet' object has no attribute '_Sprite__g'

我也检查了结构和语法,反复测试还是不行。请问问题处在哪里了

  • 写回答

2条回答 默认 最新

  • 一二三四! 2022-11-17 09:23
    关注

    Bullet实例化对象的时候传入的self这块有问题,去看下Bullet类需要传入哪些参数

    评论

报告相同问题?

问题事件

  • 创建了问题 11月17日

悬赏问题

  • ¥20 自制cifar10数据集,生成的batch缺少key:b
  • ¥20 在命令行用pip安装TensorFlow时出错
  • ¥200 实时摄像头的稳定性,防抖
  • ¥15 FPGA 128选128选择器
  • ¥15 收购斗地主,麻将游戏元马
  • ¥100 SSDA-YOLOv8
  • ¥15 superset 二次开发
  • ¥15 (标签-matlab|关键词-m3)
  • ¥15 jmeter单接口推送大批量数据
  • ¥15 这是一道arduino的题求解答案