【问题标题】:Python: why does first restart works, but second - doesn't?Python:为什么第一次重启有效,但第二次 - 没有?
【发布时间】:2023-01-15 20:10:43
【问题描述】:

这是一个简单的扫雷游戏,带有 Windows 用户界面

这个函数唯一要做的就是擦除按钮上的所有信息(例如文本),以及创建一个新的随机数组。在我按下按钮后第一次它工作得很好,但第二次它不工作。第二次它擦除所有内容(它按计划再次完成它的工作),但其他功能不起作用(我在第二次重启后按下按钮,没有任何反应,但在第一次重启后一切都很好)。

这是怎么回事??是存储变量的内存问题,还是图形用户界面的特定问题,我不知道?

from tkinter import *

def new_game():
    lost = False

    label['text'] = str(mines) + ' mines left'

    global mine_sweep

    mine_sweep = mine_randomization().tolist()
    
    for row in range(10):
        for col in range(10):
            buttons[row][col]['text'] = ''


window = Tk()
window.title('minesweeper')

label = Label(text=str(mines)+' mines left', font=('consolas', 20))
label.pack(side='top')

reset_button = Button(text='restart', command=new_game)
reset_button.pack(side='top')

buttons = buttons.tolist()


frame = Frame(window)
frame.pack()

for row in range(10):
    for col in range(10):
        buttons[row][col] = Button(frame, text='', font=('consolas', 10),
                                   width=2, height=1,
                                   command= lambda row=row, col=col: cell(row, col))
        buttons[row][col].grid(row=row, column=col)

window.mainloop()

(我不能把整个程序放在这里,只是不起作用的部分)


这是功能单元的作用:

def cell(row, col):

    global lost
    
    if buttons[row][col]['text'] == '' and mine_sweep[row][col] == 0 and not lost:
        open_fields(row, col) 
    elif buttons[row][col]['text'] == '' and mine_sweep[row][col] == 1 and not lost:
        buttons[row][col].config(bg='red', font=('consolas', 10))
        buttons[row][col]['text'] = '*'
        label['text'] = 'You lost!'
        lost = True

    if check_win():
        label['text'] = 'You win!'

【问题讨论】:

  • 我不知道,对我来说这很完美。 :(
  • @TimRoberts 我很确定(刚刚测试完全确定)这两种方法都做同样的事情(以及config
  • cell 是做什么的?如果没有完整的minimal reproducible example,不太可能重现问题,给定的代码没有问题(除了没有定义一些名称之外)
  • 哦,难道你真的没有重置lost?在new_game你只声明了一个局部变量lost,让它成为global,这似乎是你问题的根本原因(特别是因为在cell你检查这个条件),否则,代码似乎它应该运作良好

标签: python tkinter restart


【解决方案1】:

是的,@Matiiss 是正确的,解决方案是变量 lost 用于不同的函数,这就是为什么它应该是全局的。此外,当第一局游戏结束时,lost 应该再次设置为 false,以便开始新游戏并且计算机知道您实际上还没有“输”。

【讨论】:

    猜你喜欢
    • 2019-06-07
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多