Introducción a Pygame
Por Nacho Cabanes, versión 0.10

7. Varios enemigos iguales

Si queremos varios enemigos iguales, en vez de uno solo, no podemos crear una variable "velocidadX" para cada uno, otra "velocidadY" para cada uno, otra "visible" para cada uno y así sucesivamente. Es más razonable usar una estructura repetitiva.

Como primera aproximación, podemos tener un array para los rectángulos, otro para las velocidades, otro para los "visibles"...

Esto supone varios cambios:

El resultado es más largo, pero no mucho más difícil:

# Mini-invaders, version 0.07
# (Varios enemigos iguales)
# Parte de la intro a Pygame, por Nacho Cabanes
 
import pygame
from pygame.locals import *
import random                    # Nuevo en la version 0.07
 
pygame.init()
 
ancho = 800
alto = 600
cantidadMarcianos = 10           # Nuevo en la version 0.07
terminado = False
 
pantalla = pygame.display.set_mode( (ancho, alto) )
pygame.key.set_repeat(1,25)
reloj = pygame.time.Clock()
 
imagenNave = pygame.image.load("nave.png")
rectanguloNave = imagenNave.get_rect()
rectanguloNave.left = ancho/2
rectanguloNave.top = alto-50
 
imagenUfo = pygame.image.load("ufo.png")
rectanguloUfo = imagenUfo.get_rect()
rectanguloUfo.top = 20
 
imagenMarciano = pygame.image.load("spaceinvader.png")
rectangulosMarcianos = { }          # Nuevo en 0.07
marcianosVisibles = { }             # Nuevo en 0.07
velocidadesX = { }                  # Nuevo en 0.07
velocidadesY = { }                  # Nuevo en 0.07
for i in range(0,cantidadMarcianos+1):                      # Nuevo en 0.07
    rectangulosMarcianos[i] = imagenMarciano.get_rect()     # Nuevo en 0.07
    rectangulosMarcianos[i].left = random.randrange(50,751) # Nuevo en 0.07
    rectangulosMarcianos[i].top = random.randrange(10,301)  # Nuevo en 0.07
    marcianosVisibles[i] = True                             # Nuevo en 0.07
    velocidadesX[i] = 3                                     # Nuevo en 0.07
    velocidadesY[i] = 3                                     # Nuevo en 0.07
 
imagenDisparo = pygame.image.load("disparo.png")
rectanguloDisparo = imagenDisparo.get_rect()
disparoActivo = False
ufoVisible = True
 
while not terminado:
    # ---- Comprobar acciones del usuario ----
    for event in pygame.event.get():
        if event.type == pygame.QUIT: terminado = True
 
    keys = pygame.key.get_pressed()
    if keys[K_LEFT]:
        rectanguloNave.left -= 8
    if keys[K_RIGHT]:
        rectanguloNave.left += 8
    if keys[K_SPACE] and not disparoActivo:
        disparoActivo = True
        rectanguloDisparo.left = rectanguloNave.left + 18
        rectanguloDisparo.top = rectanguloNave.top - 25
 
    # ---- Actualizar estado ----
    for i in range(0,cantidadMarcianos+1):               # Nuevo en 0.07
        rectangulosMarcianos[i].left += velocidadesX[i]  # Cambia en 0.07
        rectangulosMarcianos[i].top += velocidadesY[i]
        if rectangulosMarcianos[i].left < 0 or rectangulosMarcianos[i].right > ancho:
            velocidadesX[i] = -velocidadesX[i]
        if rectangulosMarcianos[i].top < 0 or rectangulosMarcianos[i].bottom > alto:
            velocidadesY[i] = -velocidadesY[i]
 
    rectanguloUfo.left += 2
    if rectanguloUfo.right > ancho:
        rectanguloUfo.left = 0
 
    if disparoActivo:
        rectanguloDisparo.top -= 6
        if rectanguloDisparo.top <= 0:
            disparoActivo = False
 
    # ---- Comprobar colisiones ----
    for i in range(0,cantidadMarcianos+1):              # Nuevo en 0.07
        if marcianosVisibles[i]:                        # Cambia en 0.07
            if rectanguloNave.colliderect( rectangulosMarcianos[i] ):
                terminado = True
 
            if disparoActivo:
                if rectanguloDisparo.colliderect( rectangulosMarcianos[i]) :
                    marcianosVisibles[i] = False
                    disparoActivo = False
 
    if disparoActivo:
        if rectanguloDisparo.colliderect( rectanguloUfo) :
            ufoVisible = False
            disparoActivo = False
 
    cantidadMarcianosVisibles = 0                         # Nuevo en 0.07
    for i in range(0,cantidadMarcianos+1):                # Nuevo en 0.07
        if marcianosVisibles[i]:                          # Nuevo en 0.07
            cantidadMarcianosVisibles = cantidadMarcianosVisibles + 1
 
    if not ufoVisible and cantidadMarcianosVisibles == 0: # Cambia en 0.07
        terminado = True    
 
    # ---- Dibujar elementos en pantalla ----
    pantalla.fill( (0,0,0) )
    for i in range(0,cantidadMarcianos+1):                # Nuevo en 0.07
        if marcianosVisibles[i]:
            pantalla.blit(imagenMarciano, rectangulosMarcianos[i])
    if ufoVisible:
        pantalla.blit(imagenUfo, rectanguloUfo)
    if disparoActivo:
        pantalla.blit(imagenDisparo, rectanguloDisparo)
    pantalla.blit(imagenNave, rectanguloNave)
    pygame.display.flip()
 
    # ---- Ralentizar hasta 40 fotogramas por segundo  ----
    reloj.tick(40)
 
# ---- Final de partida ----
pygame.quit()
 


Y la apariencia sería:

pygame - ejemplo 007