首页 > 解决方案 > 我正在创建一个音乐测验,但似乎在测验中间的随机点出现相同的错误

问题描述

我的代码旨在:

  1. 将歌曲名称和艺术家列表存储在外部文件中。

  2. 从文件中选择一首歌曲,显示艺术家和歌曲标题每个单词的首字母。

  3. 允许用户最多有两次机会猜出歌曲的名称,如果他们在第二次猜出错误的歌曲时停止游戏。

  4. 如果猜对了,根据猜的次数将分数加到玩家的分数上。

  5. 歌曲和艺术家的名字从阵列/外部文件中删除。

  6. 显示游戏结束时玩家拥有的点数。

目前我的代码在回答问题并给我错误时卡住了: ChosenSong = (songs[RandomNumber]) IndexError: list index out of range

无论如何解决这个问题会很棒!

目前我的代码如下所示:

import random
points = 0
x = 1

SongArtists = open("Songs and Artists.txt","r")
ReadValues = SongArtists.readline()
songs = []
artists = []

while len(songs) < len(ReadValues):
    field = ReadValues.split(",")
    songTitle = field[0]
    artistName = field[1]
    songs.append(songTitle)
    artists.append(artistName)

    ReadValues = SongArtists.readline()




print("")

from random import *

while x == 1:

    RandomNumber = (randint(0,len(songs)))
    RandomNumber = RandomNumber + 1
    ChosenSong = (songs[RandomNumber])
    print("")
    print(artists[songs.index(ChosenSong)])

    print("")

    Field = ChosenSong.split(" ")

    lenOfField = len(Field)

    if lenOfField == 1:

        letter = Field[0]
        print(letter[ : 1])
        songs.pop(RandomNumber)
        artists.pop(RandomNumber)



    elif lenOfField == 2:
        letter = Field[0]      
        secondletter = Field[1]
        print((letter[ : 1])+" "+(secondletter[ : 1]))
        songs.pop(RandomNumber)
        artists.pop(RandomNumber)


    elif lenOfField == 3:
        letter = Field[0]       
        secondletter = Field[1]
        thirdletter = Field[2]
        print((letter[ : 1])+" "+(secondletter[ : 1])+" "+(thirdletter[ : 1]))
        songs.pop(RandomNumber)
        artists.pop(RandomNumber)




    elif lenOfField == 4:
        letter = Field[0]       
        secondletter = Field[1]
        thirdletter = Field[2]
        fourthletter = Field[3]
        print((letter[ : 1])+" "+(secondletter[ : 1])+" "+(thirdletter[ : 1])+" "+(fourthletter[ :1]))
        songs.pop(RandomNumber)
        artists.pop(RandomNumber)



    elif lenOfField == 5:
        letter = Field[0]       
        secondletter = Field[1]
        thirdletter = Field[2]
        fourthletter = Field[3]
        fifthletter = Field[4]
        print((letter[ : 1])+" "+(secondletter[ : 1])+" "+(thirdletter[ : 1])+" "+(fourthletter[ :1])+" "+(fifthletter[ :1]))
        songs.pop(RandomNumber)
        artists.pop(RandomNumber)






    print("")    

    guess = input("What is your guess : ").title()

    if guess == ChosenSong:
        points += 3
        print("Correct, You get 3 points! You're score is", points)

    else:

        print("")

        print("Wrong, If you get this wrong You Lose ")

        secondguess = input("What is your guess : ")

        if secondguess == ChosenSong:
            points += 1
            print("Correct, You get 3 points! You're score is", points)        

        else:
            print("Game Over, You Scored " + str(points) + " points")

            ScoreFile = open("Scores.txt","a")
            ScoreFile.write(str(points))
            ScoreFile.write("\n")

            break

标签: python

解决方案


这里:

RandomNumber = (randint(0,len(songs)))
RandomNumber = RandomNumber + 1

如果您的 RandomNumber 在初始化时等于 len(songs),则它已经超出songs范围。

根据Python 文档randint(a, b) 返回a random integer N such that a <= N <= b.

所以删除第二行,第一行变成:

RandomNumber = (randint(0, len(songs) - 1))

推荐阅读