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

奇偶猜数游戏代码功能异常求助:无法正确判断数字奇偶并完成计分

奇偶猜数游戏代码功能异常求助:无法正确判断数字奇偶并完成计分

看起来你在做一个有意思的奇偶猜数小游戏,但代码里的语法错误、逻辑问题还有一些细节没处理好,导致判断和计分功能失效。我帮你梳理下问题点,再给出修正后的完整代码:

先说说你代码里的核心问题:

  • 判断条件语法错误:if (chiffre % 2 == 0)(reponse = Pair): 完全不符合Python语法,你需要先获取用户的选择,再判断随机数字的奇偶性是否和选择匹配。
  • StringVar未实例化:reponse = tk.StringVar 少了括号,应该写成reponse = tk.StringVar(),因为这是一个类,必须实例化才能使用。
  • Checkbutton的变量与值设置错误:两个二选一项共用同一个变量,但没有设置不同的value,导致无法正确获取用户选择的是"Pair"还是"Impair"(这里其实用Radiobutton更适合二选一的场景)。
  • 判断对象错误:你用了chiffre % 2 == 0,但chiffre是存储数字的列表,应该判断随机选中的具体数字chiffre[position]的奇偶性。
  • 变量未初始化:pointT和pointO没有初始值,直接做加法会报错未定义。
  • 函数触发逻辑缺失:pigeNumero函数没有触发时机,应该添加一个按钮让用户点击后再生成随机数并判断结果。

修正后的完整代码:

import tkinter as tk
import random

# 初始化计分变量
pointT = 0
pointO = 0

def pigeNumero():
    global pointT, pointO  # 声明使用全局变量
    if len(chiffre) >= 1:
        position = random.randint(0, len(chiffre)-1)  # 修正索引范围,避免越界
        selected_num = chiffre[position]
        lblNumero['text'] = "Le numéro est: {0}".format(selected_num)
        
        # 获取用户的选择
        user_choice = reponse.get()
        
        # 判断用户选择是否正确
        if (selected_num % 2 == 0 and user_choice == "Pair") or (selected_num % 2 != 0 and user_choice == "Impair"):
            pointT += 1
            print("Bravo! Tu as {0} point(s)".format(pointT))
        else:
            pointO += 1
            print("Désolé. L'ordi à {0} point(s)".format(pointO))

# 创建主窗口
fenetre = tk.Tk()
fenetre.title("Jeu Pair/Impair")

# 初始化数字列表
chiffre = []
for i in range(1, 99):
    chiffre.append(i)

# 创建StringVar存储用户选择,默认选中Pair
reponse = tk.StringVar(value="Pair")

# 创建标签显示数字
lblNumero = tk.Label(fenetre, text="Cliquez sur le bouton pour commencer!", font="Arial 15")
lblNumero.pack(pady=10)

# 创建单选按钮(更适合二选一的场景)
chkbtnPair = tk.Radiobutton(fenetre)
chkbtnPair['text'] = "Pair"
chkbtnPair['width'] = "15"
chkbtnPair['variable'] = reponse
chkbtnPair['value'] = "Pair"
chkbtnPair['font'] = "Arial 15"
chkbtnPair.pack(pady=5)

chkbtnImpair = tk.Radiobutton(fenetre)
chkbtnImpair['text'] = "Impair"
chkbtnImpair['width'] = "15"
chkbtnImpair['variable'] = reponse
chkbtnImpair['value'] = "Impair"
chkbtnImpair['font'] = "Arial 15"
chkbtnImpair.pack(pady=5)

# 创建触发按钮
btnJouer = tk.Button(fenetre, text="Jouer!", command=pigeNumero, font="Arial 15")
btnJouer.pack(pady=10)

# 启动主循环
fenetre.mainloop()

修正点说明:

  1. 把Checkbutton换成了Radiobutton,避免用户同时选中两个选项,更贴合二选一的游戏逻辑。
  2. 给每个Radiobutton设置了对应的value,这样reponse.get()能正确获取用户选择的"Pair"或"Impair"。
  3. 修正了随机索引的范围:random.randint(0, len(chiffre)-1),因为列表索引从0开始,原代码会导致索引越界报错。
  4. 初始化了计分变量pointT和pointO,并在函数里用global声明使用全局变量,确保计分能正常累加。
  5. 重构了判断逻辑,正确对比用户选择和数字的奇偶性,实现正确的计分规则。
  6. 添加了触发按钮和初始提示标签,让游戏的操作流程更清晰。

你可以运行这段代码试试,点击"Jouer!"按钮就会生成随机数,然后根据你的选择判断计分啦~

备注:内容来源于stack exchange,提问作者tristan tremblay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 14:47:32