跳至正文
View Categories

1 min read

主要内容 #

    1. 24点游戏的主函数完善

1.24点游戏的主函数完善 #

前面几课我们已经完成了界面设计,类的定义,显示功能等,现在主要是将main函数的功能流程进行完善,代码实现如下:

def main():
    '''
    主函数
    '''
    # 初始化, 导入必要的游戏素材
    pygame.init()
    pygame.mixer.init()
    screen = pygame.display.set_mode(SCREENSIZE)
    pygame.display.set_caption('24点小游戏-大师码')
    win_sound = pygame.mixer.Sound(AUDIOWINPATH)
    lose_sound = pygame.mixer.Sound(AUDIOLOSEPATH)
    warn_sound = pygame.mixer.Sound(AUDIOWARNPATH)
    pygame.mixer.music.load(BGMPATH)
    pygame.mixer.music.play(-1, 0.0)

    # 24点游戏生成器
    game24_gen = Game24Generator()
    game24_gen.generate()

    # 精灵组
    # --数字
    number_sprites_group = getNumberSpritesGroup(game24_gen.numbers_now)
    # --运算符
    operator_sprites_group = getOperatorSpritesGroup(OPREATORS)
    # --按钮
    button_sprites_group = getButtonSpritesGroup(BUTTONS)

    # 游戏主循环
    clock = pygame.time.Clock()
    selected_numbers = []
    selected_operators = []
    selected_buttons = []
    is_win = False

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT: # 是否退出
                pygame.quit()
                sys.exit(-1)

            elif event.type == pygame.MOUSEBUTTONUP: # 检测鼠标是否点击三个不同的按钮
                mouse_pos = pygame.mouse.get_pos()
                selected_numbers = checkClicked(number_sprites_group, mouse_pos, 'NUMBER')
                selected_operators = checkClicked(operator_sprites_group, mouse_pos, 'OPREATOR')
                selected_buttons = checkClicked(button_sprites_group, mouse_pos, 'BUTTON')

        screen.fill(AZURE)

        # 更新数字
        if len(selected_numbers) == 2 and len(selected_operators) == 1: # 选择两个操作数和一个操作符
            noselected_numbers = []

            for each in number_sprites_group: # 遍历数字组
                if each.is_selected: # 如果被选中
                    if each.select_order == '1': # 选中的次序
                        selected_number1 = each.attribute
                    elif each.select_order == '2':
                        selected_number2 = each.attribute
                    else:
                        raise ValueError('Unknow select_order <%s>, expect <1> or <2>...' % each.select_order)
                else: # 未被选中则加入未选中列表
                    noselected_numbers.append(each.attribute)
                each.is_selected = False

            for each in operator_sprites_group: # 遍历字符组
                each.is_selected = False

            result = calculate(selected_number1, selected_number2, *selected_operators) # 计算结果
            if result is not None:
                game24_gen.numbers_now = noselected_numbers + [result]  # 更新数字为Result
                is_win = game24_gen.check() # 检测是否胜利
                if is_win:
                    win_sound.play() # 播放胜利音效
                if not is_win and len(game24_gen.numbers_now) == 1: # 如果没赢并且只剩下一个数字还不是24说明游戏失败
                    lose_sound.play() # 播放失败音效
            else:
                warn_sound.play() # 结果为空,播放警告音效

            selected_numbers = []
            selected_operators = []
            number_sprites_group = getNumberSpritesGroup(game24_gen.numbers_now) # 由于数字在逐渐变少,因此需要重新绘出数字精灵组

        # 精灵都画到screen上
        for each in number_sprites_group:
            each.draw(screen, pygame.mouse.get_pos())  # 画出数字精灵
        for each in operator_sprites_group:
            each.draw(screen, pygame.mouse.get_pos())  # 画出操作符精灵
        for each in button_sprites_group:
            if selected_buttons and selected_buttons[0] in ['RESET', 'NEXT']:
                is_win = False # 如果选择按钮是'RESET'或者'NEXT',则将成功标志设为否
            if selected_buttons and each.attribute == selected_buttons[0]:
                each.is_selected = False
                # 根据button function执行响应操作
                number_sprites_group = each.do(game24_gen, getNumberSpritesGroup, number_sprites_group, button_sprites_group)
                selected_buttons = []
            each.draw(screen, pygame.mouse.get_pos()) # 画出按钮精灵
        # 游戏胜利
        if is_win:
            showInfo('Congratulations', screen)
        # 游戏失败
        if not is_win and len(game24_gen.numbers_now) == 1:
            showInfo('Game Over', screen)
        pygame.display.update()
        clock.tick(30)

全部修改完之后,运行整体代码,看整体效果。

至此完成了24点游戏所有的代码部分,希望大家可以对代码进行深入理解,并且尝试修改代码,完成新的功能,比如改为21点等。

小结 #

  • 本节主要介绍了24点游戏的主循环start函数的完善,至此24点游戏开发完成。