首页 > 解决方案 > 一个对象被两个 while 循环卡住了

问题描述

每当我按“w”时,我都会尝试向桨对象添加物理效果,但球对象会卡住,直到函数while中的循环完成paddle_up()。如何让球在桨跳时保持移动?

这场比赛的重点是避免球从右边传来。每当用户避开球时,他或她会得到一分,但每当它与桨发生碰撞时,他们就会失去一分:

import random
import turtle


# window setup

wn = turtle.Screen()
wn.title("Jump Game")
wn.bgcolor("black")
wn.setup(width=1000, height=750)
wn.tracer(0)

# Key Biding Functions


def paddle_up():
    paddle_a.dy = -0.1
    while paddle_a.ycor() < 0:
        paddle_a.sety(paddle_a.ycor() - paddle_a.dy)
        wn.update()


def paddle_down():
    y = paddle_a.ycor()
    y -= 10
    paddle_a.sety(y)


def paddle_left():
    x = paddle_a.xcor()
    x -= 10
    paddle_a.setx(x)


def paddle_right():
    x = paddle_a.xcor()
    x += 10
    paddle_a.setx(x)

# Paddle A


paddle_a = turtle.Turtle()
paddle_a.speed(1)
paddle_a.shape("square")
paddle_a.color("white")
paddle_a.shapesize(stretch_wid=2, stretch_len=2, outline=1)
paddle_a.penup()
paddle_a.goto(-480, -350)

# Ball

ball = turtle.Turtle()
ball.shape("circle")
ball.color("white")
ball.penup()
ball.goto(-350, 0)
ball_speed = random.random()
ball_position_y = random.randint(-350, -300)

# Score System
Score = 0
Scr = turtle.Turtle()
Scr.goto(0, 360)
Scr.color("white")
Scr.penup()
Scr.hideturtle()

wn.listen()
wn.onkeypress(paddle_up, "w")
wn.onkeypress(paddle_down, "s")
wn.onkeypress(paddle_left, "a")
wn.onkeypress(paddle_right, "d")

# Main Game Loop


while True:
    wn.update()
    ball.setx(ball.xcor() - ball_speed * 0.3)
    if ball_speed <= 0.3:
        ball_speed = 0.3
    if ball.xcor() < paddle_a.xcor() + 20 and ball.xcor() > paddle_a.xcor() - 20 and ball.ycor() < paddle_a.ycor() +20 and ball.ycor() > paddle_a.ycor() - 20:
        Score = Score - 1
        Scr.clear()
        Scr.write("Score{}".format(Score), align="center", font=("Courier", 24))
        ball.setx(490)
        ball_position_y = random.randint(-350, -300)
        ball.sety(ball_position_y)
    elif ball.xcor() <= -490 and ball.ycor() != paddle_a.ycor():
        Score = Score + 1
        Scr.clear()
        Scr.write("Score{}".format(Score), align="center", font=("Courier", 24))
        ball.setx(490)
        ball_position_y = random.randint(-350, -300)
        ball.sety(ball_position_y)

标签: pythonturtle-graphicspython-turtle

解决方案


您正在使用while应该使用计时器事件的循环。SO 充满了 Python 海龟游戏的答案,即“while True:在海龟这样的事件驱动世界中没有生意”。你怎么能错过他们?

我在下面修改了您的代码,使其基本可玩:

from random import randint
from turtle import Screen, Turtle

FONT = ('Courier', 24)

# Key Biding Functions

def paddle_up():
    def paddle_rise():
        if paddle.ycor() < 0:
            paddle.sety(paddle.ycor() + paddle.dy)
            screen.update()
            screen.ontimer(paddle_rise, 10)

    paddle_rise()

def paddle_down():
    paddle.sety(paddle.ycor() - 10)

def paddle_left():
    paddle.setx(paddle.xcor() - 10)

def paddle_right():
    paddle.setx(paddle.xcor() + 10)

def update_score():
    global ball_speed

    scorer.clear()
    scorer.write("Score: {}".format(score), align='center', font=FONT)
    ball.setposition(490, randint(-350, -300))
    ball_speed = randint(1, 3)

# Main Game Loop

def play():
    global score

    ball.setx(ball.xcor() - ball_speed)

    if ball.distance(paddle) <= 20:
        score -= 1
        update_score()
    elif ball.xcor() <= -490 and ball.ycor() != paddle.ycor():
        score += 1
        update_score()

    screen.update()

    screen.ontimer(play, 10)

# window setup

screen = Screen()
screen.title("Jump Game")
screen.bgcolor('black')
screen.setup(width=1000, height=800)
screen.tracer(0)

# Paddle A

paddle = Turtle()
paddle.shape('square')
paddle.color('white')
paddle.shapesize(stretch_wid=2, stretch_len=2, outline=1)
paddle.speed('slowest')
paddle.penup()
paddle.goto(-480, -350)

paddle.dy = 2

# Ball

ball = Turtle()
ball.shape('circle')
ball.color('white')
ball.penup()
ball.setposition(490, randint(-350, -300))

ball_speed = randint(1, 3)

# Score System
score = 0

scorer = Turtle()
scorer.hideturtle()
scorer.sety(360)
scorer.color('white')
scorer.penup()

scorer.write("Score: {}".format(score), align='center', font=FONT)

screen.onkeypress(paddle_up, 'w')
screen.onkeypress(paddle_down, 's')
screen.onkeypress(paddle_left, 'a')
screen.onkeypress(paddle_right, 'd')
screen.listen()

play()

screen.mainloop()

推荐阅读