我使用 tkinter 编写了一个非常简单的扫雷器克隆,但是由于某种原因,当我调用 boom()
方法时,会打印 "BOOM!"
但窗口没有关闭。为什么这不起作用?
import math
import tkinter
from tkinter import *
from random import sample, randrange
# ??
revealed = []
firstClick = True
def boom():
print("BOOM!")
root.destroy()
def flag(x, y):
if [x,y] not in revealed:
if (textArray[x][y].get() == "?"):
textArray[x][y].set("")
else:
labelArray[x][y].configure(fg="red", font="Arial 12")
textArray[x][y].set("?")
def reveal(x, y, active):
global firstClick
if firstClick:
firstClick = False
randx = randrange(len(gameMap))
randy = randrange(len(gameMap))
while(gameMap[randx][randy] != 0):
randx = randrange(len(gameMap))
randy = randrange(len(gameMap))
reveal(randx, randy, False)
return
preRevealed = revealed.copy()
revealed.append([x, y])
if gameMap[x][y] == "bomb":
textArray[x][y].set("?")
labelArray[x][y].configure(relief=FLAT, font=("Arial", 12), fg='red')
print("BOOM!")
elif gameMap[x][y] != 0:
textArray[x][y].set(gameMap[x][y])
if gameMap[x][y] == 1:
labelArray[x][y].configure(fg="blue")
if gameMap[x][y] == 2:
labelArray[x][y].configure(fg="green")
if gameMap[x][y] == 3:
labelArray[x][y].configure(fg="red")
if gameMap[x][y] == 4:
labelArray[x][y].configure(fg="purple")
if gameMap[x][y] >= 5:
labelArray[x][y].configure(fg="orange")
labelArray[x][y].configure(relief=FLAT, font=("Arial", 12, "bold"))
if active:
if [x,y] not in preRevealed:
if gameMap[x][y] != "bomb":
if (x>0) and gameMap[x-1][y] != "bomb": reveal(x-1, y, False)
if (x<len(gameMap[x])-1) and gameMap[x+1][y] != "bomb": reveal(x+1, y, False)
if (y>0) and gameMap[x][y-1] != "bomb": reveal(x, y-1, False)
if (y<len(gameMap[x])-1) and gameMap[x][y+1] != "bomb": reveal(x, y+1, False)
if (y>0) and (x>0)and gameMap[x-1][y-1] != "bomb" and gameMap[x-1][y-1] != 0: reveal(x-1, y-1, False)
if (y<len(gameMap[x])-1) and (x>0)and gameMap[x-1][y+1] != "bomb" and gameMap[x-1][y+1] != 0: reveal(x-1, y+1, False)
if (y>0) and (x<len(gameMap[x])-1)and gameMap[x+1][y-1] != "bomb" and gameMap[x+1][y-1] != 0: reveal(x+1, y-1, False)
if (y<len(gameMap[x])-1) and (x<len(gameMap[x])-1)and gameMap[x+1][y+1] != "bomb" and gameMap[x-1][y+1] != 0: reveal(x+1, y+1, False)
else:
labelArray[x][y].configure(relief=FLAT)
textArray[x][y].set("")
if [x,y] not in preRevealed:
if gameMap[x][y] != "bomb":
if (x>0) and gameMap[x-1][y] != "bomb": reveal(x-1, y, True)
if (x<len(gameMap[x])-1) and gameMap[x+1][y] != "bomb": reveal(x+1, y, True)
if (y>0) and gameMap[x][y-1] != "bomb": reveal(x, y-1, True)
if (y<len(gameMap[x])-1) and gameMap[x][y+1] != "bomb": reveal(x, y+1, True)
if (y>0) and (x>0)and gameMap[x-1][y-1] != "bomb" and gameMap[x-1][y-1] != 0: reveal(x-1, y-1, True)
if (y<len(gameMap[x])-1) and (x>0)and gameMap[x-1][y+1] != "bomb" and gameMap[x-1][y+1] != 0: reveal(x-1, y+1, True)
if (y>0) and (x<len(gameMap[x])-1)and gameMap[x+1][y-1] != "bomb" and gameMap[x+1][y-1] != 0: reveal(x+1, y-1, True)
if (y<len(gameMap[x])-1) and (x<len(gameMap[x])-1)and gameMap[x+1][y+1] != "bomb" and gameMap[x-1][y+1] != 0: reveal(x+1, y+1, True)
def playGame(gameframe, size):
global gameMap
global textArray
global labelArray
bombQuantity = math.ceil((size**2)*.15)
bombPositions = sample(range(size**2), bombQuantity)
gameMap = []
textArray = []
labelArray = []
count = 0
for r in range(size):
textRow = []
labelRow = []
gameRow = []
for c in range(size):
text = StringVar()
label = Label(gameframe, textvariable=text, height=1, width=2, font=("Arial", 12, "bold"), relief=RAISED, bg='#c0bfc0')
if count in bombPositions:
gameRow.append("bomb")
else:
gameRow.append(0)
label.grid(row=r, column=c, padx = 1, pady=1)
textRow.append(text)
labelRow.append(label)
count+=1
gameMap.append(gameRow)
textArray.append(textRow)
labelArray.append(labelRow)
for row in range(len(gameMap)):
for col in range(len(gameMap[row])):
space = gameMap[row][col]
labelArray[row][col].bind("<Button-1>", lambda event, x=row, y=col: reveal(x, y, False))
labelArray[row][col].bind("<Button-2>", lambda event, x=row, y=col: flag(x, y))
labelArray[row][col].bind("<Button-3>", lambda event, x=row, y=col: flag(x, y))
if space == "bomb":
for x in range(row-1, row+2):
for y in range(col-1, col+2):
if -1 < x < len(gameMap) and -1 < y < len(gameMap[row]) and gameMap[x][y] != "bomb":
gameMap[x][y]+=1
# for row in gameMap:
# for col in gameMap:
# print(col, end =" ,")
# print()
root = tkinter.Tk()
gameframe = Frame(root, bd=2, padx=2, pady=2, relief=SUNKEN, bg="#81828d")
gameframe.pack(side=BOTTOM, padx=30, pady=30)
playGame(gameframe, 15)
root.mainloop()
答案 0 :(得分:0)
您从未调用过 boom
函数。这就是问题所在。
def reveal(x, y, active):
global firstClick
if firstClick:
firstClick = False
randx = randrange(len(gameMap))
randy = randrange(len(gameMap))
while(gameMap[randx][randy] != 0):
randx = randrange(len(gameMap))
randy = randrange(len(gameMap))
reveal(randx, randy, False)
return
preRevealed = revealed.copy()
revealed.append([x, y])
if gameMap[x][y] == "bomb":
textArray[x][y].set("?")
labelArray[x][y].configure(relief=FLAT, font=("Arial", 12), fg='red')
boom()
elif gameMap[x][y] != 0:
textArray[x][y].set(gameMap[x][y])
if gameMap[x][y] == 1:
labelArray[x][y].configure(fg="blue")
if gameMap[x][y] == 2:
labelArray[x][y].configure(fg="green")
if gameMap[x][y] == 3:
labelArray[x][y].configure(fg="red")
if gameMap[x][y] == 4:
labelArray[x][y].configure(fg="purple")
if gameMap[x][y] >= 5:
labelArray[x][y].configure(fg="orange")
labelArray[x][y].configure(relief=FLAT, font=("Arial", 12, "bold"))
if active:
if [x,y] not in preRevealed:
if gameMap[x][y] != "bomb":
if (x>0) and gameMap[x-1][y] != "bomb": reveal(x-1, y, False)
if (x<len(gameMap[x])-1) and gameMap[x+1][y] != "bomb": reveal(x+1, y, False)
if (y>0) and gameMap[x][y-1] != "bomb": reveal(x, y-1, False)
if (y<len(gameMap[x])-1) and gameMap[x][y+1] != "bomb": reveal(x, y+1, False)
if (y>0) and (x>0)and gameMap[x-1][y-1] != "bomb" and gameMap[x-1][y-1] != 0: reveal(x-1, y-1, False)
if (y<len(gameMap[x])-1) and (x>0)and gameMap[x-1][y+1] != "bomb" and gameMap[x-1][y+1] != 0: reveal(x-1, y+1, False)
if (y>0) and (x<len(gameMap[x])-1)and gameMap[x+1][y-1] != "bomb" and gameMap[x+1][y-1] != 0: reveal(x+1, y-1, False)
if (y<len(gameMap[x])-1) and (x<len(gameMap[x])-1)and gameMap[x+1][y+1] != "bomb" and gameMap[x-1][y+1] != 0: reveal(x+1, y+1, False)
else:
labelArray[x][y].configure(relief=FLAT)
textArray[x][y].set("")
if [x,y] not in preRevealed:
if gameMap[x][y] != "bomb":
if (x>0) and gameMap[x-1][y] != "bomb": reveal(x-1, y, True)
if (x<len(gameMap[x])-1) and gameMap[x+1][y] != "bomb": reveal(x+1, y, True)
if (y>0) and gameMap[x][y-1] != "bomb": reveal(x, y-1, True)
if (y<len(gameMap[x])-1) and gameMap[x][y+1] != "bomb": reveal(x, y+1, True)
if (y>0) and (x>0)and gameMap[x-1][y-1] != "bomb" and gameMap[x-1][y-1] != 0: reveal(x-1, y-1, True)
if (y<len(gameMap[x])-1) and (x>0)and gameMap[x-1][y+1] != "bomb" and gameMap[x-1][y+1] != 0: reveal(x-1, y+1, True)
if (y>0) and (x<len(gameMap[x])-1)and gameMap[x+1][y-1] != "bomb" and gameMap[x+1][y-1] != 0: reveal(x+1, y-1, True)
if (y<len(gameMap[x])-1) and (x<len(gameMap[x])-1)and gameMap[x+1][y+1] != "bomb" and gameMap[x-1][y+1] != 0: reveal(x+1, y+1, True)