当我使2只海龟碰撞时,Python冻结并崩溃

时间:2019-02-10 08:19:51

标签: python turtle-graphics

28

如果我将距离更改为import turtle import os import math ms = turtle.Screen() ms.bgcolor("grey") ms.title("ok") ground = turtle.Turtle() ground.speed(0) ground.color("black") ground.penup() ground.setposition(-500, -500) ground.shape("square") ground.shapesize(20, 200) player = turtle.Turtle() player.shape("square") player.color("blue") player.penup() player.speed(0) player.setposition(-450, -280) playerspeed = 15 prop = turtle.Turtle() prop.speed(0) prop.shape("square") prop.penup() prop.color("red") prop.setposition(-200, -50) def move_left(): x = player.xcor() x-= playerspeed if x <-460: x = - 460 player.setx(x) def move_right(): x = player.xcor() x+= playerspeed if x >460: x = 460 player.setx(x) def move_down(): y = player.ycor() y-= playerspeed if y <-290: y = - 290 player.sety(y) def move_up(): y = player.ycor() y+= playerspeed if y >290: y = 290 player.sety(y) turtle.listen() turtle.onkey(move_left, "Left") turtle.onkey(move_right, "Right") turtle.onkey(move_up, "Up") turtle.onkey(move_down, "Down") def isCollision(t1, t2): distance = math.sqrt(math.pow(t1.xcor() - t2.xcor(), 2) + math.pow(t1.ycor() - t2.ycor(), 2)) if distance < 10: return True else: return False while True: if isCollision(player, prop): player.setposition(100, 100) 它有效,但不如我所愿。 当> 10player彼此相距10个像素或更小时,我希望它更改prop的位置。 我已经尝试了大多数我知道的事情,但是我还是Python或任何编程语言的新手。

但是我不知道会导致它死机并崩溃的原因-感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

我在您的代码中看到的主要问题是while True:,它不应在基于事件的环境中使用。通过创建紧密循环,可以防止事件(按键,光标移动,窗口关闭)被处理。

以下是使用计时器事件而不是while True:对代码进行的重做。我还对它进行了参数设置,因为每个海龟用户都会根据其屏幕尺寸看到不同大小的默认窗口。因此,您要么需要使用setup()来强制固定大小的窗口,要么将代码调整为该窗口的大小。现在,它调整为窗口大小。我还使prop在发生碰撞时移动到随机位置,只是为了让我玩起来更加有趣。而且我已经将您的距离代码扔给了turtle自己实现:

from turtle import Screen, Turtle, mainloop
from random import randint

PLAYER_SPEED = 15
GROUND_HEIGHT = 100
PROXIMITY = 10
CURSOR_SIZE = 20

def move_left():
    x = player.xcor() - PLAYER_SPEED

    if x < CURSOR_SIZE - width/2:
        x = CURSOR_SIZE - width/2

    player.setx(x)

def move_right():
    x = player.xcor() + PLAYER_SPEED

    if x > width/2 - CURSOR_SIZE:
        x = width/2 - CURSOR_SIZE

    player.setx(x)

def move_down():
    y = player.ycor() - PLAYER_SPEED

    if y < CURSOR_SIZE/2 + GROUND_HEIGHT - height/2:
        y = CURSOR_SIZE/2 + GROUND_HEIGHT - height/2

    player.sety(y)

def move_up():
    y = player.ycor() + PLAYER_SPEED

    if y > height/2 - CURSOR_SIZE:
        y = height/2 - CURSOR_SIZE

    player.sety(y)

def isCollision(t1, t2):
    return t1.distance(t2) < PROXIMITY

def random_position():
    x = randint(CURSOR_SIZE - width//2, width//2 - CURSOR_SIZE)
    y = randint(CURSOR_SIZE + GROUND_HEIGHT - height//2, height//2 - CURSOR_SIZE)

    return x, y

def check():
    if isCollision(player, prop):
        prop.setposition(random_position())

    ms.ontimer(check, 100)

ms = Screen()
ms.bgcolor('grey')
ms.title("ok")

width, height = ms.window_width(), ms.window_height()

ground = Turtle('square')
ground.shapesize(GROUND_HEIGHT / CURSOR_SIZE, width / CURSOR_SIZE)
ground.speed('fastest')
ground.penup()
ground.sety(GROUND_HEIGHT/2 - height/2)

player = Turtle('square')
player.speed('fastest')
player.color('blue')
player.penup()
player.setposition(CURSOR_SIZE/2 - width/2, GROUND_HEIGHT + CURSOR_SIZE/2 - height/2)

prop = Turtle('square')
prop.speed('fastest')
prop.color('red')
prop.penup()
prop.setposition(random_position())

ms.onkey(move_left, 'Left')
ms.onkey(move_right, 'Right')
ms.onkey(move_up, 'Up')
ms.onkey(move_down, 'Down')
ms.listen()

check()

mainloop()