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日

悬赏问题

  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100