2016-04-18 11 views
-1

私は現在絶対初心者のためのpythonを介して作業しています3追加。私はこの本の第7章で2番目の挑戦に苦しんでいます。私は理解していないエラーが続いています。それはファイル内のハイスコアのリストを維持するように絶対初心者のためのPython第7章チャレンジ2

は「trivaチャレンジゲームを改善すべきプログラムは、プレイヤーの名前を記録し、プレイヤーがリストを作る場合はスコア高得点を保存:

挑戦はすることです。ピクルされたオブジェクトを使用します。

元のコード

# Trivia Challenge 
# Trivia game that reads a plain text file 

import sys 

def open_file(file_name, mode): 
    """Open a file.""" 
    try: 
     the_file = open(file_name, mode) 
    except IOError as e: 
     print("Unable to open the file", file_name, "Ending program.\n", e) 
     input("\n\nPress the enter key to exit.") 
     sys.exit() 
    else: 
     return the_file 

def next_line(the_file): 
    """Return next line from the trivia file, formatted.""" 
    line = the_file.readline() 
    line = line.replace("/", "\n") 
    return line 

def next_block(the_file): 
    """Return the next block of data from the trivia file.""" 
    category = next_line(the_file) 

    question = next_line(the_file) 

    answers = [] 
    for i in range(4): 
     answers.append(next_line(the_file)) 

    correct = next_line(the_file) 
    if correct: 
     correct = correct[0] 

    explanation = next_line(the_file) 

    return category, question, answers, correct, explanation 

def welcome(title): 
    """Welcome the player and get his/her name.""" 
    print("\t\tWelcome to Trivia Challenge!\n") 
    print("\t\t", title, "\n") 

def main(): 
    trivia_file = open_file("trivia.txt", "r") 
    title = next_line(trivia_file) 
    welcome(title) 
    score = 0 

    # get first block 
    category, question, answers, correct, explanation = next_block(trivia_file) 
    while category: 
     # ask a question 
     print(category) 
     print(question) 
     for i in range(4): 
      print("\t", i + 1, "-", answers[i]) 

     # get answer 
     answer = input("What's your answer?: ") 

     # check answer 
     if answer == correct: 
      print("\nRight!", end=" ") 
      score += 1 
     else: 
      print("\nWrong.", end=" ") 
     print(explanation) 
     print("Score:", score, "\n\n") 

     # get next block 
     category, question, answers, correct, explanation = next_block(trivia_file) 

    trivia_file.close() 

    print("That was the last question!") 
    print("You're final score is", score) 

main() 
input("\n\nPress the enter key to exit.") 

チャレンジコード

# Trivia Challenge 
# Trivia game that reads a plain text file 

import sys, pickle 

def open_file(file_name, mode): 
    """Open a file.""" 
    try: 
     the_file = open(file_name, mode) 
    except IOError as e: 
     print("Unable to open the file", file_name, "Ending program.\n", e) 
     input("\n\nPress the enter key to exit.") 
     sys.exit() 
    else: 
     return the_file 

def next_line(the_file): 
    """Return next line from the trivia file, formatted.""" 
    line = the_file.readline() 
    line = line.replace("/", "\n") 
    return line 

def next_block(the_file): 
    """Return the next block of data from the trivia file.""" 
    category = next_line(the_file) 

    points = next_line(the_file) 

    question = next_line(the_file) 

    answers = [] 
    for i in range(4): 
     answers.append(next_line(the_file)) 

    correct = next_line(the_file) 
    if correct: 
     correct = correct[0] 

    explanation = next_line(the_file) 

    return category, points, question, answers, correct, explanation 

def welcome(title): 
    """Welcome the player and get his/her name.""" 
    print("\t\tWelcome to Trivia Challenge!\n") 
    print("\t\t", title, "\n") 

def high_scores(): 
    global score 
    value = int(score) 
    name = input("What is your name? ") 
    entry = (value, name) 
    f = open("high_scores.dat", "wb+") 
    high_scores = pickle.load(f) 
    high_scores.append(entry) 
    high_scores = high_scores[:5] 
    print("High Scores\n") 
    print("NAME\tSCORE") 
    for entry in high_scores: 
     value, name = entry 
     print(name, "\t", value) 
    pickle.dump(high_scores, f) 
    f.close() 

def main(): 
    trivia_file = open_file("trivia.txt", "r") 
    title = next_line(trivia_file) 
    welcome(title) 

    # get first block 
    category, points, question, answers, correct, explanation = next_block(trivia_file) 
    while category: 
     # ask a question 
     print(category) 
     print(question) 
     for i in range(4): 
      print("\t", i + 1, "-", answers[i]) 

     # get answer 
     answer = input("What's your answer?: ") 

     # check answer 
     if answer == correct: 
      print("\nRight!", end=" ") 
      j = int(points) 
      global score 
      score += j 
     else: 
      print("\nWrong.", end=" ") 
     print(explanation) 
     print("Score:", score, "\n\n") 

     # get next block 
     category, points, question, answers, correct, explanation = next_block(trivia_file) 

    trivia_file.close() 

    print("That was the last question!") 
    print("You're final score is", score) 
    high_scores() 

score = 0 

main() 
input("\n\nPress the enter key to exit.") 

そして見事に紛らわしいエラーで私の試み

Traceback (most recent call last): 
    File "C:\Users\Cheyne\Desktop\Python\chapter07\Challenges\temp.py", line 104, in <module> 
    main() 
    File "C:\Users\Cheyne\Desktop\Python\chapter07\Challenges\temp.py", line 100, in main 
    high_scores() 
    File "C:\Users\Cheyne\Desktop\Python\chapter07\Challenges\temp.py", line 54, in high_scores 
    high_scores = pickle.load(f) 
    File "C:\Python31\lib\pickle.py", line 1365, in load 
    encoding=encoding, errors=errors).load() 
EOFError 

誰かがここで間違っていることを説明するのに役立つことができますか?私は数日間それを見つめている。

+0

コードの使い方を教えてください。あなたの主な機能は何ですか? – harfel

+4

これまで作られたPythonのすべてのバージョンをあなたのタグに入れないでください。タグは質問を分類するためのものです。本当にどんなバージョンですか?そのタグを使用してください。通常、一般的な 'python-3.x'タグで十分です。 – zondo

+0

@ChatterOne pickleファイルはそこにあります。私はチェックして新しいファイルを作成し、そのファイルを同じ結果にしようとしました。 –

答えて

0

あなたは、ファイルが実際に存在することを確認されていないことを考えると、あなたはとてもピクルスファイルをロードしようとするところだライン54

で「ファイルエラーの終わり」である「例外EOFError」を、持っています私の推測では、ファイルがなく、エラーが発生していると思います。

自分で初期ファイルを作成するか、ファイルをロードしようとする前にそれが存在し、有効であることを確認してください。

編集:私はちょうどあなたが書き込みのためにそれを開き、それを読むことを意味する "wb +"としてピクルスファイルを開くことに気づいた。ファイルを上書きしています。ファイルはゼロバイトになります。既存のファイルに追加する場合は、 "w"の代わりに "a"を使用する必要があります。再度、ロードする前に、ファイルに有効なデータが含まれていることを確認してください。

+0

'rb'読み込みや' rb + '読み書きとオプション書き込みのためにファイルを開く必要はありませんか? –

関連する問題