如何为音乐测验修复排行榜

问题描述

我正在为一个学校项目做音乐测验。

我制作了一款可以正常工作的游戏,但是由于覆盖了先前的名称,因此无法使排行榜(应该为文本并保存为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}")

有关文件的更多信息,请检查this问题。
有关f字符串的更多信息,请查看this对其的详尽概述。