Erstellen einer Bestenliste für Offline-Spiele in Python
Für ein Schulprojekt erstelle ich ein Spiel mit einem Punktesystem und möchte eine Art Bestenliste erstellen. Sobald dies abgeschlossen ist, laden die Lehrer es auf einen gemeinsam genutzten Server hoch, auf den andere Schüler eine Kopie des Spiels herunterladen können. Leider können die Schüler nicht auf diesem Server speichern. Wenn wir könnten, wären Bestenlisten ein Kinderspiel. Es wären höchstens ein paar Hundert Punkte zu notieren, und alle Computer haben Zugang zum Internet.
Ich weiß nicht viel über Server oder Hosting, und ich kenne kein Java, HTML oder eine andere Sprache, die üblicherweise in der Webentwicklung verwendet wird. Daher helfen andere verwandte Fragen nicht wirklich. Mein Spiel druckt die Scoring-Informationen in eine Textdatei und von dort aus weiß ich nicht, wie ich sie irgendwo online abrufen kann, auf die jeder zugreifen kann.
Gibt es eine Möglichkeit, eine solche Aufgabe nur mit Python zu erledigen?
Hier habe ich den Code zum Aktualisieren einer Bestenlistendatei (vorausgesetzt, es handelt sich nur um eine Textdatei), sobald ich die Ergebnisse habe. Dies würde voraussetzen, dass ich eine Kopie der Bestenliste und der Score-Datei an derselben Stelle hatte.
Dies ist das Format meiner Mock-Bestenliste (Leaderboards.txt):
Leaderboards
1) JOE 10001
2) ANA 10000
3) JAK 8400
4) AAA 4000
5) ABC 3999
Dies ist, was die Protokolldatei drucken würde - die Initialen und Punktzahl (log.txt):
ABC
3999
Code (funktioniert für Python 2.7 und 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)
Einige weitere Informationen:
Die Punktzahl wäre weniger als 1 000 000Idealerweise wäre die Lösung nur ein Code außerhalb des Spiels, sodass ich nur eine ausführbare Datei erstellen würde, die der Benutzer ausführen würde, nachdem er @ beendet haIch weiß, dass es nicht sehr sicher klingt - und das ist es auch nicht - aber das ist in Ordnung, es muss nicht hacksicher sein