簡體   English   中英

當我運行我的Python Turtle游戲時,圖形窗口停止響應

[英]When I run my Python Turtle game, the Graphics Window stops responding

我是烏龜和編程的新手,想做一個標記游戲。 有兩個用戶,其中一個是跑步者,一個是追逐者(鮑勃和菲爾)。 當追蹤器靠近跑步者(使用距離公式檢測到)時,程序將它們設置回原始起始位置。 但是,每當我運行程序時,Turtle Graphics窗口會凍結並停止響應,最終導致我關閉程序。 任何人都可以幫我識別問題嗎?

import turtle
import math
bob = turtle.Turtle()

wn = turtle.Screen()
wn.bgcolor("black")
wn.setup(width = 700, height = 700)
wn.tracer()

border_pen = turtle.Turtle()
border_pen.speed(0)
border_pen.color("white")
border_pen.penup()
border_pen.setposition(-300,-300)
border_pen.pendown()
border_pen.pensize(3)
for side in range(4):
    border_pen.fd(600)
    border_pen.lt(90)
border_pen.hideturtle()

bob.shape("triangle")
bob.speed(0)
bob.color("blue")
bob.penup()
bob.setpos(-50, 0)
def draw():
    bob.penup()
def nodraw():
    bob.pendown()

def fd():
    bob.fd(20)
    if bob.xcor() > 280:
        bob.setx(280)
    if bob.ycor() > 280:
        bob.sety(280)

    if bob.xcor() < -280:
        bob.setx(-280)
    if bob.ycor() <- 280:
        bob.sety(-280)
def right():
    bob.right(90)

def left():
    bob.left(90)

turtle.listen()
turtle.onkey(left, "Left")
turtle.onkey(fd, "Up")
turtle.onkey(right, "Right")

phil = turtle.Turtle()
phil.speed(0)
phil.penup()
phil.shape("triangle")
phil.color("red")
phil.setpos(50, 0)

def fdp():
    phil.fd(20)
    if phil.xcor() > 280:
        phil.setx(280)
    if phil.ycor() > 280:
        phil.sety(280)

    if phil.xcor() < -280:
        phil.setx(-280)
    if phil.ycor() <- 280:
        phil.sety(-280)
def rightp():
    phil.right(90)

def leftp():
    phil.left(90)

turtle.listen()
turtle.onkey(leftp, "a")
turtle.onkey(fdp, "w")
turtle.onkey(rightp, "d")


def isCollision(t1, t2):
    distance = math.sqrt(math.pow(t1.xcor()-t2.xcor(),2)+math.pow(t1.ycor()-t2.ycor(),2))
    if distance < 20:
        return True
    else:
        return False
while True:
    if isCollision(bob, phil):
        bob.setposition(-50, 0)
        phil.setposition(50, 0)



turtle.done()

經過審核,這應該工作:

import turtle
import math

bob = turtle.Turtle()

wn = turtle.Screen()
wn.bgcolor("black")
wn.setup(width = 700, height = 700)
wn.tracer()

border_pen = turtle.Turtle()
border_pen.speed(0)
border_pen.color("white")
border_pen.penup()
border_pen.setposition(-300,-300)
border_pen.pendown()
border_pen.pensize(3)

for side in range(4):
    border_pen.fd(600)
    border_pen.lt(90)
border_pen.hideturtle()

bob.shape("triangle")
bob.speed(0)
bob.color("blue")
bob.penup()
bob.setpos(-50, 0)
def draw():
    bob.penup()
def nodraw():
    bob.pendown()

def fd():
    bob.fd(20)
    if bob.xcor() > 280:
        bob.setx(280)
    if bob.ycor() > 280:
        bob.sety(280)

    if bob.xcor() < -280:
        bob.setx(-280)
    if bob.ycor() <- 280:
        bob.sety(-280)
    distance = math.sqrt(math.pow(bob.xcor()-phil.xcor(),2)+math.pow(bob.ycor()-phil.ycor(),2))
    print(distance)
    if distance < 20:
        bob.setposition(-50, 0)
        phil.setposition(50, 0)
