Ejemplo Juego Nicole y Hugo

Ejemplo de Nicole y Hugo

# coding=utf-8
"""                                                    BATALLA NAVALRepresentación de cómo se verá el juego COMPUTADORA                JUGADOR  1  2  3  4               1  2  3  41[*][ ][ ][*]            1[ ][*][ ][ ]2[ ][*][ ][ ]            2[ ][ ][ ][ ]3[ ][ ][ ][ ]            3[ ][ ][*][ ]4[ ][*][ ][ ]            4[*][*][ ][ ]"""import random, copy, time, textwrap # copy nos proporciona operaciones genericas de copiado
# Declaración de constantes.DIMENSION_ = 6TURNO_ = 4

# Imprime el mapadef __imprimir_mapa__(jugador, mesa, dimension):
    player = 'la computadora'    if jugador == 'u':
        player = 'el jugador'
    print "\033[1m"+ 'La mesa de ' + player + ' se ve así:' + "\033[0m"    # Imprimir el número de columna    for i in range(dimension):
        print '   ' + str(i+1) + '',    print ' '
    for i in range(dimension):
        # Imprimir el número de fila        print str(i+1) + '',        # Imprime los valores de las celdas        for j in range(dimension):
            if mesa[i][j] == -1:
                print '[ ] ', # Imprime la mesa vacía por primera vez (ésto sólo se ejecuta la primera vez)            elif jugador == 'u':
                print mesa[i][j], # Aquí se imprime la mesa del jugador, puede contener [] o [S]            elif jugador == 'c': # Si el jugador es computadora se imprime su mesa                if mesa[i][j] == '[!] ' or mesa[i][j] == '[*] ':
                    print mesa[i][j],                else:
                    print '[ ] ',        print ' '

# Obtener coordenadas usuariodef __obtener_coordenada__(dimension):
    while True:
        user_input = raw_input("\033[1m"+'Por favor, ingresa las coordenadas (columna,fila): ' + "\033[0m")
        try:
            # Verificar si el usuario ingresó 2 valores separados por coma            coor = user_input.split(',')
            if len(coor) != 2:
                raise Exception("\033[1m"+'Entrada invalida, pocas/muchas coordenadas' + "\033[0m")

            coor[0] = int(coor[0]) -1            coor[1] = int(coor[1]) -1
            # Verifica si están dentro del limite            if coor[0] > dimension-1 or coor[0] < 0 or coor[1] > dimension-1 or coor[1] < 0:
                exc = "\033[1m"+'Entrada invalida, ingresa valores entre 1 y ', str(dimension) ,' solamente.' + "\033[0m"                raise Exception(exc)

            # Si todo esta bien, devuelvelo            return coor
        except ValueError:
            print "\033[1m"+'Entrada inválida, ingresa sólo dos coordenadas' + "\033[0m"        except Exception as e:
            print e


# La computadora escoge por randomdef __computadora_escoge__(mesa_computadora, DIMENSION_, turno):
    lista_comp = [] # Se crea una lista con la cantidad de turno que se pasen por parametro
    for i in range(DIMENSION_):
        lista_comp.append(i) # En caso de DIMENSION_ = 8 E lista_comp = ['1','2','3','4','5','6','7','8']
    # Variable auxiliar para controlar el flujo de turnos    m = 0
    while m < turno:
        # Se escoge un número.        escoger_coordenada_x_comp = random.choice(lista_comp)
        escoger_coordenada_y_comp = random.choice(lista_comp)
        validacion = __validar__('c',escoger_coordenada_x_comp, escoger_coordenada_y_comp)
        if validacion:
            m = m - 1        else:
            m = m + 1    print "\033[1m"+'La computadora ya colocó sus submarinos' + "\033[0m"    return mesa_computadora


# Colocar submarinodef __colocar_submarino__(mesa, x, y):
    mesa[x][y] = '[S] '    return mesa


# Validacion de que ya se ingresaron esas coordenadascoordenadas_usuario = []
coordenadas_computadora = []
def __validar__(player,x,y):

    individual = str(x+1)+str(y+1)

    if player == 'u':
        if individual in coordenadas_usuario:
            return True        else:
            coordenadas_usuario.append(individual)
            return False    elif player == 'c':
        if individual in coordenadas_computadora:
            return True        else:
            coordenadas_computadora.append(individual)
            return False

