如何让外星飞船相互碰撞?

2024-06-02 07:22:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用《如何像计算机程序员一样思考:学习Python3》一书自学计算机编程。其中一个练习题让我修改PyGames中名为异形的免费Python游戏,请参阅bithub here的完整代码。在

目标是让外星飞船互相碰撞。在

我不确定要包含哪一部分代码,下面是我对现有代码副本所做的修改:

        for alien in pygame.sprite.groupcollide(aliens, aliens, 1, 1).keys():

也许很明显外星精灵正处于不断碰撞的状态。所以上面的代码导致了屏幕边缘的大量爆炸,因为外星人会立即与自己发生碰撞(至少这是我想象中发生的事情)

我走下去遇到的成功有限的方法是尝试用精灵的移动方向来区分两个不同的外星精灵(向右是正的,左边是负的)。在

我在圈子里工作了一段时间,觉得我一定是错过了一些显而易见的东西。在

有什么建议吗?在


Tags: 代码游戏编程计算机请参阅python3精灵程序员
1条回答
网友
1楼 · 发布于 2024-06-02 07:22:04

你说的对,外星人处于“不断碰撞的状态”,所以你需要检查每一个外星人与所有不包括自己的外星人

好吧,这很管用:

    i = 0
    while i < len(aliens.sprites()): 
        check_alien = aliens.sprites()[i] #check alien 1.. alien 2.. etc

        aliens_except = pygame.sprite.Group() #here we create a new group
        n = 0 #without alien i, so we can use spritecollide while it doesnt collide
        for alien in aliens: #with itself
            if n != i: #exclude alien[i]
                aliens_except.add(alien)
            n += 1

        if not pygame.sprite.spritecollideany(check_alien, aliens_except):
            i += 1 #if theres no collision, move on to the next alien
        else:
            for alien in pygame.sprite.spritecollide(check_alien, aliens_except, 1):
                Explosion(alien) #remove all aliens that are colliding with check_alien
            for alien in pygame.sprite.spritecollide(check_alien, pygame.sprite.Group(check_alien), 1):
                Explosion(alien) #ugly way to remove check_alien

它不是最简洁、最直观或最有效的代码,但它能完成任务。 评论应该对此作出充分解释

相关问题 更多 >