Python Turtle - 无法将 turtle 限制在边界内

Python Turtle - Unable to restrict turtle within a border

我试图让一只乌龟在撞到边界时停止移动,直到它改变航向。

from turtle import *
import turtle
import time

user_speed = 46
border_pen = Turtle()
shouldMove = True
#alreadyStoppedDown = False
#alreadyStoppedUp = False
prev_heading = heading()

#Set up border
def setup(turt):
    turt.ht()
    turt.pu()
    turt.speed(0)
    turt.goto(-250,250)
    turt.pd()
    turt.begin_fill()
    for x in range(4):
        turt.fd(500)
        turt.rt(90)
    turt.color('black')
    turt.end_fill()

#Set up user
def user():
    pu()
    shape('square')
    shapesize(2)
    color('orange')
    speed(0)
    goto(-230,230)
    speed(1)

#Keybind functions
def down():
    global prev_heading
    prev_heading = heading()
    speed(0)
    setheading(-90)
    speed(1)
def up():
    global prev_heading
    prev_heading = heading()
    speed(0)
    setheading(90)
    speed(1)
def left():
    global prev_heading
    prev_heading = heading()
    speed(0)
    setheading(180)
    speed(1)
def right():
    global prev_heading
    prev_heading = heading()
    speed(0)
    setheading(0)
    speed(1)

#Border restriction
def restrict():
    global shouldMove
    if ycor() <= -230:
        shouldMove = False
        global prev_heading
        prev_heading = heading()

def main():
    global shouldMove
    while True:
        #Debugging
        print(shouldMove)
        print(heading(),prev_heading,ycor())

        if shouldMove:
            fd(user_speed)
            restrict()
        else:
            if heading() != prev_heading:
                shouldMove = True
            else:
                continue

setup(border_pen)
user()

onkey(up,'w')
onkey(down,'s')
onkey(left,'a')
onkey(right,'d')
listen()

main()

我只设置了边框底部的限制。

我可以让乌龟停止移动,但是当它停止移动时它不会改变航向。我尝试通过按 wasd 来更改它的航向,但它只是停留在那里直到 window 崩溃。我试图想出多种解决方案,但我做不到。这里的主要问题是当乌龟的 ycor() 小于 或等于 -230 时,它会停止但不会改变它的航向。

当我更改 main() 使其设置为 0 时,当 ycor() 小于 或等于 -230 时,它将向右移动一旦 ycor() 仍为 -230,它将停止移动。

def main():
    while True:
        #Debugging
        print(shouldMove)
        print(heading(),prev_heading,ycor())

        if shouldMove:
            fd(user_speed)
            restrict()
        else:
            if heading() != prev_heading:
                shouldMove = True
            else:
                setheading(0)

我这样做是为了好玩,我观看了 The Coding Train 使用 processing 编写蛇游戏代码,我正尝试使用 turtle 模块在 Python 中重新创建它。是的,我是初学者。我想尝试使用 turtle 模块重新制作贪吃蛇游戏,尽管我可以使用其他模块,例如 PyGame,因为我不熟悉 PyGame。这个问题有什么解决办法吗?还是我无法使用 turtle 模块执行此操作?

我在您的代码中看到的主要问题是 while True:,它在事件驱动的世界中没有立足之地。 (因为它可以阻止事件!)我们将改用 ontimer() 事件。下一个问题是控制结构太复杂了。我们将扔掉大部分,只保留布尔值 shouldMove 进行控制。最后,您将 functional 接口与 turtle 的 object-oriented 接口混合在一起。我们将更改 import 以仅允许 object-oriented 接口:

from turtle import Turtle, Screen

USER_SPEED = 20

WIDTH = 500
CURSOR_SIZE = 20
CURSOR_MULTIPLIER = 2
MINIMUM = ((CURSOR_SIZE * CURSOR_MULTIPLIER) / 2) - WIDTH / 2
MAXIMUM = WIDTH / 2 - ((CURSOR_SIZE * CURSOR_MULTIPLIER) / 2)

# Set up border
def setup(turtle):
    turtle.penup()
    turtle.speed('fastest')
    turtle.goto(-WIDTH / 2, WIDTH / 2)
    turtle.pendown()

    turtle.begin_fill()
    for _ in range(4):
        turtle.forward(WIDTH)
        turtle.right(90)
    turtle.end_fill()

# Set up user
def user(turtle):
    turtle.penup()
    turtle.shapesize(CURSOR_MULTIPLIER)
    turtle.color('orange')
    turtle.speed('fastest')

# Keybind functions
def down():
    global shouldMove

    if user_pen.heading() != 270:
        user_pen.setheading(270)
        shouldMove = True

def up():
    global shouldMove

    if user_pen.heading() != 90:
        user_pen.setheading(90)
        shouldMove = True

def left():
    global shouldMove

    if user_pen.heading() != 180:
        user_pen.setheading(180)
        shouldMove = True

def right():
    global shouldMove

    if user_pen.heading() != 0:
        user_pen.setheading(0)
        shouldMove = True

# Border restriction

def move():
    global shouldMove

    if shouldMove:
        user_pen.forward(USER_SPEED)

        if not(MINIMUM <= user_pen.ycor() <= MAXIMUM and MINIMUM <= user_pen.xcor() <= MAXIMUM):
            user_pen.undo()
            shouldMove = False

    screen.ontimer(move, 25)

screen = Screen()

border_pen = Turtle(visible=False)
user_pen = Turtle('square')

setup(border_pen)
user(user_pen)

screen.onkey(up, 'w')
screen.onkey(down, 's')
screen.onkey(left, 'a')
screen.onkey(right, 'd')
screen.listen()

shouldMove = True

move()

screen.mainloop()

这应该像您描述的那样。乌龟会一直直线移动,直到你按下方向键或它停在边界处。