【问题标题】:Alternating between onscreenclick within loop - Python在循环内的onscreenclick之间交替 - Python
【发布时间】:2021-07-07 13:49:49
【问题描述】:

我正在尝试使用海龟图形在 Python 中创建一个简单的井字游戏,但在圆圈和十字之间交替时遇到了一些麻烦。这是我当前代码中的部分:

drawBoard()

tracker = True
count = 0
while count < 9:
    if tracker:
        turtle.onscreenclick(position_circle)       
        print(1)
        tracker = False
    elif not tracker:
        turtle.onscreenclick(position_cross)       
        print(2)
        tracker = True
    count += 1

turtle.done()

每当我运行代码时,乌龟总是输出圆圈。我添加了一个打印语句,让我知道它是否是交替的,这是输出:

1
2
1
2
1
2
1
2
1

我不知道如何“暂停”循环以实际绘制圆圈或十字。任何帮助将不胜感激!

【问题讨论】:

    标签: python turtle-graphics


    【解决方案1】:

    我认为您可以通过将 explicit 循环转换为 implicit 循环来解决此问题:

    import turtle
    
    # ... your existing code here
    
    count = 0
    
    def position_circle(x, y):
        global count
    
        turtle.onscreenclick(None)  # disable this handler
    
        # ... your existing code here
    
        drawBoard()
        count += 1
    
        if count < 9:
            turtle.onscreenclick(position_cross)  # next handler
    
    def position_cross(x, y):
        global count
    
        turtle.onscreenclick(None)  # disable this handler
    
        # ... your existing code here
    
        drawBoard()
        count += 1
    
        if count < 9:
            turtle.onscreenclick(position_circle)  # next handler
    
    # ... your existing code here
    
    turtle.onscreenclick(position_circle)
    
    turtle.done()
    

    每个onscreenclick() 处理程序轮流交替切换到另一个处理程序,最终在板已填满时关闭屏幕点击。我们通过设置其中一个处理程序来开始游戏。

    无论你做什么,都不要添加对sleep()的调用,因为这会进一步扰乱海龟事件模型。

    【讨论】:

    • 您好,非常感谢您的回答,效果很好!我不确定禁用处理程序的目的。你能解释一下吗?
    • @TechRooster,如果您不禁用处理程序,则可能会在您仍在处理前一次单击时出现新的单击。这既会使您的代码处于混乱状态,又可能看起来像递归。
    【解决方案2】:

    好的,很好的问题。我不完全确定,但如果你想暂停循环,你需要制定一个 sleep() 函数。这将在括号中输入的给定时间暂停循环。下面的例子:

    import time
    
    print("Printed immediately.")
    time.sleep(2.4)
    print("Printed after 2.4 seconds.")
    

    如果您想完全结束循环,您应该输入“break 语句”。如下图:

    >>> for n in range(2, 10):
    ...     for x in range(2, n):
    ...         if n % x == 0:
    ...             print(n, 'equals', x, '*', n//x)
    ...             break
    ...     else:
    ...         # loop fell through without finding a factor
    ...         print(n, 'is a prime number')
    

    无论如何...我希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2019-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多