Leer archivos y posicionar mejores puntajes

Buenos días, en mi juego en pilas, me pidieron leer archivos, y quería ver si me podían ayudar a entender como puedo hacerlo, ademas en mi juego debo de ingresar usuarios para que juegen, guardar sus puntajes e ir posicionando el mayor punntaje y el menor puntaje de los 5 primeros(es decir de los mejores puntajes) Y eso no puedo hacer.
Gracias.

Hola @Cristian_Lozano !!!

Es muy interesante tu consulta, se puede hacer de muchas formas diferentes en realidad. Lo que te recomendaría es pensar todo el asunto de puntajes en varias partes.

Por ejemplo, los puntajes podrías almacenarlos en una lista en memoria, con una estructura similar a la siguiente:

puntajes = [
    {"nombre": "pepe", "puntos": 12},
    {"nombre": "juan", "puntos": 10},
    {"nombre": "demo", "puntos":  90},
    {"nombre": "otro", "puntos":  2},
    {"nombre": "tito", "puntos":  1},
]

luego, para guardar o leer los puntajes desde archivos, crear algunas funciones de utilidad:

import os

RUTA = "/Users/hugoruscitti/mini-juego/puntajes.txt"
# O bien RUTA = "C:/mis-puntajes.txt"

def guardar_puntajes(puntajes):
    print("Guardando el archivo: " + RUTA)
    archivo = open(RUTA, 'wt')

    for puntaje in puntajes:
        nombre = puntaje['nombre']
        puntos_como_cadena = str(puntaje['puntos'])
        archivo.write(nombre + ":" + puntos_como_cadena + "\n")
    archivo.close()

def cargar_puntajes_del_archivo():
    print("Leyendo el archivo: " + RUTA)
    archivo = open(RUTA, 'rt')
    lineas = archivo.readlines()
    puntajes = []
    for linea in lineas:
        nombre, puntos_como_cadena = linea.split(":")
        puntajes.append({
            "nombre": nombre, 
            "puntos": int(puntos_como_cadena)
        })
    archivo.close()  
    return puntajes


def existe_archivo():
    if os.path.exists(RUTA):
        print("Existe el archivo")
        return True
    else:
        print("No existe el archivo")

Parece mucho código al principio, pero tener separadas en funciones estas operaciones te va a simplificar el resto del código.

Por ejemplo, se me ocurrió que al momento de empezar el juego podría haber un listado de puntajes “de fábrica” y luego, si no existe el archivo de puntajes se genere automáticamente.

# Genera el archivo con los puntajes por omision si no existe
if not existe_archivo():
    guardar_puntajes(puntajes)    
else:
    puntajes = cargar_puntajes_del_archivo()

Así te tendría que quedar el archivo generado:

Es decir, cada puntaje en una sola linea de texto, separando el nombre del puntaje con el caracter “:”

Por último, te dejo algunas funciones de utilidad extra:

def convertir_puntaje_en_texto(puntajes):
    texto = ""
    for puntaje in puntajes:
        texto += puntaje['nombre']
        texto += ": "
        texto += str(puntaje['puntos'])
        texto += "\n"
    return texto
    
    
def ordenar_puntajes(puntajes):
    puntajes.sort(key=lambda p: p['puntos'], reverse=True)


# Con las siguientes llamadas ordenamos los puntajes de mayor a menor
ordenar_puntajes(puntajes)

# Con el siguiente código hacemos que aparezca el puntaje en pantalla como un actor.
texto_a_mostrar = convertir_puntaje_en_texto(puntajes)
pilas.actores.Texto(texto_a_mostrar, ancho=400)

Avisanos si este enfoque te sirve y seguimos.

¡Abrazo!

1 Like

Muchs gracias @hugoruscitti , importante y muy util y muy didactico.