如何防止乌龟向相反方向移动 最终代码

问题描述

代码

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 之类的。但我已经尝试过了,但它并没有真正奏效,也许我只是愚蠢而我做错了什么。如何防止方块向相反方向移动?

解决方法

您可以添加条件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()
,

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

事实上,你的区块只是向前。如果您将方块的形状从 '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()
,

就像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,然后按 as,您的海龟将先向左移动,然后向下移动。

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

enter image description here

,

解决方案

所以,第一个问题是我没有在代码中看到 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),'d')
    
s.listen()
s.mainloop()

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