def right():
    bob.right(90)

def left():
    bob.left(90)

turtle.listen()
turtle.onkey(left, "Left")
turtle.onkey(fd, "Up")
turtle.onkey(right, "Right")

phil = turtle.Turtle()
phil.speed(0)
phil.penup()
phil.shape("triangle")
phil.color("red")
phil.setpos(50, 0)

def fdp():
    phil.fd(20)
    if phil.xcor() > 280:
        phil.setx(280)
    if phil.ycor() > 280:
        phil.sety(280)

    if phil.xcor() < -280:
        phil.setx(-280)
    if phil.ycor() <- 280:
        phil.sety(-280)
def rightp():
    phil.right(90)

def leftp():
    phil.left(90)

turtle.listen()
turtle.onkey(leftp, "a")
turtle.onkey(fdp, "w")
turtle.onkey(rightp, "d")

turtle.done()

將你的turtle.done()縮進到while循環中。 這將解決你的冰凍問題。 像這樣 :

while True:
    if isCollision(bob, phil):
        bob.setposition(-50, 0)
        phil.setposition(50, 0)
    turtle.done()

你也可以刪除while循環,因為你的if語句不需要它。 像這樣:

if isCollision(bob, phil):
    bob.setposition(-50, 0)
    phil.setposition(50, 0)
turtle.done()

您的原始代碼和我在下面嘗試解決的建議答案存在問題。 具體來說:你不需要計算海龜之間的距離,他們已經知道如何做到這一點; 你和其他人使用tracer()毫無意義,因為你沒有update()調用; 鮑勃和菲爾之間的碰撞應該是對稱的,但其中一個答案認為鮑勃與菲爾碰撞但不與菲爾碰撞鮑勃; 其中一個答案似乎不了解turtle.done()的本質。

from turtle import Screen, Turtle, mainloop

def bob_left():
    bob.left(90)

def bob_forward():
    bob.forward(20)

    if bob.xcor() > 280:
        bob.setx(280)
    elif bob.xcor() < -280:
        bob.setx(-280)

    if bob.ycor() > 280:
        bob.sety(280)
    elif bob.ycor() < -280:
        bob.sety(-280)

    checkCollision()

def bob_right():
    bob.right(90)

def phil_left():
    phil.left(90)

def phil_forward():
    phil.forward(20)

    if phil.xcor() > 280:
        phil.setx(280)
    elif phil.xcor() < -280:
        phil.setx(-280)

    if phil.ycor() > 280:
        phil.sety(280)
    elif phil.ycor() < -280:
        phil.sety(-280)

    checkCollision()

def phil_right():
    phil.right(90)

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

def checkCollision():
    if isCollision(bob, phil):
        bob.setposition(-50, 0)
        phil.setposition(50, 0)

screen = Screen()
screen.bgcolor('black')
screen.setup(width=700, height=700)

border_pen = Turtle(visible=False)
border_pen.speed('fastest')
border_pen.color('white')
border_pen.pensize(3)

border_pen.penup()
border_pen.setposition(-300, -300)
border_pen.pendown()

for _ in range(4):
    border_pen.fd(600)
    border_pen.lt(90)

bob = Turtle('triangle')
bob.speed('fastest')
bob.color('blue')
bob.penup()
bob.setpos(-50, 0)

phil = Turtle('triangle')
phil.speed('fastest')
phil.color('red')
phil.penup()
phil.setposition(50, 0)

screen.onkey(bob_left, 'Left')
screen.onkey(bob_forward, 'Up')
screen.onkey(bob_right, 'Right')

screen.onkey(phil_left, 'a')
screen.onkey(phil_forward, 'w')
screen.onkey(phil_right, 'd')
screen.listen()

mainloop()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM