Advertisement
Guest User

Untitled

a guest
Sep 26th, 2016
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.98 KB | None | 0 0
  1. import random
  2. import os
  3.  
  4. ON = "O"
  5. OFF = "X"
  6.  
  7. uno = {
  8.     "A" : [1,2,4,5],
  9.     "B" : [1,3,5],
  10.     "C" : [2,3,4],
  11.     "D" : [1,3,5],
  12.     "E" : [1,2,4,5]
  13. }
  14.  
  15. dos = {
  16.     "A" : [2,3],
  17.     "B" : [1,2,4,5],
  18.     "C" : [2,4],
  19.     "D" : [1,3,5],
  20.     "E" : [1,3,5]
  21. }
  22.  
  23. tres = {
  24.     "A" : [1,5],
  25.     "B" : [1,2,4,5],
  26.     "C" : [3],
  27.     "D" : [1,3],
  28.     "E" : [1,3,4]
  29. }
  30.  
  31. cuatro = {
  32.     "A" : [1,2,4,5],
  33.     "C" : [1,2,4,5],
  34.     "D" : [5],
  35.     "E" : [1,2]
  36. }
  37.  
  38. cinco = {
  39.     "A" : [4,5],
  40.     "B" : [4,5],
  41.     "D" : [1,2],
  42.     "E" : [1,2]
  43. }
  44.  
  45.  
  46. NIVELES = [uno, dos, tres, cuatro, cinco]
  47.  
  48. def crear_tablero(dimension=5):
  49.     """Crea y devuelve un tablero definido por la dimension"""
  50.     tam_tablero = dimension +1
  51.     tablero = []
  52.     for fila in range(tam_tablero):
  53.         tablero.append([" "]*(tam_tablero))  #+1 para los indices
  54.     return tablero
  55.  
  56. def formato_tablero(tablero):
  57.     """Da formato a las filas y columnas"""
  58.     dimension = len(tablero)
  59.     for i in range(1, dimension):
  60.         if i == 1:
  61.             tablero[0][i] = "  " + chr(64 + i)
  62.         else:
  63.             tablero[0][i] = chr(64+i)
  64.     for i in range(1, dimension):
  65.         if i == 10:
  66.             tablero[i][0] = "10" + "|"
  67.         else:
  68.             tablero[i][0] = " " + chr(48+i) + "|"
  69.     for i in range(1, dimension):
  70.         for j in range(1, dimension):
  71.             tablero[i][j] = OFF
  72.  
  73. def mostrar_tablero(tablero):
  74.     """Imprime un tablero en pantalla"""
  75.     for fila in range(len(tablero)):
  76.         if fila == 0:
  77.             print(" ".join(tablero[fila]))
  78.         else:
  79.             print(" ".join(tablero[fila]))
  80.  
  81. def validar_entrada(entrada, dimension = 5):
  82.     """Valida que el usuario ingrese una posicion dentro del rango"""
  83.     letra = entrada[0] #va del 1-10, va a ser siempre una unica letra
  84.     numero = entrada[1:] #puede ser mas largo que uno (10)
  85.     if numero.isdigit() and not letra.isdigit():
  86.         valor_letra = ord(letra.upper()) - 64
  87.         valor_numero = int(numero) + 1
  88.         if( 0 < valor_letra <= dimension+1 and 0 < valor_numero <= dimension+1):
  89.             return True
  90.     return False
  91.  
  92.  
  93. def entrada_a_coordenada(entrada):
  94.     """Pasa la entrada a letra y numero"""
  95.     y = ord(entrada[0].upper()) - 64
  96.     x = int(entrada[1])
  97.     return x, y
  98.  
  99.  
  100. def crear_nivel(tablero, nivel):
  101.     """Crea el nivel tomando como clave la columna, y en fila los numeros respectivos a la letra, que son las posiciones
  102.    de las luces encendidas"""
  103.     for fila in nivel:
  104.         for columna in nivel[fila]:
  105.             x,y = entrada_a_coordenada(fila+str(columna))
  106.             tablero[x][y] = ON
  107.  
  108.  
  109. def swap_offon(tablero, x, y):
  110.     """Cambia el estado de las luces en el tablero"""
  111.     if tablero[x][y] == ON:
  112.         tablero[x][y] = OFF
  113.     else:
  114.         tablero[x][y] = ON
  115.  
  116.  
  117. def validar_on_off(tablero, pos, mov):
  118.     """Se fija en los casos borde donde cambia el estado de las luces, valida que estas esten dentro del tablero"""
  119.     tam = len(tablero)
  120.     x = pos[0] - mov[0]
  121.     y = pos[1] - mov[1]
  122.     if (x < tam and x > 0) and (y < tam and y > 0):
  123.         swap_offon(tablero, x, y)
  124.  
  125.  
  126. def mov_onoff(tablero, pos):
  127.     """Cambia el estado de las luces proximas a la afectada, arriba abajo derecha izquierda"""
  128.     direcciones = [(0, 1), (0, -1), (1, 0), (-1, 0)]
  129.     for mov in direcciones:
  130.         validar_on_off(tablero, pos, mov)
  131.     swap_offon(tablero, pos[0], pos[1])
  132.  
  133. def gano_partida(tablero):
  134.     """Chequea que todas las fichas del tablero esten apagadas para declarar el juego ganado"""
  135.     dimension = len(tablero)
  136.     for i in range(1, dimension):
  137.         for j in range(1, dimension):
  138.             if tablero[i][j] != OFF: #SI TODAS LAS LUCES ESTAN APAGADAS
  139.                 return False
  140.     return True
  141.  
  142. def luces_en_on(tablero):
  143.     """Cuenta la cantidad de luces que hay encendidas en el tablero"""
  144.     luces_on = 0
  145.     dimension = len(tablero)
  146.     for i in range(1, dimension):
  147.         for j in range(1, dimension):
  148.             if tablero[i][j] != OFF:
  149.                 luces_on += 1
  150.     return luces_on
  151.  
  152.  
  153. def condiciones_iniciales(nivel, tam_tablero):
  154.     """Setea al tablero a las condiciones cero para cuando el usuario elija resetear el nivel"""
  155.     tablero = crear_tablero(tam_tablero)
  156.     formato_tablero(tablero)
  157.     crear_nivel(tablero, nivel[0])
  158.     return tablero
  159.  
  160.  
  161. def jugar_onoff(nivel, tam_tablero=5):
  162.     """Realiza el proceso de jugar"""
  163.     gano = False
  164.     tablero = condiciones_iniciales(nivel, tam_tablero)
  165.     turnos = len(tablero) * 3
  166.     puntaje = 0
  167.     os.system('cls' if os.name == 'nt' else 'clear')
  168.     while not gano and turnos != 0:
  169.         turnos -= 1
  170.         print("-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-")
  171.         print(nivel[1])
  172.         mostrar_tablero(tablero)
  173.         entrada_valida = True
  174.  
  175.         while entrada_valida:
  176.             coordenada = input("ingrese la fila y la columna en formato A:1")
  177.             entrada_valida = not validar_entrada(coordenada)
  178.  
  179.         coordenada = entrada_a_coordenada(coordenada)
  180.         mov_onoff(tablero, coordenada)
  181.         reset = input("Desea Resetear el Nivel? S para continuar, si no, precione cualquier tecla")
  182.  
  183.         if reset.upper() == "S":
  184.             tablero = condiciones_iniciales(nivel, tam_tablero)
  185.             turnos = len(tablero) * 3
  186.             puntaje += -50 * luces_en_on(tablero)
  187.             mostrar_tablero(tablero)
  188.             print ("El puntaje parcial es" + str(puntaje))
  189.     #LIMPIA LA PANTALLA    
  190.         os.system('cls' if os.name == 'nt' else 'clear')
  191.         gano = gano_partida(tablero)
  192.  
  193.     if gano:
  194.         puntaje += 500
  195.     else:
  196.         puntaje += -300
  197.     print("Nivel Completado")
  198.     return puntaje
  199.  
  200.  
  201. def niveles_predeterminado():
  202.     """Setea el nivel acorde a nom_nivel, que son los niveles predeterminados"""
  203.  
  204.     nom_nivel = ["Uno", "Dos", "Tres", "Cuatro", "Cinco"]
  205.     puntaje_total = 0
  206.     print("LightsOut:")
  207.     for nivel, nom in zip(NIVELES, nom_nivel):
  208.         puntaje_nivel = 0
  209.         puntaje_nivel = jugar_onoff((nivel,"nivel: " + nom))
  210.         puntaje_total += puntaje_nivel
  211.         print("El puntaje obtenido en este nivel fue de ", puntaje_nivel, "y el puntaje total de esta partida es de ", puntaje_total)
  212.  
  213.  
  214. def niveles_random(tam_tablero):
  215.     """Del modulo random importa randrange, que va a dar valores aleatorios a las coordenadas x e y, formando asi los
  216.    niveles aleatorios"""
  217.  
  218.     puntaje_total = 0
  219.     nivel_random = {}
  220.     print("LightsOut:")
  221.     for nivel in range(5):
  222.         for i in range(random.randrange(1, (tam_tablero*3))):
  223.             x = random.randrange(1, tam_tablero)
  224.             y = random.randrange(1, tam_tablero)
  225.             x = chr(64+x)
  226.             if x in nivel_random:
  227.                 nivel_random[x].append(y)
  228.             else:
  229.                 nivel_random[x] = [y]
  230.         puntaje_nivel = jugar_onoff((nivel_random,"nivel " + str(nivel+1)), tam_tablero)
  231.         puntaje_total += puntaje_nivel
  232.         print("El puntaje obtenido en este nivel fue de ", puntaje_nivel, "y el puntaje total de esta partida es de ", puntaje_total)
  233.  
  234.  
  235. def main():
  236.     """Llama a todas las funciones correspondientes para jugar a Lightsout"""
  237.     print("Bienvenido a Lightsout")
  238.     modo_de_juego = (input("Ingrese opcion, "
  239.                               "A: modo predeterminado "
  240.                               "B: modo aleatorio. "
  241.                               "C: salir")).upper()
  242.  
  243.     if modo_de_juego == "A":
  244.         niveles_predeterminado()
  245.     elif modo_de_juego == "B":
  246.         dimension_valida = False
  247.         while not dimension_valida:
  248.             dimension = int(input("Ingrese una dimension para el tablero, tiene que ser entre 5 y 10."))
  249.             if dimension <= 10 and dimension >= 5:
  250.                 dimension_valida = True
  251.  
  252.         os.system('cls' if os.name == 'nt' else 'clear')
  253.         niveles_random(dimension)
  254.     elif modo_de_juego == "c":
  255.         exit()
  256.     else:
  257.         os.system('cls' if os.name == 'nt' else 'clear')
  258.         main()
  259.  
  260. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement