问题描述
我正在为一个学校项目做音乐测验。
我制作了一款可以正常工作的游戏,但是由于覆盖了先前的名称,因此无法使排行榜(应该为文本并保存为leaderboard.txt)显示不同的名称。
例如,如果“ Sam”得分为9,而“ Ben”得分为3,它将显示为“ Ben-3-9”,这不是我想要的。
我正试图让自己的排行榜像这样工作:
Sam - 9
Ben - 3
...
我的代码现在看起来像这样:
username = input("What is your username?")
# this will ask for the persons name
password = str(input("What is the password?"))
# this will ask for a password which has been set already
if password == "1234":
print("User Authenticated")
# if the password is incorrect,tell the user so and exit
elif password != "1234":
print("Password Denied")
exit()
# GAME
# Creating a score variable
score=0
x = 0
# Reading song names and artist from the file
read = open("songnames.txt","r")
songs = read.readlines()
songlist = []
# Removing the 'new line' code
for i in range(len(songs)):
songlist.append(songs[i].strip('\n'))
while x == 0:
# Randomly choosing a song and artist from the list
import random
choice = random.choice(songlist)
artist,song = choice.split('-')
# Splitting the song into the first letters of each word
songs = song.split()
letters = [word[0] for word in songs]
# Loop for guessing the answer
for x in range(0,2):
print(artist,"".join(letters))
guess = str(input("Guess the song!"))
if guess == song:
if x == 0:
score = score + 3
break
if x == 1:
score = score + 1
break
quit()
# Printing score,Then waiting to start loop again.
import time
print("Your score is",score)
print("Nice Work!")
time.sleep(3)
leaderboard = open("leaderboard.txt","r+")
leaderboard.write(username + '-' + '{}'.format(score))
leaderboard.close()
leaderboard = open("leaderboard.txt","r+")
leaderboardlist = leaderboard.readlines()
print(leaderboardlist)
leaderboard.close()
PS:这不是我的代码的100%,我试图从不同的地方寻求帮助,因为由于流行病导致学校关闭,我的学校尚未教会我们如何编码。
解决方法
执行此操作时:
"/"
您以读写模式打开排行榜,但它将在文件的开头开始写,并覆盖其中的所有内容。如果您只想向排行榜添加新的分数,最简单的方法是在“附加”模式"index.html"
中打开文件:
function input_inputEvent() {
var firstLetterField = document.querySelectorAll("input")[0].value;
var secondLetterField = document.querySelectorAll("input")[1].value;
var thirdLetterField = document.querySelectorAll("input")[2].value;
if (firstLetterField.length != "" && secondLetterField != "") {
alert(
"That's right! The word was " +
[firstLetterField,secondLetterField,thirdLetterField].join("").toUpperCase() +
"! Thanks for playing!"
);
window.location.href = "index.html";
}
}
或者,您可以以leaderboard = open("leaderboard.txt","r+")
leaderboard.write(username + '-' + '{}'.format(score))
模式打开文件,然后先先读取列表或词典中的所有行(分数),然后合并/更新当前玩家的新分数(例如,添加到最后的分数,替换最后的分数或获取该玩家的新分数和最后分数的"a"
),然后在with open("leaderboard.txt","a") as leaderboard:
leaderboard.write(username + '-' + '{}'.format(score))
模式下再次打开文件并写入更新的分数。 (左为读者的练习。)
问题出在最后几行代码中,即您正在写入leaderboard.txt文件。
使用"r+"
表示您正在更新(读取和写入)文件。以这种方式打开文件,将光标移动到文件的开头。因此,任何写入文件的尝试都会覆盖已经存在的内容。
执行此操作的正确方法是使用"a"
(如果您也打算阅读,则使用"a+"
)打开文件。这是append
模式,会将光标移到文件末尾。
其他一些一般说明:
- 完成后,使用
with-as
语句自动处理文件关闭。 - 使用
f-strings
而不是字符串连接来提高可读性
请牢记以下代码:
with open("leaderboards.txt","a") as f:
f.write(f"{username}-{score}")