首页 > 解决方案 > 使用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()

标签: pythonturtle-graphicspython-turtle

解决方案


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

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

在此处输入图像描述


推荐阅读