【问题标题】:How to make a turtle draw above another one?如何让乌龟画在另一只乌龟之上?
【发布时间】:2022-01-04 23:44:20
【问题描述】:

我正在制作一个项目,其中有一只乌龟画一条黑线,但紧随其后的是另一只海龟画一条白线。我希望这条白线覆盖黑线以“擦除”黑线,但黑线仍位于白线上方。

我正在 trinket.io 上编程

这是我的代码:

import turtle 

#create elements
pen = turtle.Turtle()
follow = turtle.Turtle()
screen = turtle.Screen()


#create variables
positions = [0,-180,0,-180,0,-180,0,-180,0,-180,0,-180,0,-180,0,-180,0,-180,0,-180]


#moving functions
def move_left():
  if pen.xcor() > -180:
    pen.goto(pen.xcor()-10,pen.ycor())
def move_right():
  if pen.xcor() < 180:
    pen.goto(pen.xcor()+10,pen.ycor())
def move_up():
  if pen.ycor() < 180:
    pen.goto(pen.xcor(),pen.ycor()+10)
def move_down():
  if pen.ycor() > -180:
    pen.goto(pen.xcor(),pen.ycor()-10)


#pen setup
pen.speed(1000)
pen.penup()
pen.goto(0,-180)
pen.left(90)
pen.pendown()

follow.left(90)
follow.color("#FFFFF1")
follow.width(50)


#adjust frame refresh settings
pen.tracer(0,0)
rate = 0
refresh = 0


#game functionality
def game():
  screen.onkey(move_left, 'left')
  screen.onkey(move_right, 'right')
  screen.onkey(move_up, 'up')
  screen.onkey(move_down, 'down')
  follow.goto(positions[0],positions[1])
  positions.append(pen.xcor())
  positions.append(pen.ycor())
  positions.pop(0)
  positions.pop(0)


#wait for keys
screen.listen()


#loop
while True:
  game()
  if refresh < rate:
    refresh = refresh + 1
  else:
    pen.update()
    #print(positions)
    refresh = 0

如何修复我的程序?

【问题讨论】:

    标签: python drawing turtle-graphics python-turtle


    【解决方案1】:

    您只需要调用每个screen.onkey() 实例一次,在循环中(间接)调用它们不会获得任何收益。另外,不清楚为什么positions 被预初始化为十个位置。

    我猜你想要一只留下足迹的海龟,但这条足迹的长度有限,并且随着新足迹的铺设,它的末端会消失。根据您的描述,您希望它在 trinket.io turtle 中工作,这意味着我们不能使用像 stamps 这样的功能来使这个更干净。

    下面是我在 trinket.io 上测试过的对您的代码的修改,它留下了 20 个线段。最旧的线段随着新线段的铺设而消失:

    from turtle import Screen, Turtle
    
    NUMBER_SEGMENTS = 20
    
    # moving functions
    def truncate():
        if len(positions) >= NUMBER_SEGMENTS:
            follower.setposition(positions.pop(0))
    
        screen.update()
    
    def move_left():
        pen.setheading(180)
    
        if pen.xcor() > -180:
            pen.forward(10)
            positions.append(pen.position())
    
        truncate()
    
    def move_right():
        pen.setheading(0)
    
        if pen.xcor() < 180:
            pen.forward(10)
            positions.append(pen.position())
    
        truncate()
    
    def move_up():
        pen.setheading(90)
    
        if pen.ycor() < 180:
            pen.forward(10)
            positions.append(pen.position())
    
        truncate()
    
    def move_down():
        pen.setheading(270)
    
        if pen.ycor() > -180:
            pen.forward(10)
            positions.append(pen.position())
    
        truncate()
    
    # create elements
    screen = Screen()
    
    # adjust frame refresh settings
    screen.tracer(0)
    
    refresh = 0
    
    # pen setup
    pen = Turtle()
    pen.speed('fastest')
    pen.penup()
    pen.sety(-180)
    pen.setheading(90)
    pen.pendown()
    
    follower = pen.clone()
    follower.hideturtle()
    follower.width(3)
    follower.color('#F9F9F9')
    
    # create variables
    positions = []
    
    # wait for keys
    screen.onkey(move_left, 'Left')
    screen.onkey(move_right, 'Right')
    screen.onkey(move_up, 'Up')
    screen.onkey(move_down, 'Down')
    screen.listen()
    screen.update()
    screen.mainloop()
    

    不完美,但 trinket.io 有点束缚我们的爪子。这大致是您想要做的吗?

    【讨论】:

    • 是的,谢谢,这很有帮助!我有点沮丧,但这个解决方案效果很好,非常感谢!
    猜你喜欢
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多