You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Pygame制作的游戏菜单Start按钮功能异常求助

问题原因
  • 赋值运算符错误:代码中start_button.clicked==True使用了比较运算符==,而非赋值运算符=,导致start_button.clicked始终无法被设置为True,游戏界面永远不会触发。
  • Exit按钮逻辑错误:if exit_button.draw(screen):直接将run=False,这会导致只要绘制Exit按钮就退出程序,而非仅在点击按钮时触发退出。
  • 循环结构缺陷:未通过状态管理区分菜单界面与游戏界面,菜单背景会持续覆盖游戏内容,且按钮点击检测会一直运行,干扰游戏正常逻辑。
修正后的代码
run = True
game_state = "menu"  # 新增状态变量,区分菜单/游戏界面

while run:
    clock.tick(FPS)

    for etkinlik in pygame.event.get():
        if etkinlik.type == pygame.QUIT:
            run = False

    if game_state == "menu":
        screen.fill((202, 228, 241))
        # 处理Start按钮点击
        if start_button.draw(screen):
            start_button.clicked = True  # 修正赋值运算符
            print('Play')
            game_state = "game"  # 切换至游戏状态
        # 处理Exit按钮点击
        if exit_button.draw(screen):
            print('EXIT')
            run = False  # 仅点击时退出程序
    elif game_state == "game":
        # 游戏界面逻辑
        draw_bg()

        # 显示战士血量
        draw_health_bar(fighter_1.health, 20, 20)
        draw_health_bar(fighter_2.health, 580, 20)
        # 显示得分
        draw_text("P1: " + str(score[0]), score_font, WHITE, 20, 60)
        draw_text("P2: " + str(score[1]), score_font, WHITE, 580, 60)

        # 更新倒计时
        if intro_count <= 0:
            # 移动角色
            fighter_1.move(SCREEN_WIDTH, SCREEN_HEIGHT, screen, fighter_2, round_over)
            fighter_2.move(SCREEN_WIDTH, SCREEN_HEIGHT, screen, fighter_1, round_over)
        else:
            # 显示倒计时文本
            draw_text(str(intro_count), count_font, WHITE, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 3)
            if (pygame.time.get_ticks() - last_count_update) >= 1000:
                intro_count -= 1
                last_count_update = pygame.time.get_ticks()

        # 更新角色状态
        fighter_1.update()
        fighter_2.update()

        # 绘制角色
        fighter_1.draw(screen)
        fighter_2.draw(screen)

        # 检查胜负
        if round_over == False:
            if fighter_1.alive == False:
                score[1] += 1
                round_over = True
                round_over_time = pygame.time.get_ticks()
            elif fighter_2.alive == False:
                score[0] += 1
                round_over = True
                round_over_time = pygame.time.get_ticks()
        else:
            # 显示胜利图像
            screen.blit(victory_img, (360, 150))
            if pygame.time.get_ticks() - round_over_time > ROUND_OVER_COOLDOWN:
                round_over = False
                intro_count = 3
                fighter_1 = Fighter(1, 200, 310, False, WARRIOR_DATA, warrior_sheet, WARRIOR_ANIMATION_STEPS, sword_fx)
                fighter_2 = Fighter(2, 700, 310, True, WIZARD_DATA, wizard_sheet, WIZARD_ANIMATION_STEPS, magic_fx)

    # 更新显示
    pygame.display.flip()
    pygame.display.update()

pygame.quit()
关键修正说明
  1. 状态管理:新增game_state变量,让菜单与游戏界面逻辑完全分离,避免内容叠加和逻辑冲突。
  2. 赋值修正:将start_button.clicked==True改为start_button.clicked = True,正确设置按钮点击状态。
  3. Exit逻辑修复:仅在Exit按钮被点击时,才触发run=False退出程序。
  4. 界面切换:点击Start按钮后,将game_state切换为"game",正式进入游戏界面逻辑。

内容的提问来源于stack exchange,提问作者MCR dünyası

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 03:25:02