python - 当按一个键将 turtle 向上移动时,我的其他 turtle 卡住了

标签 python python-3.x turtle-graphics flappy-bird-clone

当我运行代码并用空格键向上移动 turtle 时,所有应该移动的障碍物都停止移动。是什么导致了这个问题以及如何解决这个问题?

我不知道什么会导致这个问题,我尝试过谷歌搜索但找不到任何东西。由于这是我尝试 Python 或一般编程的第一周,我不知道我做错了什么。

import turtle
import math
import random
#starting conditions
player = turtle.Turtle()
player.hideturtle()
player.penup()
player.shape("turtle")
player.setheading(90)
player.setpos(-200,0)
player.speed(1)
player.color("yellow")
canvas = turtle.Screen()
canvas.bgcolor("black")
canvas.title("gamescreen")
gameover = turtle.Turtle()
gameover.penup()
gameover.hideturtle()
gameover.color("red")
gameover.speed(0)
gameover.setpos(-150, 330)
scoreboard = turtle.Turtle()
scoreboard.hideturtle()
scoreboard.color("blue")
scoreboard.penup()
scoreboard.setpos(-300,320)
#borders
box = turtle.Turtle()
box.speed(0)
box.hideturtle()
box.setheading(0)
box.color("blue")
box.pensize(3)
box.penup()
box.setpos(-300,-300)
for i in range(4):
    box.pendown()
    box.forward(600)
    box.left(90)
player.showturtle()
#movement
spd = 50
def playerup():
    player.sety(player.ycor()+ spd)
    if (player.ycor()+ spd) > 287:
        player.speed(0)
        player.sety(287)
        player.speed(1)
def playerdown():
    player.sety(player.ycor()- spd)
    if (player.ycor()+ spd) < -287:
        player.speed(0)
        player.sety(-287)
        player.speed(1)
turtle.listen()
gravity = 3
obsspd = 3
#collision
def hit(t1, t2):
              xdistance = t1.xcor()-t2.xcor()
              ydistance = t1.ycor()-t2.ycor()
              if (abs(xdistance) < 20) and (abs(ydistance) < 130):
               return True

              else:
                  return False


#obstacle list
number_obstacles = 2
obstacles = []
numberslistx = list(range(-100,280))
numberslisty = list(range(143,190))  

for i in range(number_obstacles):
    obstacles.append(turtle.Turtle())
for obstacle in obstacles:
    obstacle.hideturtle()
    obstacle.speed(0)
    obstacle.color("green")
    obstacle.penup()
    obstacle.shape("square")
    obstacle.turtlesize(12,3)
    xobs = random.choice(numberslistx)
    yobs = random.choice(numberslisty)
    obstacle.setposition(xobs,yobs)
    obstacle.showturtle()
#obstacle2 list
number_obstacles2 = 2
obstacles2 = []
numberslistx = list(range(-100,280))
numberslisty = list(range(160,190))           
for i in range (number_obstacles2):
    obstacles2.append(turtle.Turtle())
for obstacle2 in obstacles2:
    obstacle2.hideturtle()
    obstacle2.speed(0)
    obstacle2.color("green")
    obstacle2.penup()
    obstacle2.shape("square")
    xobs = random.choice(numberslistx)
    yobs = random.choice(numberslisty)
    obstacle2.turtlesize(12,3)
    obstacle2.setposition(xobs,-yobs)
    obstacle2.showturtle()
    if(obstacle.xcor()-obstacle2.xcor())> 10:
        obstacle.setposition(xobs,yobs)
        obstacle2.setposition(xobs,-yobs)


#border
def fall():
    if (player.ycor()< -300):
        return True
def ceiling():
    if (player.ycor() > 300):
        return True
