Python Pygame开发Blackjack如何实现结果展示与重开功能
Pygame二十一点结果判定、界面展示与重开逻辑实现
首先修正你原有代码的基础问题:原函数存在语法错误(定义行末尾缺冒号、最后一行多了冗余右括号、字符串拼接缺空格),且函数内直接修改run变量会因为作用域问题无法控制主循环状态,整套逻辑可以按下面的模块拆分实现:
核心状态管理
首先在主循环外定义全局状态变量,不要在零散函数里修改流程控制标记:
game_active:布尔值,标记对局是否进行中,值为False时触发结果展示与重开逻辑result_text:字符串,存储最终胜负结果的展示文本player_cards/dealer_cards:列表,分别存储玩家、庄家的手牌player_sum/dealer_sum:整数,存储双方手牌的当前总点数reset_btn_rect:PygameRect对象,存储重开按钮的位置、尺寸参数,用于点击检测
修正后的结果判定逻辑
补全二十一点全部分支判定规则,函数只负责返回结果文本,不直接修改流程状态:
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
相关产品推荐
相关产品推荐

