鱼C论坛

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

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

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

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

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

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

  16. def play(event):
  17.     global rect1,Num_chess,label2
  18.     xx = round((event.x - 40) / 32) +1
  19.     if xx<0:
  20.         return None
  21.     elif xx> Num_chess:
  22.         return None
  23.     else:
  24.         ss=Num_chess-xx+1
  25.         for rect1 in rects:
  26.             if rect1 >= xx:
  27.                 cv.delete(rect1)
  28.         for i in range(ss):
  29.             rects.pop()
  30.         label2['text']=f'玩家取子数:{ss}'
  31.         Num_chess=xx-1
  32.         if Num_chess <= 0:
  33.             label1['text'] = '玩家胜利!'
  34.             root.after(8000, root.destroy())
  35.         label1['text'] = '电脑思考中...'
  36.         wait_time_ms = random.randint(2000, 5000)
  37.         root.after(wait_time_ms, computer_move())

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

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


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

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

  1. from tkinter import *
  2. import random
  3. import time

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

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

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

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

  21. def play(event):
  22.     global Num_chess, rects
  23.     xx = round((event.x - 40) / 32) + 1
  24.    
  25.     if xx > Num_chess:
  26.         return
  27.    
  28.     # 玩家取子
  29.     ss = Num_chess - xx + 1
  30.     for i in range(ss):
  31.         cv.delete(rects.pop())
  32.    
  33.     label_player.config(text="当前取子方:玩家")
  34.     label_count.config(text=f"取子数:{ss}")
  35.    
  36.     Num_chess -= ss

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

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

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

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

  51.     Num_chess -= k

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

  57. cv.bind("<Button-1>", play)
  58. LoadChess()
  59. root.mainloop()
复制代码


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

以下是修复后的代码片段:

  1. from tkinter import *
  2. import random
  3. import time

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

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

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

  20. def play(event):
  21.     global rect1, Num_chess, label2
  22.     xx = round((event.x - 40) / 32) + 1
  23.    
  24.     if xx > Num_chess:
  25.         return
  26.    
  27.     # 玩家取子
  28.     ss = Num_chess - xx + 1
  29.     for i in range(ss):
  30.         cv.delete(rects.pop())
  31.     label2.config(text=f'玩家取子数: {ss}')
  32.    
  33.     Num_chess -= ss
  34.    
  35.     # 检查是否游戏结束
  36.     if Num_chess <= 0:
  37.         label2.config(text='玩家赢了!')
  38.         root.after(8000, root.quit)
  39.         return
  40.    
  41.     # 电脑思考时间
  42.     root.after(random.randint(2000, 5000), computer_play)

  43. def computer_play():
  44.     global Num_chess, label2
  45.    
  46.     k = random.randint(1, Num_chess)
  47.     for i in range(k):
  48.         cv.delete(rects.pop())
  49.     label2.config(text=f'电脑取子数: {k}')
  50.    
  51.     Num_chess -= k
  52.    
  53.     if Num_chess <= 0:
  54.         label2.config(text='电脑赢了!')
  55.         root.after(8000, root.quit)

  56. LoadChess()
  57. cv.bind("<Button-1>", play)
  58. root.mainloop()
复制代码


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-10 07:32:47 | 显示全部楼层
能不能保留原两个标签,一个表示取子方,一个表示取子数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

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

  1. from tkinter import *
  2. import random
  3. import time

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

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

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

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

  21. def play(event):
  22.     global Num_chess, rects
  23.     xx = round((event.x - 40) / 32) + 1
  24.    
  25.     if xx > Num_chess:
  26.         return
  27.    
  28.     # 玩家取子
  29.     ss = Num_chess - xx + 1
  30.     for i in range(ss):
  31.         cv.delete(rects.pop())
  32.    
  33.     label_player.config(text="当前取子方:玩家")
  34.     label_count.config(text=f"取子数:{ss}")
  35.    
  36.     Num_chess -= ss

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

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

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

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

  51.     Num_chess -= k

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

  57. cv.bind("<Button-1>", play)
  58. LoadChess()
  59. root.mainloop()
复制代码


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-7 15:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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