# El usuario escogedef __usuario_escoge__(mesaus, DIMENSION_,turno):
    p = 0    while True:

        p = p + 1
        __imprimir_mapa__('u',mesaus, DIMENSION_)

        if p > turno:
            break
        print "\033[1m"+ 'Colocando un submarino: ' + "\033[0m"        x, y = __obtener_coordenada__(DIMENSION_) # Obtiene coordenadas (x,y) del 0 a dimension        validacion = __validar__('u',x,y) # Devuelve True si dicha coordenada ya fue ingresada, False si no
        # Si la coordenada ya se ingresó se resta un turno        if validacion:
            p = p - 1            print "\033[1m"+ 'Verifica el mapa, ya hay un submarino en esa coordenada' + "\033[0m"        else: # Si la coordenada no se ha ingresado, se coloca el submarino en la mesa            __colocar_submarino__(mesaus, x, y)
    raw_input("\033[1m"+'Se han colocado todos los submarinos, presiona ENTER para continuar' + "\033[0m") # Una 'pausa'
    return mesaus


# Configurar tabla de juegodef __configurar_mesa__(mesa, dmnsn):
    # Esta función rellena la mesa de dmnsn * dmnsn con -1    for i in range(dmnsn):
        __mesa_fila__ = []
        for j in range(dmnsn):
            __mesa_fila__.append(-1)
        mesa.append(__mesa_fila__)


ataques_jugador = []
ataques_computadora = []
# Verifica si dio en el blancodef __validar_ataque__(mesa,player, x, y):
    """    __validar_ataque__ es una función que entra después de que las coordenadas hayan sido ingresadas para el ataque.    Retorna un número (-1,0,1) dependiendo a dónde fue el misil    :param mesa: De qué mesa se trata    :param player: A qué jugador atacar. c = computadora; u = usuario    :param x: La coordenada x    :param y: La coordenada y    :return: -1 si la coordenada ya se ingresó anteriormente    :return: 1 si la coordenada ingresada dió en el blanco    :return: 0 si la coordenada ingresada no dió en el blanco    """    coordenada = str(x+1) + str(y+1)
    if player == 'c':  # Turno del usuario        if coordenada in ataques_jugador:
            return -1        else:
            if coordenada in coordenadas_computadora:
                mesa[x][y] = '[!] '                ataques_jugador.append(coordenada)
                return 1            else:
                mesa[x][y] = '[*] '                ataques_jugador.append(coordenada)
                return 0    elif player == 'u':  # Turno de la computadora        if coordenada in ataques_computadora:
            return -1        else:
            if coordenada in coordenadas_usuario:
                mesa[x][y] = '[!] '                ataques_computadora.append(coordenada)
                return 1            else:
                mesa[x][y] = '[*] '                ataques_computadora.append(coordenada)
                return 0

# El jugador ingresa coordendas para mandar misildef __jugador_ataca__(mesacomp,dimension):
    """    Obtiene las coordenadas del usuario y hace el ataque.    Si el jugador da en el blanco, cambia a  [!] y suma punto.    :param mesacomp:    :param dimension:    :return:    """    global pts_jugador
    while True:
        x, y = __obtener_coordenada__(dimension)

        validacion = __validar_ataque__(mesacomp, 'c', x, y)

        if validacion == -1:
            print "\033[1m"+'Ya se ha mandado un mísil a dicha coordenada, intenta de nuevo' + "\033[0m"        elif validacion == 0:
            print "\033[1m"+'Mísil mandado a ' + str(x+1) + ',' + str(y+1) + "\033[0m"            time.sleep(1)
            print "\033[1m"+'El mísil no dió en el blanco :(' + "\033[0m"            return mesacomp
        elif validacion == 1:
            print "\033[1m"+'Mísil mandado a ' + str(x+1) + ',' + str(y+1) + "\033[0m"            time.sleep(1)
            print "\033[1m"+'¡El mísil dió en el blanco!' + "\033[0m"            pts_jugador = pts_jugador + 1            return mesacomp


