如何解决Python乌龟模块碰撞在最终级别不起作用
我的项目有问题。我想要一个游戏,从右边来 5 个 TIE 战士(敌人),你必须射击他们才能获得积分。在你达到 100 点后(出于测试原因,在代码 5 中)一个老板来了,你需要杀死它(用 45 次射击)。
我的问题是boss战。子弹按预期与敌人相撞,但到了boss战,子弹就无视boss了。我试图修复碰撞,但没有任何效果,我尝试过的似乎有效。
我知道有课会更容易些,但这是学校项目,我们还没有学过课,所以我们显然不能使用它们。对不起,如果代码有点乱,我只是一个正在学习编码的学生。
感谢您提前回答。
from playsound import playsound
import turtle,random,time
def up():
y = ss.ycor()
ss.sety(y+20)
def down():
y = ss.ycor()
ss.sety(y-20)
def left():
x = ss.xcor()
ss.setx(x-20)
def right():
x = ss.xcor()
ss.setx(x+20)
def shoot():
laser = turtle.Turtle()
laser.penup()
laser.shape("ammos.gif")
laser.setx(ss.xcor())
laser.sety(ss.ycor())
laserl.append(laser)
wn = turtle.Screen()
wn.setup(width=1200,height=900)
wn.bgpic("stardestroyer.png")
wn.tracer(0)
wn.addshape("falcon.gif")
wn.addshape("tiefighter.gif")
wn.addshape("explosion.gif")
wn.addshape("starship.gif")
wn.addshape("ammos.gif")
wn.listen()
wn.onkeypress(up,"Up")
wn.onkeypress(down,"Down")
wn.onkeypress(left,"Left")
wn.onkeypress(right,"Right")
wn.onkeypress(shoot,"space")
ss = turtle.Turtle()
ss.penup()
ss.shape("falcon.gif")
mt = turtle.Turtle()
mt.penup()
mt.shape("tiefighter.gif")
mt.setx(588)
mt.sety(random.randint(-420,420))
boss = turtle.Turtle()
boss.shape("starship.gif")
boss.penup()
boss.hideturtle()
boss.setx(725)
mt1 = turtle.Turtle()
mt1.penup()
mt1.shape("tiefighter.gif")
mt1.setx(588)
mt1.sety(random.randint(-420,420))
mt2 = turtle.Turtle()
mt2.penup()
mt2.shape("tiefighter.gif")
mt2.setx(588)
mt2.sety(random.randint(-420,420))
mt3 = turtle.Turtle()
mt3.penup()
mt3.shape("tiefighter.gif")
mt3.setx(588)
mt3.sety(random.randint(-420,420))
mt4 = turtle.Turtle()
mt4.penup()
mt4.shape("tiefighter.gif")
mt4.setx(588)
mt4.sety(random.randint(-420,420))
sb = turtle.Turtle()
sb.hideturtle()
sb.penup()
sb.sety(410)
sb.setx(-595)
sb.color('white')
sb1 = turtle.Turtle()
sb1.hideturtle()
sb1.penup()
sb1.sety(410)
sb1.setx(595)
sb1.color('white')
sb3 = turtle.Turtle()
sb3.hideturtle()
sb3.penup()
sb3.color('white')
score = 0
life = 3
bosshit = 0
alive = True
bossalive = False
laserl = []
mtlist = []
x = 0
while alive:
sb.clear()
sb.write(f"{life} életed maradt.",align="left",font=("Arial",28,"bold") )
if alive:
mt.back(20)
mt1.back(20)
mt2.back(20)
mt3.back(20)
mt4.back(20)
if bossalive:
boss.back(4)
if ss.distance(mt.xcor(),mt.ycor()) < 25:
mt.hideturtle()
mt.shape("tiefighter.gif")
mt.showturtle()
mt.setx(588)
mt.sety(random.randint(-425,426))
life -= 1
sb.clear()
sb.write(f"{life} életed maradt.","bold") )
if life == 0:
ss.shape("explosion.gif")
sb.clear()
sb.write("Elfogytak az életeid,meghaltál!","bold"))
time.sleep(2.3)
sb.clear()
alive = False
if ss.distance(mt1.xcor(),mt1.ycor()) < 25:
mt1.hideturtle()
mt1.shape("tiefighter.gif")
mt1.showturtle()
mt1.setx(588)
mt1.sety(random.randint(-425,"bold"))
time.sleep(2.3)
sb.clear()
alive = False
if ss.distance(mt2.xcor(),mt2.ycor()) < 25:
mt2.hideturtle()
mt2.shape("tiefighter.gif")
mt2.showturtle()
mt2.setx(588)
mt2.sety(random.randint(-425,"bold"))
time.sleep(2.3)
sb.clear()
alive = False
if ss.distance(mt3.xcor(),mt3.ycor()) < 25:
mt3.hideturtle()
mt3.shape("tiefighter.gif")
mt3.showturtle()
mt3.setx(588)
mt3.sety(random.randint(-425,"bold"))
time.sleep(2.3)
sb.clear()
alive = False
if ss.distance(mt4.xcor(),mt4.ycor()) < 25:
mt4.hideturtle()
mt4.shape("tiefighter.gif")
mt4.showturtle()
mt4.setx(588)
mt4.sety(random.randint(-425,"bold") )
if life == 0:
ss.shape("explosion.gif")
sb.clear()
sb.write("Elfogytak az életeid,"bold"))
time.sleep(2.3)
sb.clear()
alive = False
if life == 0:
ss.shape("explosion.gif")
sb.clear()
sb.write("Elfogytak az életeid,"bold"))
time.sleep(2.3)
sb.clear()
alive = False
if mt.xcor() < -599:
mt.setx(588)
mt.sety(random.randint(-425,426))
if mt1.xcor() < -599:
mt1.setx(588)
mt1.sety(random.randint(-425,426))
if mt2.xcor() < -599:
mt2.setx(588)
mt2.sety(random.randint(-425,426))
if mt3.xcor() < -599:
mt3.setx(588)
mt3.sety(random.randint(-425,426))
if mt4.xcor() < -599:
mt4.setx(588)
mt4.sety(random.randint(-425,426))
for bullet in laserl:
if bullet.distance(mt) < 30:
mt.setx(588)
mt.sety(random.randint(-425,426))
score += 1
sb1.clear()
sb1.write(f"{score} pontod van.",align="right","bold") )
bullet.setx(700)
bullet.fd(0)
bullet.clear()
bullet.hideturtle()
elif bullet.distance(mt1) < 30:
mt1.setx(588)
mt1.sety(random.randint(-425,"bold") )
bullet.setx(700)
bullet.fd(0)
bullet.clear()
bullet.hideturtle()
elif bullet.distance(mt2) < 30:
mt2.setx(588)
mt2.sety(random.randint(-425,"bold") )
bullet.setx(700)
bullet.fd(0)
bullet.clear()
bullet.hideturtle()
elif bullet.distance(mt3) < 30:
mt3.setx(588)
mt3.sety(random.randint(-425,"bold") )
bullet.setx(700)
bullet.fd(0)
bullet.clear()
bullet.hideturtle()
elif bullet.distance(mt4) < 30:
mt4.setx(588)
mt4.sety(random.randint(-425,"bold") )
bullet.setx(700)
bullet.fd(0)
bullet.clear()
bullet.hideturtle()
else:
bullet.fd(30)
if bullet.xcor() >= 600:
bullet.clear()
bullet.fd(0)
bullet.hideturtle()
if score == 5:
bossalive = True
mt.setx(700)
mt.clear()
mt1.setx(700)
mt1.clear()
mt2.setx(700)
mt2.clear()
mt3.setx(700)
mt3.clear()
mt4.setx(700)
mt4.clear()
boss.showturtle()
if bullet.distance(boss) > 50:
bosshit += 1
bullet.setx(700)
bullet.fd(0)
bullet.clear()
bullet.hideturtle()
if bosshit == 45:
boss.shape("explosion.gif")
boss.clear()
bossalive = False
sb3.clear()
sb3.write(f"Legyőzted a főszörnyet,megnyerted a játékot! Elért pontszám:{score}",align="center","bold"))
score += 50
time.sleep(3)
alive = False
if boss.xcor() == -650:
sb.clear()
sb.write(f"Nem sikerült legyőznöd a főszörnyet. Elvesztetted a játékot! Elért pontszám: {score}","bold"))
time.sleep(3)
alive = False
if ss.xcor() > 599:
ss.setx(-599)
if ss.xcor() < -599:
ss.setx(599)
if ss.ycor() > 449:
ss.sety(-449)
if ss.ycor() < -449:
ss.sety(449)
x += 1
wn.update()
time.sleep(0.1)
解决方法
尝试使用另一种方法来检查碰撞,我在我的大部分代码中都使用了这种方法并且效果很好。
#you can edit the value here \/ to change the radius of the collision detection
if bullet.xcor() - boss.xcor() < 10 and bullet.xcor() - boss.xcor() < 10:
bosshit += 1
bullet.setx(700)
bullet.fd(0)
bullet.clear()
bullet.hideturtle()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。