账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    python外星人入侵,武装飞船,代码写好后,不显示子弹
    36
    0

    按照书上写的武装飞船,写到能够左右移动了,但到了射击(装子弹)时候,按照书上的代码照搬了,运行时没显示代码有问题,但就是按了空格键,不见有子弹,其他都正常。

    代码:

    alien_invasion.py

    import sys
    import pygame
    from pygame.sprite import Group
    
    from settings import Settings
    from ship import Ship
    import game_functions as gf
    
    def run_game():
        #初始化pygame、设置和屏幕对象
        pygame.init()
        ai_settings = Settings()
        screen = pygame.display.set_mode(
            (ai_settings.screen_width,ai_settings.screen_height))
        pygame.display.set_caption("Alien Invasion")
    
        #创建一艘飞船
        ship = Ship(ai_settings,screen)
        #创建一个用于存储子弹的编组
        bullets = Group()
                
        #开始游戏主循环
        while True:
            gf.check_events(ai_settings,screen,ship,bullets)
            ship.update()
            bullets.update()
            gf.update_screen(ai_settings,screen,ship,bullets)
    
    run_game()
    
    
    **game_functions.py**
    
    import sys
    import pygame
    
    from bullet import Bullet
    
    def 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 = False
    
    def 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,ai_settings,screen,ship,bullets)
    
            elif event.type == pygame.KEYUP:
                check_keyup_events(event,ship)
    
    def update_screen(ai_settings,screen,ship,bullets):
        """更新屏幕上的图像,并切换到新屏幕"""
        #每次循环时都重绘屏幕
        screen.fill(ai_settings.bg_color)
        ship.blitme()
        
        #让最近绘制的屏幕可见
        pygame.display.flip()
    
        #在飞船和外星人后面重绘所有子弹
        for bullet in bullets.sprites():
            bullet.draw_bullet()
    
    
    **bullet.py**
    
    import pygame
    from pygame.sprite import Sprite
    
    class 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.centerx = ship.rect.centerx
            self.rect.top = ship.rect.top
    
            #存储用小数表示的子弹位置
            self.y = float(self.rect.y)
    
            self.color = ai_settings.bullet_color
            self.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)
    

    settings.py

    class Settings():
        """存储《外星人入侵》的所有设置的类"""
    
        def __init__(self):
            """初始化游戏的设置"""
            #屏幕设置
            self.screen_width = 1200
            self.screen_height = 800
            self.bg_color = (230,230,230)
    
            #飞船的设置
            self.ship_speed_factor = 1.5
    
            #子弹设置
            self.bullet_speed_factor = 1
            self.bullet_width = 3
            self.bullet_height = 15
            self.bullet_color = 60,60,60
            

    ship.py

    import pygame
    
    class Ship():
    
        def __init__(self,ai_settings,screen):
            """初始化飞船并设置其初始位置"""
            self.screen = screen
            self.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.centerx
            self.rect.bottom = self.screen_rect.bottom
    
            #在飞船的属性center中存储小数值
            self.center = float(self.rect.centerx)
    
            #移动标志
            self.moving_right = False
            self.moving_left = False
    
        def update(self):
            """根据移动标志调整飞船的位置"""
            #更新飞船的center值,而不是rect
            if self.moving_right and self.rect.right < self.screen_rect.right:
                self.center += self.ai_settings.ship_speed_factor
            if self.moving_left and self.rect.left > 0:
                self.center -= self.ai_settings.ship_speed_factor
    
            #根据self.center更新rect对象
            self.rect.centerx = self.center
    
        def blitme(self):
            """在指定位置绘制飞船"""
            self.screen.blit(self.image,self.rect)
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 喵了个咪。 普通会员 1楼

      在编写代码时,你需要考虑的是如何处理不同的情况,如射击时的子弹是否显示。以下是一个可能的解决方案:

      ```python import random

      class SpaceBattler: def init(self): self.bullets = []

      def add_bullets(self, bullet):
          self.bullets.append(bullet)
      
      def shoot(self):
          if len(self.bullets) > 0:
              random.shuffle(self.bullets)
              print("射击!")
              for bullet in self.bullets:
                  print(f"子弹:{bullet}")
              self.bullets.pop(0)
          else:
              print("没有子弹发射出去。")
      

      使用方法

      space_battler = SpaceBattler() space_battler.add_bullets(random.randint(1, 5)) space_battler.shoot() ```

      在这个例子中,我们首先创建了一个SpaceBattler类,它有一个bullets列表来存储子弹。然后,我们定义了一个add_bullets方法,用于向bullets列表中添加子弹。最后,我们定义了一个shoot方法,用于发射子弹。

      shoot方法中,我们首先检查bullets列表的长度是否大于0。如果是,我们就将列表中的子弹随机打乱,然后打印出"射击!"。然后,我们取出打乱的子弹并打印出每个子弹。最后,我们删除打乱后的第一个子弹,以确保下次射击时,第一个子弹仍然存在。

      如果你希望在射击时显示子弹,你可以稍微修改一下这个shoot方法。例如,你可以添加一个检查来确保bullets列表中至少有一个子弹,并且在第一个子弹出现时打印出"子弹:{bullet}"。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部