Crear una tabla de clasificación para un juego fuera de línea en Python
Para un proyecto escolar, estoy creando un juego que tiene un sistema de puntuación, y me gustaría crear algún tipo de tabla de clasificación. Una vez terminado, los maestros lo subirán a un servidor compartido donde otros estudiantes pueden descargar una copia del juego, pero desafortunadamente los estudiantes no pueden guardar en ese servidor; si pudiéramos, las tablas de clasificación serían pan comido. A lo sumo, habría un centenar de puntajes para realizar un seguimiento, y todas las computadoras tienen acceso a Internet.
No sé mucho sobre servidores o alojamiento, y no sé java, html o cualquier otro lenguaje comúnmente utilizado en el desarrollo web, por lo que otras preguntas relacionadas realmente no ayudan. Mi juego imprime la información de puntuación en un archivo de texto, y desde allí no sé cómo obtenerla en algún lugar en línea al que todos puedan acceder.
¿Hay alguna manera de lograr tal tarea con solo Python?
Aquí tengo el código para actualizar un archivo de clasificación (suponiendo que solo sea un archivo de texto) una vez que tenga los puntajes. Esto supondría que tenía una copia de la tabla de clasificación y el archivo de puntuación en el mismo lugar.
Este es el formato de mi simulacro de clasificación (Leaderboards.txt):
Leaderboards
1) JOE 10001
2) ANA 10000
3) JAK 8400
4) AAA 4000
5) ABC 3999
Esto es lo que imprimiría el archivo de registro: las iniciales y la puntuación (log.txt):
ABC
3999
Código (funciona tanto para python 2.7 como para 3.3):
def extract_log_info(log_file = "log.txt"):
with open(log_file, 'r') as log_info:
new_name, new_score = [i.strip('\n') for i in log_info.readlines()[:2]]
new_score = int(new_score)
return new_name, new_score
def update_leaderboards(new_name, new_score, lb_file = "Leaderboards.txt"):
cur_index = None
with open(lb_file, 'r') as lb_info:
lb_lines = lb_info.readlines()
lb_lines_cp = list(lb_lines) # Make a copy for iterating over
for line in lb_lines_cp:
if 'Leaderboards' in line or line == '\n':
continue
# Now we're at the numbers
position, name, score = [ i for i in line.split() ]
if new_score > int(score):
cur_index = lb_lines.index(line)
cur_place = int(position.strip(')'))
break
# If you have reached the bottom of the leaderboard, and there
# are no scores lower than yours
if cur_index is None:
# last_place essentially gets the number of entries thus far
last_place = int(lb_lines[-1].split()[0].strip(')'))
entry = "{}) {}\t{}\n".format((last_place+1), new_name, new_score)
lb_lines.append(entry)
else: # You've found a score you've beaten
entry = "{}) {}\t{}\n".format(cur_place, new_name, new_score)
lb_lines.insert(cur_index, entry)
lb_lines_cp = list(lb_lines) # Make a copy for iterating over
for line in lb_lines_cp[cur_index+1:]:
position, entry_info = line.split(')', 1)
new_entry_info = str(int(position)+1) + ')' + entry_info
lb_lines[lb_lines.index(line)] = new_entry_info
with open(lb_file, 'w') as lb_file_o:
lb_file_o.writelines(lb_lines)
if __name__ == '__main__':
name, score = extract_log_info()
update_leaderboards(name, score)
Alguna información más:
La puntuación sería inferior a 1 000 000Idealmente, la solución sería un código externo al juego, de modo que simplemente creara un archivo ejecutable que el usuario ejecutaría después de haber terminadoSé que no suena muy seguro, y no lo es, pero está bien, no es necesario que sea a prueba de piratería