Last active
January 1, 2016 15:58
-
-
Save ricardosiri68/f35b767cdab3800da7f1 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import os | |
| def mostrar_puntajes(): | |
| '''obtiene los puntajes almacenados en puntajes.csv y los muestra en la | |
| pantalla''' | |
| print("## Puntajes ##\n") | |
| with open('puntajes.csv') as puntajes_file: | |
| for puntaje in puntajes_file: | |
| jugador, valor = puntaje.split(',') | |
| print(' %s: %s' % (jugador, valor.strip())) | |
| def guardar_puntajes(ganador): | |
| '''obtiene los puntajes almacenados en puntajes.csv e incrementa en 1 el | |
| puntaje del ganador''' | |
| puntajes = {} # un diccionario vacio donde se alojaran los puntajes | |
| # abrimos el archivo en modo lecutra para recuperar los puntajes y | |
| # apuntarlos en el diccionario .puntajes linea por linea | |
| with open('puntajes.csv') as puntajes_file: | |
| for puntaje in puntajes_file: | |
| jugador, valor = puntaje.split(',') | |
| puntajes[jugador] = int(valor) | |
| # abrimos el archivo en modo escitura para guardar el incremento del puntaje | |
| # del ganaador | |
| with open('puntajes.csv', 'w') as puntajes_file: | |
| puntajes[ganador] += 1 # incremento del puntaje | |
| puntajes_file.write('') | |
| for jugador, valor in puntajes.items(): | |
| puntajes_file.writelines('%s, %s\n' % (jugador, valor)) | |
| def modifica_tablero(tablero, posicion, marca): | |
| '''modifica el valor en el tablero con la marca del jugador y su jugada''' | |
| tablero[posicion - 1] = marca | |
| def dibuja_tablero(tablero): | |
| '''representa el tablero en pantalla''' | |
| # limpia la pantalla para dibuar nuevamente el tablero | |
| os.system('cls' if os.name == 'nt' else 'clear') | |
| # formato de salida de cada fila: X X X | |
| formato_fila = " %s %s %s" # tiene un margen lateral | |
| mostrar_puntajes() | |
| print("") | |
| print("## Tablero ##\n") | |
| # recorre los punteros 0, 3 y 6 | |
| for i in range(0, 9, 3): | |
| # selecciona un rango de 3 elmentos del tablero (fila) para imprimir | |
| print(formato_fila % tuple(tablero[i:i + 3])) | |
| print("\n") | |
| def buscar_linea(jugador, tablero): | |
| '''busca una linea completa por un jugador en cualquier direccio''' | |
| horizontal = [ # dispocicion de los punteros en las lineas horizontales: | |
| [0, 1, 2], # 1 2 3 | |
| [3, 4, 5], # X X X | |
| [6, 7, 8] # 7 8 9 | |
| ] | |
| vertical = [ # dispocicion de los punteros en las lineas verticales | |
| [0, 3, 6], # 1 X 3 | |
| [1, 4, 7], # 4 X 6 | |
| [2, 5, 8] # 7 X 9 | |
| ] | |
| diagonal = [ # dispocicion de los punteros en las lineas diagonales | |
| [0, 4, 8], # X 2 3 | |
| [2, 4, 6] # 4 X 6 | |
| ] # 7 8 X] | |
| linea_ganadora = [jugador] * 3 # ej: ["X", "X", "X"] | |
| # recorremos todas las alineaciones | |
| for alineacion in [horizontal, vertical, diagonal]: | |
| for linea in alineacion: # y cada linea de la alineacion | |
| # llena la <<linea>> con los valores del tablero y lo compara con la | |
| # linea ganadora | |
| if linea_ganadora == [tablero[i] for i in linea]: | |
| return True | |
| def revisa_tablero(tablero): | |
| '''revisa el tablero en busca de un ganador ya sea X | O''' | |
| gana = None | |
| gana = "X" if buscar_linea("X", tablero) else gana | |
| gana = "O" if buscar_linea("O", tablero) else gana | |
| return gana | |
| def opcion_valida(tablero, opcion): | |
| '''evalua la opcion ingresada por los jugadores si esta desata un error o es | |
| invalida para alguna condicion devuelve invalido''' | |
| indices = list(range(1, 10)) | |
| try: | |
| opcion = int(opcion) | |
| except ValueError: | |
| error_msj = "Debe Ingresar un numero Entero" | |
| input(error_msj) | |
| return False | |
| if opcion not in indices: | |
| error_msj = "El numero entero tiene que ser entre 1-9" | |
| input(error_msj) | |
| return False | |
| if opcion not in tablero: | |
| error_msj = "El el casillero perteneciente al numero debe encontrarse\ | |
| \n desocupado" | |
| input(error_msj) | |
| return False | |
| return True | |
| def ingresar_opcion(tablero, jugador): | |
| '''registra la entrada de la opcion que ingresa el jugador''' | |
| dibuja_tablero(tablero) | |
| msj = "Ingrese posición en el tablero para %s: " % jugador | |
| opcion_jugador = input(msj) | |
| if opcion_valida(tablero, opcion_jugador): | |
| # .modifica_tablero retorna None pero nos saca de la recursion | |
| return modifica_tablero(tablero, int(opcion_jugador), jugador) | |
| # si la opcion no es valida la funcion recurre a si misma nuevamente | |
| return ingresar_opcion(tablero, jugador) | |
| def mostrar_resultados(ganador): | |
| '''muestra los resultados de la partida''' | |
| print("Resultado") | |
| print("Gano = %s" % ganador if ganador else "No hay gandor") | |
| print("Gracias por Jugar") | |
| def main(): | |
| '''bloque principal del programa''' | |
| tablero = list(range(1, 10)) | |
| jugador = "O" | |
| for i in range(9): | |
| jugador = "X" if jugador == "O" else "O" | |
| ingresar_opcion(tablero, jugador) | |
| ganador = revisa_tablero(tablero) | |
| # si encuentra un ganador corta el recorrido | |
| if ganador: | |
| break | |
| # dibuja el tablero una ultima vez para mostrar la partida completa | |
| dibuja_tablero(tablero) | |
| mostrar_resultados(ganador) | |
| guardar_puntajes(ganador) | |
| if __name__ == '__main__': | |
| main() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| O | 0 | |
|---|---|---|
| X | 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment