【python3小白上路系列】限制子弹数量

作为一个有良心的游戏,我们不能让玩家沉迷下去,所以子弹的数量我们要限制一下,变相增加游戏难度。

1.5.6 限制子弹数量

首先,在settings.py中存储所允许的最大子弹数:这里我们设置为3发。

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
        self.bullets_allowed = 3

下面我们需要在game_functions.py的check_keydown_events() 中,创建新子弹前检查未消失的子弹数是否小于该设置:

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中
        if len(bullets) < ai_settings.bullets_allowed:
            new_bullet = Bullet(ai_settings,screen,ship)
            bullets.add(new_bullet)

玩家按空格键时,我们检查bullets 的长度。如果len(bullets) 小于3,我们就创建一个新子弹;但如果已有3颗未消失的子弹,则玩家按空格键时什么都不会发生。如果你 现在运行这个游戏,屏幕上最多只能有3颗子弹。

1.5.7 创建函数update_bullets()

编写并检查子弹管理代码后,可将其移到模块game_functions 中,以让主程序文件alien_invasion.py尽可能简单。我们创建一个名为update_bullets() 的新函数,并将其添加到game_functions.py的末尾:

def update_bullets(bullets):
    # 更新子弹的位置
     bullets.update()   # 删除已消失的子弹
    for bullet in bullets.copy():
        if bullet.rect.bottom <= 0:
            bullets.remove(bullet)
    #print(len(bullets))

现在我们主程序的代码就更加简洁了:

import pygame
from pygame.sprite import Group
from setting import Settings
from ship import Ship
import game_functions as gf

def rungame():
    #初始化游戏并创建一个屏幕对象
    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()
        gf.update_bullets(bullets)
        gf.update_screen(ai_settings,screen,ship,bullets)

rungame()
1.5.8 创建函数fire_bullet()

下面将发射子弹的代码移到一个独立的函数中,这样,在check_keydown_events() 中只需使用一行代码来发射子弹,让elif 代码块变得非常简单:

def fire_bullet(ai_settings,screen,ship,bullets):
    #创建一颗子弹,并将其加入编组bullets中
    if len(bullets) < ai_settings.bullets_allowed:
        new_bullet = Bullet(ai_settings,screen,ship)
        bullets.add(new_bullet)

函数fire_bullet() 只包含玩家按空格键时用于发射子弹的代码;在check_keydown_events() 中,我们在玩家按空格键时调用fire_bullet() 。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容