# La computadora elige aleatoriamente las coordenadasdef __computadora_ataca__(mesaus, DIMENSION_):
    global pts_computadora

    intento = True
    while intento:
        # Se elige aleatoriamente las coordenadas        x = random.randint(0, DIMENSION_ - 1)
        y = random.randint(0, DIMENSION_ - 1)

        validacion = __validar_ataque__(mesaus, 'u', x, y)

        if validacion == -1:
            print "\033[1m"+'La computadora ya mandó un mísil a esa coordenada, lo volverá a intentar' + "\033[0m"            intento = True        elif validacion == 0:
            print "\033[1m" + 'Mísil mandado a ' + str(x + 1) + ',' + str(y + 1) + "\033[0m"            time.sleep(1)
            print "\033[1m"+'Excelente, la computadora no dió en el blanco' + "\033[0m"            intento = False            return mesaus
        elif validacion == 1:
            print "\033[1m" + 'Mísil mandado a ' + str(x + 1) + ',' + str(y + 1) + "\033[0m"            time.sleep(1)
            print "\033[1m"+'La computadora ha destruido uno de tus submarinos' + "\033[0m"            pts_computadora = pts_computadora + 1            intento = False            return mesaus


def __juego__():
    print "\033[1m"+ '== BATALLA NAVAL ==' + "\033[0m"    # AQUÍ VA LA HISTORIA    msg=('Instrucciones: '              'Hay dos mesas de la misma dimensión y te enfrentaras a un enemigo desconocido :3 '              'Primero ingresaras las coordenadas donde se localizara tus submarinos (columna,fila) Ej. 3,2 '              'posteriormente, el enemigo colocara sus submarinos, por defecto estaran ocultos para ti.'              ' El objetivo es mandar mísiles con las coordenadas que ingresaste para atacar al enemigo.'              ' Gana el primero en derribar todos los submarinos')
    mesa = []
    __configurar_mesa__(mesa, DIMENSION_) # Configura una mesa de DIMENSION_ * DIMENSION_    print(textwrap.fill(msg, width=112))
    # Configurar la mesa del usuario y computadora. Se copia la mesa a mesa_usuario y mesa_computadora    mesa_usuario = copy.deepcopy(mesa)
    mesa_computadora = copy.deepcopy(mesa)

    #                                           COLOCACIÓN DE SUBMARINOS    # El usuario escoge coordenadas    mesa_usuario = __usuario_escoge__(mesa_usuario, DIMENSION_,TURNO_)
    # print coordenadas_usuario    # La computadora escoge coordenadas    mesa_computadora = __computadora_escoge__(mesa_computadora, DIMENSION_, TURNO_)
    # print coordenadas_computadora
    # Main loop    while 1:

        #        #                                               Turno del jugador        # Jugador ingresa coordenadas para atacar a la computadora        mesa_computadora = __jugador_ataca__(mesa_computadora, DIMENSION_) # Por eso se está modificando la mesa_computadora        # Si pasó la validación, pasa a atacar
        if pts_jugador == TURNO_:
            print "\033[1m"+ 'Has derrivado todos los submarinos de la computadora, ¡HAS GANADO!' + "\033[0m"            raw_input("\033[1m"+ 'Presiona ENTER para terminar' + "\033[0m")
            quit()

        # Muestra el mapa enemigo, si dió en el blanco [!], si no, [*]        __imprimir_mapa__('c',mesa_computadora,DIMENSION_)
        raw_input('Presiona ENTER para continuar')
        # Si dió en el blanco[!], se incrementa un punto        #        #                                               Turno del enemigo        # Computadora 'adivina' las coordenadas        mesa_usuario = __computadora_ataca__(mesa_usuario, DIMENSION_)
        # Se valida si la PC ya atacó a esa coordenada        #        if pts_computadora == TURNO_:
            print "\033[1m"+ 'La computadora ha derrivado todos tus submarinos, has perdido.' + "\033[0m"            raw_input("\033[1m"+ 'Presiona ENTER para terminar' + "\033[0m")
            quit()
        # Si pasó la validación, pasa a atacar        # Muestra el mapa enemigo, si dio en blanco [!], si no, [o]        __imprimir_mapa__('u',mesa_usuario,DIMENSION_)
        # Si dió en el blanco[!], se incrementa un punto        #

if __name__ == '__main__':
    pts_jugador = 0    pts_computadora = 0    __juego__()


Comentarios

Entradas populares de este blog

Tema 1 Introduccion a los ambientes de graficacion

Menú Figura Polígonos

Figura steve Tkinter