2012-02-12 40 views
0

我想教我自己使用本书的计算机编程如何像计算机程序员一样思考:学习Python 3.其中一个练习题有我修改PyGames中称为外星人的免费Python游戏,请参阅bithub的完整代码here如何让外星宇宙飞船相互碰撞?

目标是让外来的船舶相互碰撞。

我实际不知道的代码位,包括,这是我对现有代码的副本进行了修改:

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

也许明明是外星人精灵与碰撞的恒定状态本身。所以上面的代码导致在屏幕边缘发生大量爆炸,因为外星人立即与自己发生冲突(至少这是我想象中发生的事情)

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

我在自己的圈子里工作了一段时间,觉得我必须要失去一些明显的东西。

任何指针?

回答

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 

它不是最整齐,直观或有效的代码片段,而是完成了工作。 意见应充分说明

+0

感谢您的帮助! – 2012-02-15 21:40:25