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

时间:2012-02-12 21:14:01

标签: python pygame

我正在尝试自学计算机编程如何像计算机程序员一样思考:学习Python 3.其中一个练习题是我从PyGames修改免费的Python游戏叫Aliens,请参阅bithub的完整代码here

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

我实际上不确定要包含哪些代码,这是对现有代码副本的修改:

        for alien in pygame.sprite.groupcollide(aliens, aliens, 1, 1).keys():
也许很明显,外星精灵处于与自身相撞的恒定状态。所以上面的代码导致屏幕边缘出现大量爆炸,因为外星人会立即与自身发生碰撞(至少这是我想象中发生的事情)

我走下去并取得有限成功的路线是尝试使用精灵的运动方向区分两种不同的外来精灵(右边是正面,左面是负面的)。

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

任何指针?

1 个答案:

答案 0 :(得分:1)

你是对的,外星人处于“与自己相撞的不断状态”,所以你需要检查每个外星人对抗除了自己以外的所有外星人

嗯,这有效:

    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

它不是最简洁,最直观或最有效的代码,但可以完成工作。 评论应该充分解释