colors = ["red", "green","yellow","blue","purple","pink"]
points = 1
while True:
    player.sety(player.ycor()-gravity)
    xresetpos = random.choice(range(230,300))
    yresetpos = random.choice(range(140,190))

    for obstacle in obstacles:
        obstacle.setx(obstacle.xcor()-obsspd)
        if (obstacle.xcor()-obsspd) < -270:
            obstacle.hideturtle()
            obstacle.setx(xresetpos)
            obstacle.sety(yresetpos)
            obstacle.showturtle()
            obsspd+=1
            points += 1
            display = points
            scoreboard.clear()
            scoreboard.write(display)
            player.color(random.choice(colors))
            obstacle.color(random.choice(colors))


    for obstacle2 in obstacles2:
        obstacle2.setx(obstacle2.xcor()-(obsspd))
        if (obstacle2.xcor()-obsspd) < -270:
            obstacle2.hideturtle()                   
            obstacle2.setx(xresetpos)
            obstacle2.sety(-(int(yresetpos))-15)
            obstacle2.showturtle()
            player.color(random.choice(colors))
            obstacle2.color(random.choice(colors))
        if hit(player, obstacle):
            player.hideturtle()
            player.setpos(400,0)
            gameover.color("red")
            gameover.setpos(-150,-20)
            gameover.write("Game over",False,"left",("Arial",50,))
            gameover.setpos(-160,-200)
            gameover.write("Press x to play again",False,"left",("Arial",30,))
            break
        if hit(player, obstacle2):
            player.hideturtle()
            player.setpos(400,0)
            gameover.setpos(-150,-20)
            gameover.write("Game over",False,"left",("Arial",50,))
            gameover.setpos(-160,-200)
            gameover.write("Press x to play again",False,"left",("Arial",30,))
            break

    if fall():
        player.hideturtle()
        player.setpos(400,0)
        gameover.setpos(-150,-20)
        gameover.write("Game over",False,"left",("Arial",50,))
        gameover.setpos(-160,-200)
        gameover.write("Press x to play again",False,"left",("Arial",30,))
        break
    if ceiling():
        player.setycor(280)
    #if score(player,obstacle1):
     #   points += 1
     #   display = points
     #   scoreboard.clear()
      #  scoreboard.write(display)
    turtle.onkeypress(playerup, "space")
    #turtle.onkeypress(playerdown, "Down")
    #if player.xcor() is obstacle1.xcor():
     #   points += 1
     #   scoreboard.clear()
      #  scoreboard.write(points)

#balken stoppen niet als jij beweegt

最佳答案

一个问题是,您的水平运动由 while True: 循环控制(不同步),但垂直运动由键盘事件控制(同步)。我们需要通过用 ontimer() 事件替换 while True: 来使用事件使两个 Action 同步。以下是我对您的代码的完整修改,并出于示例目的进行了一些简化:

from turtle import Screen, Turtle
from random import choice, randrange

COLORS = ["red", "green", "yellow", "blue", "purple", "pink"]

PLAYER_SPEED = 50

GRAVITY = 3

NUMBER_OBSTACLES_UPPER = 2
NUMBER_OBSTACLES_LOWER = 2

# movement
def playerup():
    screen.onkeypress(None, 'space')  # disable handler inside handler

    player.sety(player.ycor() + PLAYER_SPEED)

    if player.ycor() > 287:
        player.speed('fastest')
        player.sety(287)
        player.speed('slowest')

    screen.onkeypress(playerup, 'space')

# collision
def hit(t1, t2):
    xdistance = abs(t1.xcor() - t2.xcor())

    if xdistance >= 20:
        return False

    ydistance = abs(t1.ycor() - t2.ycor())

    return ydistance < 130

# border
def fall():
    return player.ycor() < -300

def ceiling():
    return player.ycor() > 300

