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

Python Pygame开发Blackjack如何实现结果展示与重开功能

Pygame二十一点结果判定、界面展示与重开逻辑实现

首先修正你原有代码的基础问题:原函数存在语法错误(定义行末尾缺冒号、最后一行多了冗余右括号、字符串拼接缺空格),且函数内直接修改run变量会因为作用域问题无法控制主循环状态,整套逻辑可以按下面的模块拆分实现:

核心状态管理

首先在主循环外定义全局状态变量,不要在零散函数里修改流程控制标记:

  • game_active:布尔值,标记对局是否进行中,值为False时触发结果展示与重开逻辑
  • result_text:字符串,存储最终胜负结果的展示文本
  • player_cards/dealer_cards:列表,分别存储玩家、庄家的手牌
  • player_sum/dealer_sum:整数,存储双方手牌的当前总点数
  • reset_btn_rect:Pygame Rect对象,存储重开按钮的位置、尺寸参数,用于点击检测

修正后的结果判定逻辑

补全二十一点全部分支判定规则,函数只负责返回结果文本,不直接修改流程状态:

def judge_result(sum_player, sum_dealer):
    # 爆牌判定优先
    if sum_player > 21:
        return "玩家爆牌,庄家获胜"
    if sum_dealer > 21:
        return "庄家爆牌,玩家获胜"
    # 黑杰克(天然21)判定
    if sum_player == 21 and sum_dealer != 21:
        return f"Blackjack!玩家{sum_player}点,庄家{sum_dealer}点,玩家获胜"
    # 常规点数比对
    if sum_player > sum_dealer:
        return f"玩家{sum_player}点,庄家{sum_dealer}点,玩家获胜"
    if sum_player < sum_dealer:
        return f"玩家{sum_player}点,庄家{sum_dealer}点,庄家获胜"
    return f"双方均为{sum_player}点,平局"

触发时机:等玩家选择停牌后,先执行庄家补牌逻辑(常规规则是庄家手牌点数小于17时必须持续补牌),补牌完成后调用该函数拿到结果,将game_active设为False,把返回值赋值给result_text即可。

界面渲染与重开逻辑

在Pygame初始化阶段提前加载字体、定义按钮参数,主循环内根据game_active状态切换渲染内容:

# 初始化阶段(pygame.init()之后执行)
pygame.font.init()
result_font = pygame.font.SysFont("simhei", 48)
btn_font = pygame.font.SysFont("simhei", 32)
# 重开按钮居中放在屏幕偏下位置
SCREEN_WIDTH, SCREEN_HEIGHT = 800, 600
reset_btn_rect = pygame.Rect(SCREEN_WIDTH//2 - 100, SCREEN_HEIGHT//2 + 50, 200, 60)

# ----------------------
# 主循环内渲染逻辑
# ----------------------
# 先渲染对局中的常规元素(牌桌、手牌、要牌/停牌按钮等)
# ... 你的原有对局渲染代码 ...

# 游戏结束时叠层渲染结果面板
if not game_active:
    # 半透明黑色遮罩突出结果层
    overlay = pygame.Surface((SCREEN_WIDTH, SCREEN_HEIGHT))
    overlay.set_alpha(180)
    overlay.fill((0,0,0))
    screen.blit(overlay, (0,0))

    # 居中渲染结果文本
    text_surf = result_font.render(result_text, True, (255,215,0))
    text_rect = text_surf.get_rect(center=(SCREEN_WIDTH//2, SCREEN_HEIGHT//2 - 50))
    screen.blit(text_surf, text_rect)

    # 渲染重开按钮
    pygame.draw.rect(screen, (34,139,34), reset_btn_rect, border_radius=8)
    btn_text_surf = btn_font.render("重新开始", True, (255,255,255))
    btn_text_rect = btn_text_surf.get_rect(center=reset_btn_rect.center)
    screen.blit(btn_text_surf, btn_text_rect)

# ----------------------
# 主循环内事件检测逻辑
# ----------------------
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        run = False
    # 检测重开按钮点击
    if not game_active and event.type == pygame.MOUSEBUTTONDOWN:
        if reset_btn_rect.collidepoint(event.pos):
            # 重置所有对局状态
            game_active = True
            result_text = ""
            player_cards.clear()
            dealer_cards.clear()
            # 重新发初始手牌,可把单张发牌逻辑封装成deal_card()函数
            player_cards.extend([deal_card(), deal_card()])
            dealer_cards.extend([deal_card(), deal_card()])
            # 重新计算初始点数,注意单独写点数计算函数处理A牌可算1/11的规则
            player_sum = calculate_hand_sum(player_cards)
            dealer_sum = calculate_hand_sum(dealer_cards)

补充说明:点数计算函数需要单独实现A牌的自适应规则——手牌总点数超过21时,把手中的A牌从11点调整为1点计算,直到点数不超过21或者没有可调整的A牌为止。

内容的提问来源于stack exchange,提问作者Lukas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:09:23