Le problème avec votre code est que vous essayez d'appeler hiscore.replace
quand hiscore
est un int
.
Je ne suis pas sûr de savoir pourquoi vous essayez d'utiliser replace
en premier lieu. C'est utile pour remplacer une partie d'une chaîne par une autre chaîne. Si vous voulez remplacer la totalité de la chaîne, il suffit d'attribuer une nouvelle valeur : hiscore = score
.
hisc = open("Hscore.txt", "r+")
hiscore = hisc.read(3) # 3 because the max score would never reach 1000
highscore = int(hiscore)
if score > highscore:
hiscore = score
hisc.write(hiscore)
Cependant, vous avez un deuxième problème : vous écrivez une int
dans un fichier, alors que ce que vous voulez (je pense) c'est la représentation en chaîne de ce fichier. int
comme exactement 3 caractères. Donc, remplacez la dernière ligne par celle-ci :
hisc.write('{:3}'.format(hiscore))
Entre-temps, l'ouverture d'un fichier dans "r+"
n'est pas forcément ce que vous pensez. Dans Python 3, le "pointeur de lecture" et le "pointeur d'écriture" sont toujours au même endroit pour un fichier "r+". Ainsi, si vous lisez 3 caractères, puis écrivez 3 caractères, vous finissez par écraser les caractères 3 à 6, ou par ajouter 3 nouveaux caractères à la fin, au lieu d'écraser les caractères 0 à 3 comme vous le souhaitez. Vous pouvez gérer ce problème en appelant seek(0, 0)
après le read
.
Enfin, vous n'avez jamais close
le fichier, ce qui signifie que ce que vous avez écrit peut ne jamais être sauvegardé - il peut rester dans un tampon en mémoire et ne jamais être transféré vers le fichier disque. Et il est probablement plus simple ici d'ouvrir en lecture, puis de fermer, puis d'ouvrir en écriture, puis de fermer, de sorte que vous n'ayez pas à vous soucier de tout cela seek
absurde. La manière la plus simple de fermer des fichiers est d'utiliser un fichier de type with
déclaration.
Donc, en mettant tout ça ensemble :
with open("Hscore.txt", "r") as hisc:
hiscore = hisc.read(3) # 3 because the max score would never reach 1000
highscore = int(hiscore)
if score > highscore:
with open("Hscore.txt", "w") as hisc:
hisc.write('{:3}'.format(score))
Mais cela repose sur le fait que l'existence de Hscore.txt est garantie (dans le répertoire de travail actuel), et qu'il contient un nombre. Si un bug vous amène à y coller un "x", ou à vider entièrement le fichier, vous obtiendrez une exception à chaque exécution, et vous ne pourrez jamais récupérer. Donc, vous pouvez vouloir quelque chose comme ceci :
try:
with open("Hscore.txt", "r") as hisc:
hiscore = hisc.read(3) # 3 because the max score would never reach 1000
highscore = int(hiscore)
except IOError as e:
print('Warning: couldn't open "Hscore.txt": {}'.format(e))
highscore = 0
except ValueError as e:
print('Warning: couldn't convert "{}" from "Hscore.txt" to an integer: {}'.format(hiscore, e))
highscore = 0
De cette façon, il imprimera un avertissement qui vous aidera à comprendre ce qui ne va pas et à essayer de récupérer (en supposant qu'un fichier manquant ou corrompu signifie que le score le plus élevé est 0).
El open
et la documentation io
Aperçu du module explique la plupart de ces choses, mais ce n'est pas vraiment adapté aux débutants. Lecture et écriture de fichiers dans le tutoriel peut être plus utile.