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

Flask开发黑杰克游戏:Deal按钮失效与变量合理性疑问

黑杰克(Blackjack)Flask应用问题解决指引

一、Deal按钮功能修复

问题分析

  1. Deal按钮所在表单提交到/(POST方法),但你的home路由完全没处理POST请求中的Deal提交逻辑。
  2. url_for('/deal')用法错误:url_for需要传入视图函数名(即deal),而非路径字符串。
  3. 全局变量count的逻辑不合理,会导致新用户无法正常初始化游戏。

修复方案

1. 调整表单提交目标

直接让Deal按钮提交到/deal路由,简化逻辑:

<form action="/deal" method="Post" >
    <input class="hit_button" type="submit" value="Hit" name="Hit"/>
    <input class="stay_button" type="submit" value="Stay" name="Stay"/>
</form>
<form action="/deal" method="Post" >
    <input class="deal_button" type="submit" value="Deal" name="Deal"/>
</form>

2. 修正路由逻辑

去掉不合理的全局count变量,修正url_for用法,补充各按钮的处理逻辑:

from flask import Flask, render_template, request, redirect, url_for, session
import random
import main
import datetime as dt

app = Flask(__name__)
# 必须设置secret_key才能启用session功能,替换为随机字符串
app.secret_key = 'your_random_secret_key_here'

year = dt.datetime.now().year

@app.route('/', methods=['POST', "GET"])
def home():
    # 首次访问直接渲染初始页面
    return render_template("index.html", year=year)

@app.route('/deal', methods=['POST', "GET"])
def deal():
    # 处理Deal按钮提交,初始化新游戏
    if request.form.get("Deal", False):
        main.start()
        # 将游戏状态存入session,保证每个用户独立
        session['player_hand'] = main.player_hand
        session['dealer_hand'] = main.dealer_hand
        session['score_p'] = main.get_current_score(main.player_hand)
        session['score_d'] = main.get_dealer_starting_value(main.dealer_hand)
        return render_template("index.html", year=year, 
                               player=session['player_hand'], 
                               dealer=session['dealer_hand'][1:],
                               score_d=session['score_d'],
                               score_p=session['score_p'])
    # 处理Hit按钮提交,更新玩家手牌
    elif request.form.get("Hit", False):
        player_hand = session.get('player_hand', [])
        if main.get_current_score(player_hand) <= 21:
            main.player_hand_dealt()
            session['player_hand'] = main.player_hand
            session['score_p'] = main.get_current_score(main.player_hand)
            return render_template("index.html", year=year, 
                                   player=session['player_hand'], 
                                   dealer=session['dealer_hand'][1:],
                                   score_d=session['score_d'],
                                   score_p=session['score_p'])
    # 处理Stay按钮提交,后续可补充庄家回合逻辑
    elif request.form.get("Stay", False):
        return redirect(url_for('deal'))
    # GET请求访问/deal时,默认初始化新游戏
    else:
        main.start()
        session['player_hand'] = main.player_hand
        session['dealer_hand'] = main.dealer_hand
        session['score_p'] = main.get_current_score(main.player_hand)
        session['score_d'] = main.get_dealer_starting_value(main.dealer_hand)
        return render_template("index.html", year=year, 
                               player=session['player_hand'], 
                               dealer=session['dealer_hand'][1:],
                               score_d=session['score_d'],
                               score_p=session['score_p'])

二、游戏状态管理优化

问题

你当前用main模块的全局变量(如player_hand、dealer_hand)存储游戏状态,这在多用户场景下会彻底混乱——Flask默认多线程运行,所有用户会共享这些全局变量,一个用户的操作会直接覆盖其他用户的游戏数据。

解决方案

用Flask的session存储每个用户的独立游戏状态:

  • session基于加密cookie实现,每个用户有专属的存储区域,互不干扰。
  • 所有和用户游戏相关的变量(手牌、分数等)都存入session,而非全局变量或模块变量。

关键注意点

  1. 必须设置app.secret_key才能使用session,建议用随机生成的长字符串。
  2. 每次更新游戏状态后,要同步更新session中的对应值。
  3. 彻底抛弃全局变量存储用户游戏数据的方式,避免多用户冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:35:34