Guardando la puntuación más alta para un juego de python

He hecho un juego muy simple en python usando pygame. La puntuación se basa en cualquier nivel alcanzado por el jugador. Tengo el nivel como variable llamada score . Quiero mostrar el nivel superior al principio o al final del juego.

Me gustaría aún más mostrar más de una puntuación, pero todas las otras hebras que he visto eran demasiado complicadas para que las entendiera, así que, por favor, sea simple: soy un principiante, solo se necesita una puntuación.

Te recomiendo que uses la estantería . Por ejemplo:

 import shelve d = shelve.open('score.txt') # here you will save the score variable d['score'] = score # thats all, now it is saved on disk. d.close() 

La próxima vez que abras tu progtwig de uso:

 import shelve d = shelve.open('score.txt') score = d['score'] # the score is read from disk 

y se leerá desde el disco. Puede utilizar esta técnica para guardar una lista de puntuaciones si lo desea de la misma manera.

Puede usar el módulo pickle para guardar variables en el disco y luego volver a cargarlas.

Ejemplo:

 import pickle # load the previous score if it exists try: with open('score.dat', 'rb') as file: score = pickle.load(file) except: score = 0 print "High score: %d" % score # your game code goes here # let's say the user scores a new high-score of 10 score = 10; # save the score with open('score.dat', 'wb') as file: pickle.dump(score, file) 

Esto guarda una sola puntuación en el disco. Lo bueno de pickle es que puede extenderlo fácilmente para guardar múltiples puntajes, simplemente cambie los scores para que sean una matriz en lugar de un solo valor. pickle ahorrará prácticamente cualquier tipo de variable que le lances.

Vengo de un entorno Java, y mi Python no es genial, pero me gustaría consultar la documentación de Python sobre la lectura y escritura de archivos: http://docs.python.org/2/tutorial/inputoutput.html

Puede escribir una variable de puntuación en un archivo de texto sin formato antes de finalizar el juego y luego cargar el mismo archivo la próxima vez que inicie el juego.

Busque en los métodos read() , readline() y write() .

Puedes usar un dict para mantener tu puntuación más alta y simplemente escribirlo en un archivo:

 def store_highscore_in_file(dictionary, fn = "./high.txt", top_n=0): """Store the dict into a file, only store top_n highest values.""" with open(fn,"w") as f: for idx,(name,pts) in enumerate(sorted(dictionary.items(), key= lambda x:-x[1])): f.write(f"{name}:{pts}\n") if top_n and idx == top_n-1: break def load_highscore_from_file(fn = "./high.txt"): """Retrieve dict from file""" hs = {} try: with open(fn,"r") as f: for line in f: name,_,points = line.partition(":") if name and points: hs[name]=int(points) except FileNotFoundError: return {} return hs 

Uso

 # file does not exist k = load_highscore_from_file() print(k) # add some highscores to dict k["p"]=10 k["a"]=110 k["k"]=1110 k["l"]=1022 print(k) # store file, only top 3 store_highscore_in_file(k, top_n=3) # load back into new dict kk = load_highscore_from_file() print(kk) 

Salida:

 {} # no file {'p': 10, 'a': 110, 'k': 1110, 'l': 1022} # before storing top 3 {'k': 1110, 'l': 1022, 'a': 110} # after loading the top 3 file again 

Primero crea un highscore.txt con un valor cero inicialmente. Luego usa el siguiente código:

 hisc=open("highscore.txt","w+") highscore=hisc.read() highscore_in_no=int(highscore) if current_score>highscore_in_no: hisc.write(str(current_score)) highscore_in_no=current_score . . #use the highscore_in_no to print the highscore. . . hisc.close() 

Podría hacer un almacenamiento de puntaje permanente con este método simple, sin necesidad de estantes o salmuera.

Por lo general, almaceno los nombres de los jugadores y las puntuaciones más altas como una lista de listas (por ejemplo, [['Joe', 50], ['Sarah', 230], ['Carl', 120]] ), porque puede ordenar y dividir ellos (por ejemplo, si debería haber un máximo de 10 entradas). Puede guardar y cargar la lista con el módulo json ( json.dump y json.load ) o con pickle.

 import json from operator import itemgetter import pygame as pg from pygame import freetype pg.init() BG_COLOR = pg.Color('gray12') BLUE = pg.Color('dodgerblue') FONT = freetype.Font(None, 24) def save(highscores): with open('highscores.json', 'w') as file: json.dump(highscores, file) # Write the list to the json file. def load(): try: with open('highscores.json', 'r') as file: highscores = json.load(file) # Read the json file. except FileNotFoundError: return [] # Return an empty list if the file doesn't exist. # Sorted by the score. return sorted(highscores, key=itemgetter(1), reverse=True) def main(): screen = pg.display.set_mode((640, 480)) clock = pg.time.Clock() highscores = load() # Load the json file. while True: for event in pg.event.get(): if event.type == pg.QUIT: return elif event.type == pg.KEYDOWN: if event.key == pg.K_s: # Save the sorted the list when 's' is pressed. # Append a new high-score (omitted in this example). # highscores.append([name, score]) save(sorted(highscores, key=itemgetter(1), reverse=True)) screen.fill((30, 30, 50)) # Display the high-scores. for y, (hi_name, hi_score) in enumerate(highscores): FONT.render_to(screen, (100, y*30+40), f'{hi_name} {hi_score}', BLUE) pg.display.flip() clock.tick(60) if __name__ == '__main__': main() pg.quit() 

El archivo highscores.json se vería así:

 [["Sarah", 230], ["Carl", 120], ["Joe", 50]] 

Yo sugeriría:

 def add(): input_file=open("name.txt","a")#this opens up the file name=input("enter your username: ")#this input asks the user to enter their username score=input("enter your score: ")#this is another input that asks user for their score print(name,file=input_file) print(number,file=input_file)#it prints out the users name and is the commas and speech marks is what is also going to print before the score number is going to print input_file.close()