几秒钟后,一只海龟停了下来,另一只走了

2024-04-28 22:51:25 发布

您现在位置:Python中文网/ 问答频道 /正文

经过几周的尝试,我还没有找到解决这个问题的办法,一只乌龟完全停了下来,另一只乌龟则快了2-3倍。我怎样才能解决这个问题?你必须把他们两个都移动一点,才能遇到问题。网站上还有:复制你知道吗

我尝试过移动wn.listen()命令,但只切换了哪个海龟停止了,哪个没有。我尝试过将forward()命令切换到goto()失败,我尝试过使用特定于方向的移动(也没有成功):

import turtle
import sys
player1 = turtle.Turtle()
player1.up()
player1.goto(0,350)
player1.right(90)
player1.down()
player2 = turtle.Turtle()
wn = turtle.Screen()

#preGame setup
player2.up()
player2.goto(0,-350)
player2.left(90)
player2.down()
player2.color("blue")
player1.color("red")
#main game loop
player1.speed(0)
player2.speed(0)
k = 0

def kr():
  player1.left(90)
def kl():
  player1.right(90)
wn.onkey(kr, "d")
wn.onkey(kl, "a")
def k1():
  player2.right(90)
def k2(): 
  player2.left(90)   
wn.onkey(k1, "k")
wn.onkey(k2, "l")

wn.listen()

while True:
  player1.forward(1)
  player2.forward(1)
  while player1.xcor() < (-350) or player1.xcor() > (350) or player1.ycor() > (350) or  player1.ycor() < (-350):
   player1.back(30)
  while player2.xcor() < (-350) or player2.xcor() > (350) or player2.ycor() > (350) or player2.ycor() < (-350):
   player2.back(30)
   if player1.pos() == player2.pos():
     print ("DONT CRASH INTO THE OTHER PLAYER")
     sys.exit()

我原以为它们都会无限期地继续移动,但一个总是停下来,另一个的速度是原来的两倍。你知道吗


Tags: orrightdefleftlistenforwardturtlewhile
2条回答

将keyListener移到你的循环外-将它们放在while循环内将重新附加它们,并始终重新定义函数,从而使你感到困惑。你知道吗

您需要设置它们一次而不是每隔几毫秒:

import turtle
player1 = turtle.Turtle()
player2 = turtle.Turtle()
player1.goto(350, 0)
player2.goto(-350, 0)
player1.right(180)
wn = turtle.Screen()
def kl():
    player1.left(90)
def kr():
    player1.right(90)
def k1():
    player2.right(90)
def k2():
    player2.left(90)
wn.onkey(kl, "d")  # changed to lowercase
wn.onkey(kr, "a")
wn.onkey(k1, "j")  # changed to other letters
wn.onkey(k2, "l")

wn.listen()

while True: # not changing k so just use while True
    player1.forward(1)  # changed speed
    player2.forward(1)

嵌套的while循环结构对您不利,并且对于像turtle这样的事件驱动环境无效。以下是您的程序的重做,以修复此问题并清理代码:

from turtle import Screen, Turtle
import sys

# preGame setup

player1 = Turtle()
player1.hideturtle()
player1.up()
player1.goto(0, 350)
player1.down()
player1.right(90)
player1.color('red')
player1.speed('fastest')
player1.showturtle()

def r1():
    player1.left(90)

def l1():
    player1.right(90)

player2 = Turtle()
player2.hideturtle()
player2.up()
player2.goto(0, -350)
player2.down()
player2.left(90)
player2.color('blue')
player2.speed('fastest')
player2.showturtle()

def r2():
    player2.right(90)

def l2():
    player2.left(90)

# main game loop

def move():
    player1.forward(5)

    if not (-350 < player1.xcor() < 350 and -350 < player1.ycor() < 350):
        player1.backward(30)

    player2.forward(5)

    if not (-350 < player2.xcor() < 350 and -350 < player2.ycor() < 350):
        player2.backward(30)

    if player1.distance(player2) < 5:
        print("DON'T CRASH INTO THE OTHER PLAYER!")
        sys.exit()

    screen.ontimer(move, 100)

screen = Screen()

screen.onkey(r1, 'd')
screen.onkey(l1, 'a')
screen.onkey(r2, 'k')
screen.onkey(l2, 'l')

screen.listen()

move()

screen.mainloop()

看看这是否更符合你的期望/愿望。你知道吗

相关问题 更多 >