python外星人入侵游戏代码_Python外星人入侵游戏<十>

在Python《外星人入侵》游戏中我们已经完善游戏的结束功能。至此,游戏的基本功能已经完成。

我们还将继续完善游戏,添加一个开始按钮,在游戏开始前出现,并在游戏结束后再次出现,让玩家可以重新开始游戏。

修改游戏状态布尔值变量的值,使游戏一开始处于非活动状态,只有我们在点击了开始按钮之后,布尔值变量game_active的值变为True,游戏处于活动状态。

game_stats.py


    def __init__(self,ai_settings):        """初始化统计信息"""        self.ai_settings = ai_settings        self.reset_stats()                """让游戏一开始处于非活动状态"""        self.game_active = False

创建Button类:

我们创建一个Button类,用于创建带标签的实心矩形。在游戏中可以使用这个类创建任何按钮。


button.py


"""开始按钮类"""import pygame.fontclass Button:    def __init__(self,ai_settings,screen,msg):        self.screen = screen        self.screen_rect = screen.get_rect()        """设置按钮的尺寸和其他属性"""        self.width,self.height = 200,50        self.button_color = (0,255,0)        self.text_color = (255,255,255)        self.font = pygame.font.SysFont(None,48)        # 创建按钮的属性,并使其居中        self.rect = pygame.Rect(0,0,self.width,self.height)        self.rect.center = self.screen_rect.center        # 按钮的标签只需要创建一次        self.prep_msg(msg)    def prep_msg(self,msg):        """将msg渲染成图像,并使其在按钮上居中"""        self.msg_image = self.font.render(msg,True,self.text_color,self.button_color)        self.msg_image_rect = self.msg_image.get_rect()        self.msg_image_rect.center = self.rect.center    def draw_button(self):        self.screen.fill(self.button_color,self.rect)        self.screen.blit(self.msg_image,self.msg_image_rect)

在Button类中,对我们创建的按钮和显示的文本进行了设置。

在屏幕上绘制按钮:


alien_invasion.py


from button import Buttondef run_game():    # 初始化游戏并创建一个屏幕对象    pygame.init()    ......    """创建外星人群"""    gf.create_fleet(ai_settings,screen,ship, aliens)    """创建开始按钮"""    play_button = Button(ai_settings,screen,"Play")        # 开始游戏的主循环    while True:        ......        gf.update_screen(ai_settings,stats,screen,ship,aliens,bullets,play_button)        

首先创建一个Button实例对象play_button,然后将play_button传递给更新屏幕的函数update_screen()。


game_functions.py


def update_screen(ai_settings,stats,screen,ship,aliens,bullets,play_button):    """更新屏幕代码"""    screen.fill(ai_settings.bg_color)    """在飞船和外星人后面重绘所有子弹"""    for bullet in bullets.sprites():        bullet.draw_bullet()    # 绘制飞船    ship.blitme()    # 绘制外星人    # alien.blitme()    aliens.draw(screen)    """如果游戏处于非活动状态,就绘制按钮"""    if not stats.game_active:        play_button.draw_button()    # 刷新屏幕    pygame.display.flip()

bcf1d947b95c70841d858899c76bb64e.png

开始游戏和重置游戏:

game_functions.py


def check_events(ai_settings,screen,stats,play_button,ship,aliens,bullets):    """响应按键和鼠标事件"""    for event in pygame.event.get():        if event.type == QUIT:           sys.exit()        elif event.type == KEYDOWN:            check_keydown_events(event,ai_settings,screen,ship,bullets)        elif event.type == KEYUP:            check_keyup_events(event,ship)        elif event.type == MOUSEBUTTONDOWN:            mouse_x,mouse_y = pygame.mouse.get_pos()            check_play_button(ai_settings,screen,stats,play_button,ship,aliens,bullets,mouse_x,mouse_y)"""检测是否按下开始按钮"""def check_play_button(ai_settings,screen,stats,play_button,ship,aliens,bullets,mouse_x,mouse_y):    """在玩家单击Play按钮的时候,开始游戏"""    button_clicked = play_button.rect.collidepoint(mouse_x,mouse_y)    if button_clicked and not stats.game_active:        """隐藏光标"""        pygame.mouse.set_visible(False)        """重置游戏统计信息"""        stats.reset_stats()        stats.game_active = True        """清空外星人和子弹列表"""        aliens.empty()        bullets.empty()        """创建一群新的外星人,并让飞船居中"""        create_fleet(ai_settings,screen,ship,aliens)        ship.ship_center()

游戏结束后,再次点击开始按钮的时候,需要重置游戏信息,但必须是游戏处于非活动状态时,才可以,即game_active的值为False。

if button_clicked and not stats.game_active:

需要重置的信息:重置统计信息、删除现有的外星人和子弹、创建一群新的外星人,并让飞船居中。

"""重置游戏统计信息"""        stats.reset_stats()        stats.game_active = True        """清空外星人和子弹列表"""        aliens.empty()        bullets.empty()        """创建一群新的外星人,并让飞船居中"""        create_fleet(ai_settings,screen,ship,aliens)        ship.ship_center()

此时我们需要修改alien_invasion.py中的check_events()函数,需要传入实参stats、play_button和aliens。

游戏过程中,设置光标不可见:

"""隐藏光标"""pygame.mouse.set_visible(False)

游戏结束后,重新显示光标:

game_functions.py


def ship_hit(ai_settings,stats,score_board,screen,ship,aliens,bullets,bg_music):    """响应被外星人撞到的飞船"""    if stats.ships_left > 0:        ......    else:        stats.game_active = False        pygame.mouse.set_visible(True)

640?wx_fmt=gif

文章参考书籍《Python编程:从入门到实践》

运行之后,开始屏幕上出现一个开始按钮,只有玩家点击按钮的时候,游戏开始运行。当玩家失去所有的飞船之后,按钮再次出现,游戏暂停。

Python游戏

外星人入侵

Pong游戏

贪吃蛇

8ed25b24f4ab78a2e4898fc9e92834c2.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值