【问题标题】:How to prevent turtle from moving in opposite direction如何防止乌龟向相反方向移动
【发布时间】:2021-07-26 02:21:00
【问题描述】:

代码:

import turtle
import random
import time

s = turtle.getscreen()
turtle.screensize(canvwidth=400, canvheight=400)
t = turtle.Turtle()
t.pensize(0)
t.shape('square')
t.color("black")
t.speed(0)
t.penup()

def moveu(num):
    t.setheading(num)
    t.forward(20)
    

s.onkey(lambda : moveu(90), 'w')
s.onkey(lambda : moveu(270), 's')
s.onkey(lambda : moveu(180), 'a')
s.onkey(lambda : moveu(0), 'd')
    
s.listen()

我还没有完成这个项目,但我遇到了一些问题。我想在turtle 模块中创建一个游戏。但我不知道如何防止块向后移动。我见过其他人使用t.direction 或其他东西。但是我已经尝试过了,但它并没有真正起作用,也许我只是愚蠢并且我做错了什么。如何防止正方形向相反方向移动?

【问题讨论】:

  • 您是否打算使用turtle 模块制作蛇游戏? @red_pa​​nda

标签: python python-3.x turtle-graphics python-turtle


【解决方案1】:

您可以添加条件if (t.heading() + 180) % 360 != num:,意思是如果乌龟当前航向的相反方向不是传递给函数的数字方向,则继续:

import turtle
import random
import time

s = turtle.getscreen()
turtle.screensize(canvwidth=400, canvheight=400)
t = turtle.Turtle()
t.pensize(0)
t.shape('square')
t.color("black")
t.speed(0)
t.penup()

def moveu(num):
    if (t.heading() + 180) % 360 != num:
        t.setheading(num)
        t.forward(20)
    

s.onkey(lambda : moveu(90), 'w')
s.onkey(lambda : moveu(270), 's')
s.onkey(lambda : moveu(180), 'a')
s.onkey(lambda : moveu(0), 'd')
    
s.listen()
turtle.mainloop()

【讨论】:

    【解决方案2】:

    我不知道如何防止方块向后移动。

    事实上,你的方块只是在向前移动。如果您将块的形状从'square' 更改为'arrow',您会发现它始终朝着它所面对的方向移动。如果您希望以某种方式对其进行限制,我们需要更好地描述您想要或不想要的运动类型。

    经过一些小调整的简化版代码:

    from turtle import Screen, Turtle
    
    def moveu(angle):
        turtle.setheading(angle)
        turtle.forward(20)
    
    screen = Screen()
    screen.setup(400, 400)
    
    turtle = Turtle()
    turtle.shape('arrow')
    turtle.speed('fastest')
    turtle.penup()
    
    screen.onkey(lambda: moveu(90), 'w')
    screen.onkey(lambda: moveu(270), 's')
    screen.onkey(lambda: moveu(180), 'a')
    screen.onkey(lambda: moveu(0), 'd')
    
    screen.listen()
    screen.mainloop()
    

    【讨论】:

    • 不,这不起作用。当方向向上时,我仍然可以向下移动
    【解决方案3】:

    就像cdlane 在他们的answer 中所说,你的乌龟确实只会向前移动。然而,你总是要求它面向你想要的方向,然后让它向前移动。相反,你应该检查它的当前方向,并且只有当它不与当前方向相反时才允许它移动。

    这只需要对您的moveu() 函数稍作修改:

    def moveu(angle):
        current_heading = turtle.heading()
        if abs(angle - current_heading) != 180:
            turtle.setheading(angle)
            turtle.forward(20)
    

    现在,如果你先按w,然后按s,你的乌龟就不会向下移动。但是,如果你按w,然后按a,然后按s,你的乌龟会先向左移动,然后向下移动。

    这是一个演示:我修改了 cdlane 的演示,在画布底部添加了另一个海龟以打印状态消息 Code。我在moveu() 函数中添加了几行来打印按下了哪个键。

    【讨论】:

      【解决方案4】:

      解决方案

      所以,第一个问题是我在代码中没有看到turtle.mainloop()。这意味着它不会保持打开状态。所以,这是对代码的第一个添加。

      其次,使用简单的if 语句可能就是您的答案。它比你想象的要简单。

      但是,首先,让我们看看方向。

      
                   90
                    ↑
                    |
                    |
      180  ←---- 'turtle' ----→ 0
                    |
                    |
                    ↓
                   270
      
      

      我假设 180 度是您认为向后的方向。如果不是,只需在最终代码中换成您想要的角度即可。


      if 语句如下。我已经在你的 moveu 函数中展示了它。

      
      def moveu(num):
          if num != 180:
              t.setheading(num)
              t.forward(20)
      
      

      这意味着,如果角度不是180,它会移动。因此,它不会向后移动。


      最终代码

      
      import turtle
      import random
      import time
      
      s = turtle.getscreen()
      turtle.screensize(canvwidth=400, canvheight=400)
      t = turtle.Turtle()
      t.pensize(0)
      t.shape('square')
      t.color('black')
      t.speed(0)
      t.penup()
      
      def moveu(num):
          if num != 180:
              t.setheading(num)
              t.forward(20)
          
      
      s.onkey(lambda : moveu(90), 'w')
      s.onkey(lambda : moveu(270), 's')
      s.onkey(lambda : moveu(180), 'a')
      s.onkey(lambda : moveu(0), 'd')
          
      s.listen()
      s.mainloop()
      
      

      如您所见,我添加了turtle.mainloop()if 语句。

      【讨论】:

      • 这是错误的! OP 希望海龟无论面对什么方向都不会转回 180 度。您的代码不会这样做——它只会阻止海龟面向“西方”。 my answerAnn Zen's 涵盖了获得 OP 想要的方法
      • @PranavHosangadi 抱歉,如果您认为它不起作用,感谢您完成的任何编辑。不过好像已经被批准了。
      • 我很惊讶这被接受了,因为这不是 OP 所说的他们想要的,这从他们的其他 cmets 可以看出,例如this one
      • 我觉得这个是最简单最清楚的,你解释的很好。 @PranavHosangadi
      • @red_pa​​nda 这段代码没有做你需要做的事情——当方向向上时,你仍然可以向下移动它。此外,您永远不能向左转。
      最近更新 更多