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()
这应该像您描述的那样。乌龟会一直直线移动,直到你按下方向键或它停在边界处。
我试图让一只乌龟在撞到边界时停止移动,直到它改变航向。
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()
这应该像您描述的那样。乌龟会一直直线移动,直到你按下方向键或它停在边界处。