2

最近、以前の投稿でハイスコアの問題について質問しました。これはクラス プロジェクトなので、比較的単純なはずです。私はまだこのウェブサイトに不慣れなため、新しい改訂版をきれいに投稿する方法がわかりません。この部分を読んだことがある場合は、お詫び申し上げます。今回は、プログラム全体をここに置くだけです。ハイスコ​​アの部分を除いて、すべてが機能します。ゲームをプレイする前にハイスコアリストを確認することを選択すると、出力はうまく機能しますが、ゲームをプレイした後、メインメニューに戻ってハイスコアを再度確認すると、エラーが発生します

リストのインデックスは str ではなく整数でなければなりません

. 元のスコア リストが正しく設定されていないことを意味すると思いますが、完全にはわかりません。これがコードです。本当に助けていただきありがとうございます。このサイトはそのような方に最適です。

import random
loop_game = True

while loop_game:
    questions= [
                {"question": "Who won the 2012 NFL Superbowl?",
                 "answers": ["Jacksonville Jaguars",
                            "Oakland Raiders",
                            "New York Giants",
                            "Baltimore Ravens"],
                 "correct": "4"},
                {"question": "Which song was at the top of the charts in early 2001, by OutKast?",
                 "answers": ["Bootylicious",
                             "Angel",
                             "Ms. Jackson",
                             "U Got It Bad"],
                "correct": "3"},
                {"question": "How many centimeters are one inch?",
                 "answers": ["2.12",
                             "2.54",
                             "3.24",
                             "3.38"],
                "correct": "2"}]

    scores=[{'initials': None,
             'score': -500}]

#main menu
    def main_menu():
        global loop_game
        print("""
***********************************************  
Welcome to The Greatest Trivia Show on Earth!!!
***********************************************
1. Play Game
2. High Scores
3. Credits
4. Instuctions
5. Quit
""")
        needs_input = True
        while needs_input:
          selection = input("Which Selection would you like? ")
          if selection == "1":
              play_game()
              needs_input = False
          elif selection == "2":
              display_scores()
              needs_input = False
          elif selection == "3":
              credits()
              needs_input = False
          elif selection == "4":
              instructions()
              needs_input == False
          elif selection == "5":
              needs_input = False
              loop_game = False
          else:
              print("\nSelect a valid option\n")

    def play_game():
        #definitions
        global total_points
        global questions
        loop_pa = True
        total_points = 3
        random.shuffle(questions)
        counter = 0
        #gets name in case of high score
        global hs_name
        hs_name = input("What are your initials?: ")


        #main play loop
        while counter < 2:
            for j in questions:
                counter += 1
                print("\n",j["question"])
                for i, choice in enumerate(j["answers"]):
                    print(str(i+1) + ". " + choice)
                answer = str(input("\nChoose an answer 1-4: "))
                if answer == j["correct"]:
                    print("\nGood job! You keep your precious points...this time!\n")
                else:
                    print("\nSorry, that is not correct. You lose one point.\n")
                    total_points -= 1
                    print("\nTotal Points: ",  total_points)

        #all questions have been read
        print("\nThat's it, your score is: ", total_points)

        #check/append best scores list
        best_scores()

        #keep playing loop
        while loop_pa:
            keep_playing = input("Play again?  (y, n) \n")
            if keep_playing == "y":
                print("\nAwesome! Here we go! \n\n")
                loop_pa = False
                play_game()
            elif keep_playing == "n":
                print("Ahh, too bad.  Thanks for playing!")
                loop_pa = False
                main_menu()
            else:
                print("Select a valid option\n")

    def best_scores():
        for i, score in enumerate(scores):
            if total_points > score['score']:
                scores[i:i+1] = {'initials': hs_name, 'score': total_points}
                del scores[5:]
                break

    def display_scores():
        print("HIGH\tSCORES")
        for score in scores:
            print(score['initials'], "\t", score['score'])

    def instructions():
        print("""

*************
Instructions
*************
The game is quite simple:  You start out with 12 points.
You lose a point for every incorrect answer.
If you get an answer correct, your score stays the same
and you move forward through the question set.  Try to
see how many points you can keep!
         """)
        main_menu()

    def credits():
        print("\nCreated by Jessica Gregg and Jason Vignochi\n")
        main_menu()


    main_menu()

編集:ああ!エラーのある行は、display_scores 関数 (119 行目) にあります。

print(スコア['イニシャル'], "\t", スコア['スコア'])

4

3 に答える 3

2

scoresあなたはあなたを台無しにしていますbest_scores()。初めて通過した後は、 のようになり['score', 'initials']ます。スライス割り当ては反復可能を想定しており、確かに、反復可能として使用される場合、dict はそのキーを反復処理します。これを試してみてください。少し単純に見えます (ただし、おそらく追加して並べ替えるだけです)。

def best_scores():
    global scores
    for i, score in enumerate(scores):
        if total_points > score['score']:
            scores.insert(i, {'initials': hs_name, 'score': total_points})
            scores = scores[:5]
            break

私のやり方:

from operator import itemgetter

def best_scores():
    global scores
    scores.append({'initials': hs_name, 'score': total_points})
    scores = sorted(scores, key=itemgetter('score'), reverse=True)[:5]
于 2013-10-15T20:44:37.363 に答える
2

問題は次の行です。

scores[i:i+1] = {'initials': hs_name, 'score': total_points}

シーケンスのサブスライスを置き換えるときは、それを別の iterable に置き換える必要があります。例えば:

>>> a = [0, 1, 2, 3, 4]
>>> a[2:3] = [3] # fine
>>> a[2] = 3 # fine
>>> a[2:3] = 3
TypeError: can only assign an iterable

では、なぜあなたのコードは ではないのTypeErrorでしょうか? a はdict実際にiterable であるため、キーのリストのように機能します。[{'initials': old_name, 'score': old_score}]したがって、サブリストをディクショナリに置き換えようとすると{'initials': new_initials, 'score': new_score}、実際に表示されるのは実質的に['initials', 'score'].

したがって、後でスコアを印刷しようとすると、スコアの 1 つが ではなくdict、文字列 になります'initials'。そして、それを として使用しようとしているdictため、エラーが発生します。

print(scores)を呼び出す前と呼び出した後にこれを確認し、それぞれを でbest_scores印刷すると、より簡単に確認できます。scoredisplay_scores

于 2013-10-15T20:41:35.983 に答える