# main program loop
def move():
    global points, obstacle_speed_upper, obstacle_speed_lower

    player.sety(player.ycor() - GRAVITY)

    for obstacle in obstacles_upper:
        obstacle.setx(obstacle.xcor() - obstacle_speed_upper)

        if obstacle.xcor() < -270:
            obstacle.hideturtle()
            obstacle.setposition(randrange(230, 300), randrange(140, 190))
            obstacle.showturtle()
            obstacle_speed_upper += 1

            points += 1
            scoreboard.clear()
            scoreboard.write(points, font=('Arial', 30,))

        if hit(player, obstacle):
            player.hideturtle()
            gameover.write("Game Over", align='center', font=('Arial', 50,))
            return

    for obstacle in obstacles_lower:
        obstacle.setx(obstacle.xcor() - obstacle_speed_lower)

        if obstacle.xcor() < -270:
            obstacle.hideturtle()
            obstacle.setposition(randrange(230, 300), - randrange(160, 190))
            obstacle.showturtle()
            obstacle_speed_lower += 1

            points += 1
            scoreboard.clear()
            scoreboard.write(points, font=('Arial', 30,))

        if hit(player, obstacle):
            player.hideturtle()
            gameover.write("Game Over", align='center', font=('Arial', 50,))
            return

    if ceiling() or fall():
        player.hideturtle()
        gameover.write("Game Over", align='center', font=('Arial', 50,))
        return

    screen.ontimer(move, 100)

# starting conditions
screen = Screen()
screen.setup(750, 750)
screen.bgcolor('black')
screen.title("Game Screen")

# borders
box = Turtle()
box.hideturtle()
box.color('blue')
box.speed('fastest')
box.pensize(3)

box.penup()
box.setpos(-300, -300)
box.pendown()

for _ in range(4):
    box.forward(600)
    box.left(90)

gameover = Turtle()
gameover.hideturtle()
gameover.color('red')
gameover.penup()
gameover.sety(-25)

points = 0

scoreboard = Turtle()
scoreboard.hideturtle()
scoreboard.color('blue')
scoreboard.penup()
scoreboard.setpos(-300, 320)
scoreboard.write(points, font=('Arial', 30,))

player = Turtle()
player.hideturtle()
player.shape('turtle')
player.speed('slowest')
player.color('yellow')
player.setheading(90)
player.penup()
player.setx(-200)
player.showturtle()

# obstacle list
obstacle_speed_upper = 3
obstacles_upper = []

for _ in range(NUMBER_OBSTACLES_UPPER):
    obstacle = Turtle()
    obstacle.hideturtle()
    obstacle.shape('square')
    obstacle.turtlesize(12, 3)
    obstacle.speed('fastest')
    obstacle.color(choice(COLORS))

    obstacle.penup()
    xobs = randrange(-100, 280)
    yobs = randrange(145, 190)
    obstacle.setposition(xobs, yobs)

    obstacle.showturtle()

    obstacles_upper.append(obstacle)

# lower obstacles list
obstacle_speed_lower = 3
obstacles_lower = []

for _ in range(NUMBER_OBSTACLES_LOWER):
    obstacle = Turtle()
    obstacle.hideturtle()
    obstacle.shape('square')
    obstacle.turtlesize(12, 3)
    obstacle.speed('fastest')
    obstacle.color(choice(COLORS))

    obstacle.penup()
    xobs = randrange(-100, 280)
    yobs = randrange(160, 190)
    obstacle.setposition(xobs, -yobs)

    obstacle.showturtle()

    obstacles_lower.append(obstacle)

screen.onkeypress(playerup, 'space')
screen.listen()

move()

screen.mainloop()

关于python - 当按一个键将 turtle 向上移动时,我的其他 turtle 卡住了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58739746/

相关文章:

python - 获取用于早期停止的 GBM 的树的数量

python - pysnmp - nextCmd - 不检索下一个元素

python 3.x, `type` 本身派生自 `object` ,而 `object` 派生自 `type`

python - 如何在python上画一个时钟?(没有时针或分针,只是一张图)

python - 如何在Python中使用turtle模块播放GIF?

python - 尝试在 python 中拖动 turtle 时内核崩溃

python - pandas .to_sql 与 RDS 超时

python - 根据另一列值重新采样和聚合数据

python - 从字符串列表创建 Pandas 数据框

python - 如何在Python中解码这种奇怪的编码?