鱼C论坛

 找回密码
 立即注册
查看: 78|回复: 3

[已解决]python label显示不正确

[复制链接]
发表于 2024-12-9 21:45:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
取子游戏,玩家与电脑轮流取子,从右侧取子,取得最左侧子为赢家。
两个标签,轮流显示取子方、取子数。设置电脑思考时间2-5秒,
最后显示赢家,8秒后关闭程序。
from tkinter import *
import random
root=Tk()
root.title("尼姆棋")
cv=Canvas(root,width=640,height=480,bg='#008B8B')
rect1=0
Num_chess=18
rects=[]
xx=0
def LoadChess():
    for i in range(Num_chess):
        rect1 = cv.create_rectangle(30+32*i, 220, 58+32*i, 248, fill='#FF7F50')
        rects.append(rect1)
        label1=Label(root, text=str(i+1), font=("Helvetica", 8), bg='white')
        label1.place(x=35+32*i,y=180)

def play(event):
    global rect1,Num_chess,label2
    xx = round((event.x - 40) / 32) +1
    if xx<0:
        return None
    elif xx> Num_chess:
        return None
    else:
        ss=Num_chess-xx+1
        for rect1 in rects:
            if rect1 >= xx:
                cv.delete(rect1)
        for i in range(ss):
            rects.pop()
        label2['text']=f'玩家取子数:{ss}'
        Num_chess=xx-1
        if Num_chess <= 0:
            label1['text'] = '玩家胜利!'
            root.after(8000, root.destroy())
        label1['text'] = '电脑思考中...'
        wait_time_ms = random.randint(2000, 5000)
        root.after(wait_time_ms, computer_move())

def computer_move():
    global Num_chess, xx
    k = random.randint(1, 3)
    for i in range(k):
        if Num_chess> 0:
            cv.delete(rects[-1])
            rects.pop()
            Num_chess =Num_chess - 1
    label2['text'] = f'电脑取子数:{k}'
    if Num_chess<= 0:
        label1['text'] = '电脑胜利!'
        root.after(8000, root.destroy())
    label1['text'] = '该你了'

LoadChess()
cv.bind('<Button-1>',play)
cv.pack()
label1=Label(root,fg='red',bg='white',text='该你了', font=("华文行楷", 20))
label1.place(x=200,y=400)
label2=Label(root,fg='blue',bg='white',text='取子数', font=("kaiti", 20))
label2.place(x=200,y=50)
root.mainloop()
最佳答案
2024-12-10 07:33:01
ydwb 发表于 2024-12-10 07:32
能不能保留原两个标签,一个表示取子方,一个表示取子 ...


当然可以。我们可以为表示取子方和取子数的标签分别创建两个`Label`控件,并在游戏进行中动态更新它们的内容。

下面是修正后的代码,它包含两个标签,一个用于显示取子方,一个用于显示取子数:
from tkinter import *
import random
import time

root = Tk()
root.title("尼姆棋")
cv = Canvas(root, width=640, height=480, bg='#008B8B')
cv.pack()

# 初始化一些全局变量和控件
rects = []
Num_chess = 18

label_player = Label(root, text="当前取子方:玩家", font=("Helvetica", 14), bg='white')
label_player.pack(pady=10)
label_count = Label(root, text="取子数:0", font=("Helvetica", 14), bg='white')
label_count.pack(pady=10)

def LoadChess():
    for i in range(Num_chess):
        rect1 = cv.create_rectangle(30 + 32 * i, 220, 58 + 32 * i, 248, fill='#FF7F50')
        rects.append(rect1)
        label1 = Label(root, text=str(i + 1), font=("Helvetica", 8), bg='white')
        label1.place(x=35 + 32 * i, y=180)

def play(event):
    global Num_chess, rects
    xx = round((event.x - 40) / 32) + 1
    
    if xx > Num_chess:
        return
    
    # 玩家取子
    ss = Num_chess - xx + 1
    for i in range(ss):
        cv.delete(rects.pop())
    
    label_player.config(text="当前取子方:玩家")
    label_count.config(text=f"取子数:{ss}")
    
    Num_chess -= ss

    # 检查是否游戏结束
    if Num_chess == 0:
        label_player.config(text="玩家获胜!")
        root.after(8000, root.quit)  # 8秒后关闭程序
        return

    # 电脑取子
    root.after(random.randint(2000, 5000), computer_turn)

def computer_turn():
    global Num_chess, rects
    k = random.randint(1, min(3, Num_chess))  # 假设电脑每次最多取1到3个
    for i in range(k):
        cv.delete(rects.pop())

    label_player.config(text="当前取子方:电脑")
    label_count.config(text=f"取子数:{k}")

    Num_chess -= k

    # 检查是否游戏结束
    if Num_chess == 0:
        label_player.config(text="电脑获胜!")
        root.after(8000, root.quit)  # 8秒后关闭程序
        return

cv.bind("<Button-1>", play)
LoadChess()
root.mainloop()

希望这能帮助你完成游戏需求!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-12-9 21:51:18 | 显示全部楼层
你好,看起来你的代码有一些问题,尤其是标签显示和取子的逻辑。让我帮你理清这些问题。

