Criando uma tabela de classificação para jogos offline no Python
Para um projeto da escola, estou criando um jogo que possui um sistema de pontuação e gostaria de criar algum tipo de tabela de classificação. Uma vez terminados, os professores farão o upload para um servidor compartilhado, onde outros alunos podem baixar uma cópia do jogo, mas infelizmente os alunos não podem salvar nesse servidor; se pudéssemos, as tabelas de classificação seriam um pedaço de bolo. Haveria no máximo algumas centenas de partituras para acompanhar, e todos os computadores têm acesso à Internet.
Não sei muito sobre servidores ou hospedagem, e não conheço java, html ou qualquer outro idioma comumente usado no desenvolvimento web, portanto outras questões relacionadas não ajudam. Meu jogo imprime as informações de pontuação em um arquivo de texto e, a partir daí, não sei como obtê-las em algum lugar on-line que todos possam acessar.
Existe uma maneira de realizar essa tarefa com apenas python?
Aqui eu tenho o código para atualizar um arquivo de cabeçalho (assumindo que seria apenas um arquivo de texto) depois de obter as pontuações. Isso presumiria que eu tinha uma cópia da tabela de classificação e o arquivo de pontuação no mesmo local.
Este é o formato do meu cabeçalho de simulação (Leaderboards.txt):
Leaderboards
1) JOE 10001
2) ANA 10000
3) JAK 8400
4) AAA 4000
5) ABC 3999
Isto é o que o arquivo de log imprimiria - as iniciais e a pontuação (log.txt):
ABC
3999
Código (funciona para python 2.7 e 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)
Mais algumas informações:
A pontuação seria inferior a 1 000 000Idealmente, a solução seria apenas um código externo ao jogo, para que eu apenas tornasse um executável que o usuário executaria depois que terminasseEu sei que não parece muito seguro - e não é - mas tudo bem, não precisa ser à prova de hackers