Un mini space invaders usando caracteres, la nave dispara a quemarropas en una lucha contra el bicho, nadie sabe cuanto durará esta cacería, que lo disfruten:

  • La nave y el bicho se mueven solos de forma aleatoria.

  • La nave dispara de forma aleatoria.

  • Todo esta en un spanglish feo.

  • Se podría agregar manejo de eventos de teclado para manejar la nave y los disparos. Alguna idea usando módulo estándar de python?

  • En cuanto pueda pongo un videito.

import random
import time
import os


ROWS = 14
COLS = 16
BULLET = '.'
SHOTS = []
SCREEN = []
EMPTY = ' '
EXPLOSION = '#'
SHIP = 'A'
BUG = 'W'


###############################################################################
# Funciones del mundo
###############################################################################
def crear_mapa():
    for row in range(0, ROWS):
        SCREEN.append([])
        for col in range(0, COLS):
            SCREEN[row].append(EMPTY)


def mostrar_mapa():
    for row in SCREEN:
        for col in row:
            print col,
        print


def mover_disparos():
    for disparo in SHOTS:
        SCREEN[disparo[0]][disparo[1]] = EMPTY
        if disparo[0] > 0:
            if SCREEN[disparo[0] - 1][disparo[1]] == BUG:
                SCREEN[disparo[0] - 1][disparo[1]] = EXPLOSION
                return False
            else:
                SCREEN[disparo[0] - 1][disparo[1]] = BULLET
                SHOTS.append((disparo[0] - 1, disparo[1]))
        SHOTS.remove(disparo)
    return True


def _mover_nave(direccion, nave, row):
    try:
        col = SCREEN[row].index(nave)
    except ValueError:
            col = 0
    SCREEN[row][col] = EMPTY
    next_col = col + (1 * direccion)
    if next_col > 15:
        next_col = 0
    SCREEN[row][next_col] = nave


def limpiar_pantalla():
    os.system(['clear', 'cls'][os.name == 'nt'])


###############################################################################
# Funciones para la nave
###############################################################################
def crear_nave():
    SCREEN[-1][random.randint(0, COLS - 1)] = SHIP


def mover_nave():
    if random.randint(0, 100) > 50:
        _mover_nave(-1, SHIP, -1)
    else:
        _mover_nave(1, SHIP, -1)


def disparar():
    if random.randint(0, 100) > 70:
        col = SCREEN[-1].index(SHIP)
        SCREEN[-2][col] = BULLET
        row = ROWS - 2
        SHOTS.append((row, col))


###############################################################################
# Funciones para el bicho
###############################################################################
def crear_bicho():
    SCREEN[0][random.randint(0, COLS - 1)] = BUG


def mover_bicho():
    if random.randint(0, 100) > 50:
        _mover_nave(-1, BUG, 0)
    else:
        _mover_nave(1, BUG, 0)


def jugar():
    crear_mapa()
    crear_nave()
    crear_bicho()
    while mover_disparos():
        mover_bicho()
        disparar()
        mover_nave()
        mostrar_mapa()
        time.sleep(0.2)
        limpiar_pantalla()
    limpiar_pantalla()
    mostrar_mapa()
    print "EL BICHO SE MURIO"


if __name__ == '__main__':
    jugar()