2

わかりました、基本的に私はハイスコアを伴う単純なゲームを作っています。以前のハイスコアよりも大きい場合は、ハイスコアを保存してほしい。これは私のコードです。コードが明らかに間違っているため、文字列と整数を切り替えているという事実やその他のエラーに関連するいくつかの異なるエラーがあります。問題を理解しようと試みましたが、新しいエラーが発生し続けているようです。

hisc = open("Hscore.txt", "r+")
hiscore = hisc.read(3) # 3 because the max score would never reach 1000
highscore = int(hiscore)
if score > highscore:
    hiscore = hiscore.replace(hiscore, score)
    hisc.write(hiscore)

これが私の最後の試みでした。それは 100% 間違っている可能性があります。私は最善を尽くしました。必要なのは、ゲームを実行するたびにハイスコアが表示されるようにすることです。私のスコアが私のハイスコアよりも大きい場合、テキスト ファイルのハイスコアが変更されます。その後、ゲームに再ロードされ、このコードで再び動作します。

4

1 に答える 1

3

コードの問題は、 が のhiscore.replaceときに呼び出そうとしていることです。hiscoreint

そもそもなぜ使おうとしているのかがよくわかりませんreplace。これは、文字列の一部を別の文字列に置き換えるのに便利です。全体を置き換えたい場合は、新しい値を割り当てるだけです: hiscore = score.

hisc = open("Hscore.txt", "r+")
hiscore = hisc.read(3) # 3 because the max score would never reach 1000
highscore = int(hiscore)
if score > highscore:
    hiscore = score
    hisc.write(hiscore)

ただし、2 つ目の問題があります。出力をファイルに書き込んでいるintときに、(私が思うに)int正確に 3 文字の文字列表現が必要な場合です。したがって、最後の行を次のように置き換えます。

    hisc.write('{:3}'.format(hiscore))

一方、"r+"モードでファイルを開くと、思ったように動作しない場合があります。Python 3 では、「r+」ファイルの「読み取りポインター」と「書き込みポインター」は常に同じ場所にあります。したがって、3 文字を読み取ってから 3 文字を書き込むと、必要に応じて文字 0 ~ 3 を上書きする代わりに、文字 3 ~ 6 を上書きするか、最後に 3 つの新しい文字を追加することになります。seek(0, 0)の後に呼び出すことでこれに対処できreadます。

つまり、書き込んだ内容は決してclose保存されず、メモリ内のバッファに留まり、実際のディスク ファイルにフラッシュされることはありません。seekここでは、読み取り用に開いてから閉じ、書き込み用に開いてから閉じる方がおそらく簡単なので、ナンセンスなことを心配する必要はありません。ファイルを閉じる最も簡単な方法は、withステートメントを使用することです。

したがって、すべてをまとめると、次のようになります。

with open("Hscore.txt", "r") as hisc:
    hiscore = hisc.read(3) # 3 because the max score would never reach 1000
highscore = int(hiscore)
if score > highscore:
    with open("Hscore.txt", "w") as hisc:
        hisc.write('{:3}'.format(score))

ただし、これは、Hscore.txt が (現在の作業ディレクトリに) 存在し、その中に数値があることが保証されているという事実に依存しています。なんらかのバグにより、そこに「x」が表示されたり、ファイルが完全に空になったりすると、実行するたびに例外が発生し、回復できなくなります。したがって、次のようなものが必要になる場合があります。

try:
    with open("Hscore.txt", "r") as hisc:
        hiscore = hisc.read(3) # 3 because the max score would never reach 1000
    highscore = int(hiscore)
except IOError as e:
    print('Warning: couldn't open "Hscore.txt": {}'.format(e))
    highscore = 0
except ValueError as e:
    print('Warning: couldn't convert "{}" from "Hscore.txt" to an integer: {}'.format(hiscore, e))
    highscore = 0

そうすれば、問題の原因を突き止めるのに役立つ警告が出力され、回復も試みられます (ファイルが見つからないか破損している場合は、ハイスコアが 0 であると想定します)。

openドキュメントとioモジュールの概要では、このほとんどについて説明していますが、まったく初心者向けというわけではありません。チュートリアルのファイルの読み取りと書き込みがより役立つ場合があります。

于 2013-02-14T01:58:51.800 に答える