代码之家  ›  专栏  ›  技术社区  ›  user8872

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

  •  0
  • user8872  · 技术社区  · 6 年前

    我试图让海龟在到达边界时停止移动,直到它改变方向。

    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 ,但它一直呆在那里,直到窗户撞坏。我试图想出多种解决方案,但我做不到。这里的主要问题是当海龟的ycor()小于 或等于 -230,它停了下来,但没有改变它的方向。

    当我更改main()时,当它的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)
    

    我这样做是为了好玩,我观看了使用处理编写蛇游戏的编码训练,并试图使用turtle模块在Python中重新创建它。是的,我是初学者。我想尝试使用turtle模块重新制作snake游戏,尽管我可以使用其他模块,如PyGame,因为我不熟悉PyGame。这个问题有什么解决方案吗?还是我不能使用海龟模块来完成这项工作?

    1 回复  |  直到 6 年前
        1
  •  0
  •   cdlane    6 年前

    我发现您的代码存在的主要问题是 while True: 在事件驱动的世界中没有一席之地。(因为它可以阻止事件!)我们将使用 ontimer() 事件。下一个问题是控制结构过于复杂。我们将扔掉大部分,只保留布尔值 shouldMove 用于控制。最后,你要混合 功能的 与turtle的接口 面向对象的 与turtle的接口。我们将更改 import 要仅允许面向对象接口,请执行以下操作:

    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()
    

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