微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用ontimer函数让两只乌龟同时移动

如何解决使用ontimer函数让两只乌龟同时移动

我一直在努力让两只海龟同时移动。要么一个动作要么都被冻结。我目前正在使用 ontimer() 函数,但仍然没有完全理解它。 游戏是如果你想知道基于 paperio 游戏但是两个玩家在同一个键盘和屏幕上互相对抗 我的代码

from turtle import *
import turtle

p1f = True
p2f = True
title("1v1 Paperio")
p1move = Turtle()
p2move = Turtle()
t1 = Turtle()
t2 = Turtle()
screen = Screen()


def Setup1():
    t1.pencolor("aquamarine")
    t1.pensize(5)
    t1.speed(10)
    t1.fillcolor("light sea green")
    t1.hideturtle()
    t1.penup()
    t1.goto(-200,-200)
    t1.pendown()
    t1.begin_fill()
    for i in range(4):
        t1.forward(50)
        t1.left(90)
    t1.end_fill()
    p1move.penup()
    p1move.goto(-175,-175)
    p1move.pendown()


def Setup2():
    t2.pencolor("crimson")
    t2.pensize(5)
    t2.speed(10)
    t2.fillcolor("red")
    t2.hideturtle()
    t2.penup()
    t2.goto(200,200)
    t2.pendown()
    t2.begin_fill()
    for i in range(4):
        t2.forward(50)
        t2.left(90)
    t2.end_fill()
    p2move.penup()
    p2move.goto(225,225)
    p2move.pendown()


def p1setup():
    p1move.pencolor("aquamarine")
    p1move.pensize(5)
    p1move.speed(10)
    p1move.fillcolor("light sea green")


def p2setup():
    p2move.pencolor("crimson")
    p2move.pensize(5)
    p2move.speed(10)
    p2move.fillcolor("red")


# ycord
# heading
def p1moving():
    def p1k1():
        p1x1 = p1move.xcor()
        p1y1 = p1move.ycor()
        while p1f == True:
            p1move.forward(1)
            screen.ontimer(p1moving,1)

    def p1k2():
        p1move.left(90)

    def p1k3():
        p1move.right(90)





def p2moving():
    def p2k1():
        p2f = True
        p2x2 = p2move.xcor()
        p2y2 = p2move.ycor()
        while p2f == True:
            p2move.forward(1)
            screen.ontimer(p2moving,1)

    def p2k2():
        p2move.left(90)

    def p2k3():
        p2move.right(90)

screen.listen()
screen.onkey(p1k1,"w")
screen.onkey(p1k2,"a")
screen.onkey(p1k3,"d")
screen.onkey(p2k1,"Up")
screen.onkey(p2k2,"Left")
screen.onkey(p2k3,"Right")



if __name__ == "__main__":
    Setup1()
    Setup2()
    p1setup()
    p2setup()

    screen.mainloop()

解决方法

在您使用键和计时器事件函数之前,您的大部分代码似乎都是合理的——您有未使用的变量和不会被调用的函数。您在函数内部定义的函数尤其有问题。我已经重新编写了下面的代码以按照您的描述运行。我还做了一些速度优化,让它“玩”得更好:

from turtle import Screen,Turtle

def setup1():
    base1.hideturtle()
    base1.color("light sea green","aquamarine")
    base1.pensize(5)

    base1.penup()
    base1.goto(-200,-200)
    base1.pendown()

    base1.begin_fill()

    for _ in range(4):
        base1.forward(50)
        base1.left(90)

    base1.end_fill()

    pen1.color("light sea green","aquamarine")
    pen1.pensize(5)
    pen1.setheading(0)

    pen1.penup()
    pen1.goto(-175,-175)
    pen1.pendown()

def setup2():
    base2.hideturtle()
    base2.color("red","pink")
    base2.pensize(5)

    base2.penup()
    base2.goto(200,200)
    base2.pendown()

    base2.begin_fill()

    for _ in range(4):
        base2.forward(50)
        base2.left(90)

    base2.end_fill()

    pen2.color("red","pink")
    pen2.pensize(5)
    pen2.setheading(180)

    pen2.penup()
    pen2.goto(225,225)
    pen2.pendown()

def p1k1():
    screen.onkey(None,'w')

    def p1forward():
        pen1.forward(1)
        screen.update()
        screen.ontimer(p1forward,10)

    p1forward()

def p1k2():
    pen1.left(90)
    screen.update()

def p1k3():
    pen1.right(90)
    screen.update()

def p2k1():
    screen.onkey(None,'Up')

    def p2forward():
        pen2.forward(1)
        screen.update()
        screen.ontimer(p2forward,10)

    p2forward()

def p2k2():
    pen2.left(90)
    screen.update()

def p2k3():
    pen2.right(90)
    screen.update()

screen = Screen()
screen.title("1v1 Paperio")
screen.tracer(False)

base1 = Turtle()
pen1 = Turtle()
setup1()

base2 = Turtle()
pen2 = Turtle()
setup2()

screen.onkey(p1k1,'w')
screen.onkey(p1k2,'a')
screen.onkey(p1k3,'d')

screen.onkey(p2k1,'Up')
screen.onkey(p2k2,'Left')
screen.onkey(p2k3,'Right')

screen.update()
screen.listen()
screen.mainloop()

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。