如何防止海龟向相反方向移动

2024-05-23 18:56:18 发布

您现在位置:Python中文网/ 问答频道 /正文

代码:

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之类的东西。但我试过了,但没有真正起作用,也许我只是愚蠢,我做错了什么。如何防止正方形向相反方向移动


Tags: lambda代码importtimerandomnumturtleonkey
3条回答

I don't know how to prevent the block from moving backward.

实际上,您的块只向前移动。如果将块的形状从'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()

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

就像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()函数中添加了几行来打印按下的键

enter image description here

相关问题 更多 >