Как заставить инопланетные космические корабли сталкиваться друг с другом? - PullRequest
0 голосов
/ 13 февраля 2012

Я пытаюсь научить себя компьютерному программированию, используя книгу «Как думать, как компьютерный программист: выучить Python 3. Один из вопросов упражнения заставляет меня изменить бесплатную игру Python от Pyens» под названием «Aliens», см. Полный код с bithub. здесь .

Цель состоит в том, чтобы инопланетные корабли сталкивались друг с другом.

Я на самом деле не уверен, какой бит кода включить, вот изменение, которое я сделал для копии существующего кода:

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

может быть, очевидно, что инопланетный спрайт находится в состоянии постоянного столкновения с самим собой. Таким образом, приведенный выше код приводит к множеству взрывов по краям экрана, поскольку инопланетянин мгновенно сталкивается с самим собой (по крайней мере, это то, что, как я думаю, происходит)

Маршрут до, который я прошел и встретил с ограниченным успехом, состоял в том, чтобы попытаться использовать направление движения спритов, чтобы различать два разных инопланетных сприта (движение вправо положительно, а слева отрицательно).

Я некоторое время работал в кругах и чувствовал, что, должно быть, упускаю что-то очевидное.

Есть указатели?

1 Ответ

1 голос
/ 13 февраля 2012

вы правы в том, что инопланетяне находятся в "постоянном состоянии столкновения с самими собой", поэтому вам нужно проверить каждого инопланетянина на предмет всех инопланетян, исключая его самого

ну, это работает:

    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

это не самый аккуратный, интуитивно понятный или эффективный фрагмент кода, но он выполняет свою работу. комментарии должны объяснить это достаточно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...