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

Python乌龟模块碰撞在最终级别不起作用

如何解决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 举报,一经查实,本站将立刻删除。