Juego de Nicol y Hugo





# coding=utf-8



"""

                                                    BATALLA NAVAL

Representación de cómo se verá el juego

 COMPUTADORA                JUGADOR

  1  2  3  4               1  2  3  4

1[*][ ][ ][*]            1[ ][*][ ][ ]

2[ ][*][ ][ ]            2[ ][ ][ ][ ]

3[ ][ ][ ][ ]            3[ ][ ][*][ ]

4[ ][*][ ][ ]            4[*][*][ ][ ]

"""

import random, copy, time, textwrap # copy nos proporciona operaciones genericas de copiado



# Declaración de constantes.

DIMENSION_ = 6

TURNO_ = 4





# Imprime el mapa

def __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 usuario

def __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 random

def __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 submarino

def __colocar_submarino__(mesa, x, y):

    mesa[x][y] = '[S] '

    return mesa





# Validacion de que ya se ingresaron esas coordenadas

coordenadas_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 escoge

def __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 juego

def __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 blanco

def __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 misil

def __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 coordenadas

def __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 más populares de este blog

Ejercicios en PyCharm

1.1 Aplicaciones gráficas por computadora.

Ensayo de lenguaje ensamblador