1. 缺少`rects`列表初始化:在定义代码中没有给`rects`列表初始化,导致在代码中使用时会出问题。
2. 修复比较符号错误:例如`if xx Num_chess:`应该用`>`比较。
3. 标签更新逻辑中的错误:你只是给`label2`重新赋值了字符串,但需要更新`Label`组件的内容。
4. 缺少对`k`和`xx`更新的逻辑处理。

以下是修复后的代码片段:
from tkinter import *
import random
import time

root = Tk()
root.title("尼姆棋")
cv = Canvas(root, width=640, height=480, bg='#008B8B')
cv.pack()

# 初始化一些全局变量和控件
rect1 = 0
Num_chess = 18
rects = []
label2 = Label(root, text="", font=("Helvetica", 14), bg='white')
label2.pack()

def LoadChess():
    for i in range(Num_chess):
        rect1 = cv.create_rectangle(30 + 32 * i, 220, 58 + 32 * i, 248, fill='#FF7F50')
        rects.append(rect1)
        label1 = Label(root, text=str(i + 1), font=("Helvetica", 8), bg='white')
        label1.place(x=35 + 32 * i, y=180)

def play(event):
    global rect1, Num_chess, label2
    xx = round((event.x - 40) / 32) + 1
    
    if xx > Num_chess:
        return
    
    # 玩家取子
    ss = Num_chess - xx + 1
    for i in range(ss):
        cv.delete(rects.pop())
    label2.config(text=f'玩家取子数: {ss}')
    
    Num_chess -= ss
    
    # 检查是否游戏结束
    if Num_chess <= 0:
        label2.config(text='玩家赢了!')
        root.after(8000, root.quit)
        return
    
    # 电脑思考时间
    root.after(random.randint(2000, 5000), computer_play)

def computer_play():
    global Num_chess, label2
    
    k = random.randint(1, Num_chess)
    for i in range(k):
        cv.delete(rects.pop())
    label2.config(text=f'电脑取子数: {k}')
    
    Num_chess -= k
    
    if Num_chess <= 0:
        label2.config(text='电脑赢了!')
        root.after(8000, root.quit)

LoadChess()
cv.bind("<Button-1>", play)
root.mainloop()

以上代码修正了出现的问题,并完成了您需要的功能。请根据实际的应用情境进行适当调整。希望这能帮到你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-10 07:32:47 | 显示全部楼层
能不能保留原两个标签,一个表示取子方,一个表示取子数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-10 07:33:01 | 显示全部楼层    本楼为最佳答案   
ydwb 发表于 2024-12-10 07:32
能不能保留原两个标签,一个表示取子方,一个表示取子 ...


当然可以。我们可以为表示取子方和取子数的标签分别创建两个`Label`控件,并在游戏进行中动态更新它们的内容。

下面是修正后的代码,它包含两个标签,一个用于显示取子方,一个用于显示取子数:
from tkinter import *
import random
import time

root = Tk()
root.title("尼姆棋")
cv = Canvas(root, width=640, height=480, bg='#008B8B')
cv.pack()

# 初始化一些全局变量和控件
rects = []
Num_chess = 18

label_player = Label(root, text="当前取子方:玩家", font=("Helvetica", 14), bg='white')
label_player.pack(pady=10)
label_count = Label(root, text="取子数:0", font=("Helvetica", 14), bg='white')
label_count.pack(pady=10)

def LoadChess():
    for i in range(Num_chess):
        rect1 = cv.create_rectangle(30 + 32 * i, 220, 58 + 32 * i, 248, fill='#FF7F50')
        rects.append(rect1)
        label1 = Label(root, text=str(i + 1), font=("Helvetica", 8), bg='white')
        label1.place(x=35 + 32 * i, y=180)

def play(event):
    global Num_chess, rects
    xx = round((event.x - 40) / 32) + 1
    
    if xx > Num_chess:
        return
    
    # 玩家取子
    ss = Num_chess - xx + 1
    for i in range(ss):
        cv.delete(rects.pop())
    
    label_player.config(text="当前取子方:玩家")
    label_count.config(text=f"取子数:{ss}")
    
    Num_chess -= ss

    # 检查是否游戏结束
    if Num_chess == 0:
        label_player.config(text="玩家获胜!")
        root.after(8000, root.quit)  # 8秒后关闭程序
        return

    # 电脑取子
    root.after(random.randint(2000, 5000), computer_turn)

def computer_turn():
    global Num_chess, rects
    k = random.randint(1, min(3, Num_chess))  # 假设电脑每次最多取1到3个
    for i in range(k):
        cv.delete(rects.pop())

    label_player.config(text="当前取子方:电脑")
    label_count.config(text=f"取子数:{k}")

    Num_chess -= k

    # 检查是否游戏结束
    if Num_chess == 0:
        label_player.config(text="电脑获胜!")
        root.after(8000, root.quit)  # 8秒后关闭程序
        return

cv.bind("<Button-1>", play)
LoadChess()
root.mainloop()

希望这能帮助你完成游戏需求!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 12:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表