Skip to content

Instantly share code, notes, and snippets.

@ricardosiri68
Last active January 1, 2016 15:58
Show Gist options
  • Select an option

  • Save ricardosiri68/f35b767cdab3800da7f1 to your computer and use it in GitHub Desktop.

Select an option

Save ricardosiri68/f35b767cdab3800da7f1 to your computer and use it in GitHub Desktop.
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()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment