Python 几秒钟后,一只乌龟停下来,另一只走得更快

Python 几秒钟后,一只乌龟停下来,另一只走得更快,python,python-3.x,turtle-graphics,Python,Python 3.x,Turtle Graphics,经过几周的尝试,我还没有找到解决这个问题的办法,一只乌龟完全停下来,另一只乌龟的速度快了2-3倍。我怎样才能解决这个问题?你必须把他们两个都移动一点,才能遇到这个问题。这也在网站上:repl.it 我尝试过移动wn.listen()命令,但只切换了哪个海龟停止了,哪个没有。我尝试将forward()命令切换到goto()失败,并且尝试使用特定方向的移动(也失败): 导入海龟 导入系统 player1=海龟。海龟() player1.up() 玩家1.转到(0350) 玩家1.右(90) 播放者1

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

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

导入海龟
导入系统
player1=海龟。海龟()
player1.up()
玩家1.转到(0350)
玩家1.右(90)
播放者1.向下()
player2=海龟。海龟()
wn=tutle.Screen()
#赛前设置
player2.up()
玩家2。转到(0,-350)
播放者2.左(90)
播放者2.向下()
播放者2.颜色(“蓝色”)
播放者1.颜色(“红色”)
#主游戏循环
播放器1.速度(0)
播放机2.速度(0)
k=0
def kr():
播放者1.左(90)
def kl():
玩家1.右(90)
wn.onkey(kr,“d”)
wn.onkey(吉隆坡,“a”)
def k1():
玩家2.右(90)
def k2():
播放者2.左(90)
wn.onkey(k1,“k”)
wn.onkey(k2,“l”)
听着
尽管如此:
球员1.前锋(1)
球员2.前锋(1)
当player1.xcor()<(-350)或player1.xcor()>(350)或player1.ycor()>(350)或player1.ycor()<(-350)时:
球员1.后卫(30)
当player2.xcor()<(-350)或player2.xcor()>(350)或player2.ycor()>(350)或player2.ycor()<(-350)时:
球员2.后卫(30)
如果player1.pos()==player2.pos():
打印(“不要撞到其他玩家”)
sys.exit()

我希望它们都会无限期地继续移动,但其中一个总是停止,另一个则以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()
从海龟导入屏幕,海龟
导入系统
#赛前设置
player1=海龟()
player1.hideturtle()
player1.up()
玩家1。转到(0350)
播放者1.向下()
玩家1.右(90)
播放器1.颜色(“红色”)
玩家1.速度(“最快”)
player1.showturtle()
def r1():
播放者1.左(90)
def l1():
玩家1.右(90)
player2=海龟()
player2.hideturtle()
player2.up()
玩家2。转到(0,-350)
播放者2.向下()
播放者2.左(90)
播放器2.颜色(“蓝色”)
玩家2.速度(“最快”)
player2.showturtle()
def r2():
玩家2.右(90)
def l2():
播放者2.左(90)
#主游戏循环
def move():
球员1.前锋(5)
如果不是(-350

看看这是否更符合您的期望/愿望。

我已将代码更改为一个我有问题的代码,希望它能成功difference@xu我不知道你在尝试什么。但是,最后的逻辑是有缺陷的:
如果player1.xcor()<(-350)
您不应该再往回走,而应该向前走。否则你会变得更消极。前后取决于海龟看的方向——最好将其位置设置为绝对位置:如果<350,则将其设置为350;如果>350,则将其设置为350。
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()