微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

龟窗挂

如何解决龟窗挂

当我尝试运行我的代码时,我的 Python 乌龟窗口挂了;我也动不了。我试过移除 win_pen 并且它起作用了,但我不知道 win_pen 内部是什么让它挂起。

因为我在 Mac 上,它还给了我纺车,我不确定这是否是问题所在。顺便说一下,我使用的是 Big Sur 11.1。

编辑:缩进就在我的屏幕上,只是复制和粘贴问题

代码

import turtle
import os
import math
import random
from random import randint

score = 0

# Set Up Screen
wn = turtle.Screen()
wn.bgcolor("black")
wn.title("test")

# Draw border
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.hideturtle()
border_pen.pensize(3)
for side in range(4):
border_pen.fd(600)
border_pen.lt(90)

# Draw Winning Area
win_pen = turtle.Turtle()
win_pen.hideturtle()
win_pen.shape("square")
win_pen.penup()
win_pen.setposition(0,267.7)
win_pen.shapesize(3,29.8)

# Show score on Screen
score_pen = turtle.Turtle()
score_pen.speed(0)
score_pen.color("white")
score_pen.penup()
score_pen.setposition(-290,303)
scorestring = "score: %s" %score
score_pen.write(scorestring,False,align="left",font=("Ubuntu",14,"normal"))
score_pen.hideturtle()

# Set up Player 1
player1 = turtle.Turtle()

player1.color("blue")
player1.shape("triangle")
player1.penup()
player1.speed(0)
player1.setposition(0,-250)
player1.setheading(90)

player1speed = 15

# Set Up Enemies
en = 8

enemies = []

for i in range(en):
enemies.append(turtle.Turtle())
for enemy in enemies:
enemy.color("red")
enemy.shape("square")
enemy.penup()
enemy.speed(0)
enemy.goto(randint(-280,280),randint(-280,280))
enemy.shapesize(2,2)


enemyspeed = 2

# Draw Winning Area
win_pen = turtle.Turtle()
win_pen.hideturtle()
win_pen.shape("square")
win_pen.penup()
win_pen.setposition(0,29.8)


#Define bullet state
#ready - ready to fire
#fire - bullet is firing
bulletstate = "ready"

def left():
x = player1.xcor()
player1.setheading(180)
player1.forward(player1speed)
if x < -280:
x = - 280
player1.setx(x)
def right():
x = player1.xcor()
player1.setheading(0)
player1.forward(player1speed)
if x > 280:
x = 280
player1.setx(x)

def up():
y = player1.ycor()
player1.setheading(90)
player1.forward(player1speed)
if y > 280:
y = 280
player1.sety(y)

def down():
y = player1.ycor()
player1.setheading(270)
player1.forward(player1speed)
if y < -280:
y = 280
player1.sety(y)

def isCollision(t1,t2):
distance = math.sqrt(math.pow(t1.xcor()-t2.xcor(),2)+math.pow(t1.ycor()-t2.ycor(),2))
if distance < 15:
return True
else:
return False


turtle.listen()

turtle.onkey(left,"a")
turtle.onkey(right,"d")
turtle.onkey(up,"w")
turtle.onkey(down,"s")

# Main Game Loop
while True:
if isCollision(player1,win_pen):
player1.setposition(0,-250)
player1.setheading(90)

解决方法

你的代码有几个问题:不要在像乌龟这样的事件驱动的世界中使用 while True:——让事件处理程序完成它的工作;您的碰撞逻辑是不正确的,因为它是从海龟的中心开始测量的,而我们实际上只关心两只海龟的 y 位置;你似乎在错误的方向重置玩家;您实施了两次获胜区域。

我已经重写并简化了您下面的代码,其中包含了上述更改和其他一些调整:

from turtle import Screen,Turtle
from random import randint

ENEMY_COUNT = 8
PLAYER_SPEED = 15

def left():
    player.setheading(180)

    player.setx(max(-280,player.xcor() - PLAYER_SPEED))

    check_collision(player,win_pen)

def right():
    player.setheading(0)

    player.setx(min(280,player.xcor() + PLAYER_SPEED))

    check_collision(player,win_pen)

def up():
    player.setheading(90)

    player.sety(min(280,player.ycor() + PLAYER_SPEED))

    check_collision(player,win_pen)

def down():
    player.setheading(270)

    player.sety(max(-280,player.ycor() - PLAYER_SPEED))

    check_collision(player,win_pen)

def check_collision(player,win_pen):
    if abs(player.ycor() - win_pen.ycor()) < 15:
        player.sety(-250)
        player.setheading(90)

score = 0

# Set Up Screen
screen = Screen()
screen.bgcolor('black')

# Draw border
border_pen = Turtle()
border_pen.hideturtle()
border_pen.pensize(3)
border_pen.color('white')
border_pen.speed('fastest')

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

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

# Draw Winning Area
win_pen = Turtle()
win_pen.shape('square')
win_pen.shapesize(3,29.8)
win_pen.color('gray')
win_pen.penup()
win_pen.sety(267.7)

# Show Score on Screen
score_pen = Turtle()
score_pen.hideturtle()
score_pen.color('white')
score_pen.penup()
score_pen.setposition(-290,303)

scorestring = "Score: %s" %score
score_pen.write(scorestring,False,align='left',font=('Ubuntu',14,'normal'))

# Set up Player
player = Turtle()
player.shape('triangle')
player.color('blue')
player.speed('fastest')
player.setheading(90)
player.penup()
player.setx(-250)

# Set Up Enemies
enemies = []

for _ in range(ENEMY_COUNT):
    enemy = Turtle()

    enemy.color('red')
    enemy.shape('square')
    enemy.shapesize(2)
    enemy.speed('fastest')
    enemy.penup()
    enemy.goto(randint(-280,280),randint(-280,280))

    enemies.append(enemy)

screen.onkey(left,'a')
screen.onkey(right,'d')
screen.onkey(up,'w')
screen.onkey(down,'s')
screen.listen()

screen.mainloop()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。