<p>您可以使用画布项目作为移动的目标,而无需销毁和重新创建它。在下面的例子中,目标是一个圆,因此我可以通过测量与目标的距离,并将其与目标的半径进行比较,来确定命中是否成功。(您还可以使用其他<code>tk.canvas</code>方法来判断您的单击是否在某个项目上)。你知道吗</p>
<p>tkinter有一些特殊的变量<code>tk.IntVar</code>,您可以将这些变量与标签一起使用,以保持点击次数的计数并显示它。这消除了对丑陋的<code>global</code>声明的需要。你知道吗</p>
<p>不建议使用<code>time.sleep</code>和<code>canvas.update</code>;您可以使用<code>mainloop</code>来管理游戏的逻辑。你知道吗</p>
<p>作为游戏的一个扩展,你可以减少目标的大小,减少静止时间,因为猎人积累了成功的命中率(我把这个留给你去实现)</p>
<pre><code>import tkinter as tk
import random
WIDTH, HEIGHT = 600, 600
TARGET_RADIUS = 10
def is_target_hit(x, y):
x0, y0, x1, y1 = canvas.coords(target)
xc, yc = (x0 + x1) / 2, (y0 + y1) / 2
return ((x - xc)**2 + (y - yc)**2)**0.5 < TARGET_RADIUS
def hitcounter(event):
hits.set(hits.get() + 1)
if is_target_hit(event.x, event.y):
hits_on_target.set(hits_on_target.get() + 1)
def get_random_coords():
x = random.randrange(TARGET_RADIUS, WIDTH-TARGET_RADIUS)
y = random.randrange(TARGET_RADIUS, HEIGHT-TARGET_RADIUS)
return x-TARGET_RADIUS, y-TARGET_RADIUS, x+TARGET_RADIUS, y+TARGET_RADIUS
def spawntarget():
canvas.coords(target, *get_random_coords())
canvas.after(1000, spawntarget)
root = tk.Tk()
hits, hits_on_target = tk.IntVar(root), tk.IntVar(root)
hits.set(0), hits_on_target.set(0)
tk.Label(root, text='hits:').pack()
hits_label = tk.Label(root, textvariable=hits)
hits_label.pack()
tk.Label(root, text='hits_on_target:').pack()
hits_on_target_label = tk.Label(root, textvariable=hits_on_target)
hits_on_target_label.pack()
canvas = tk.Canvas(root, width=WIDTH, height=HEIGHT)
canvas.pack(expand=True, fill=tk.BOTH)
target = canvas.create_oval(*get_random_coords(), fill='red')
canvas.bind('<1>', hitcounter)
spawntarget()
root.mainloop()
</code></pre>