0

通常は失敗するので、実際のゲームから自分のワールド生成を分割しようとしました。しかし、何らかの理由で、ファイルが空である/そこから得られた変数が空であると主張し続け、後で見ると、実際のプログラムファイルがすべての情報を含むテキストファイルを空にしたり、そうでない場合があります。コードは次のとおりです。

Dropbox メイン コード

Dropbox ワールド世代

以下は、メイン コードでのファイル処理のみを抜粋したものです。

world_file = open("C:\Users\Ben\Documents\Python Files\PlatformerGame Files\World.txt", "r")
world_file_contents = world_file.read()
world_file.close()
world_file_contents = world_file_contents.split("\n")
WORLD = []
for data in world_file_contents:
    usable_data = data.split(":")
    WORLD.append(Tile(usable_data[0],usable_data[1]))

そしてタイルクラス:

class Tile():
    def __init__(self,location,surface):
        self.location = location
        self.surface = surface

そしてエラー:

Traceback (most recent call last):
  File "C:\Users\Ben\Documents\Python Files\PlatformerGame", line 89, in <module>
    Game.__main__()
  File "C:\Users\Ben\Documents\Python Files\PlatformerGame", line 42, in __main__
    WORLD.append(Tile(usable_data[0],usable_data[1]))
IndexError: list index out of range

明らかな場合は申し訳ありません。また、私はpygameを使用しています。

4

1 に答える 1

2

入力ファイルに空の行が含まれている可能性があります。これらはスキップします。

タイル読み取りコードを簡素化することもできます。

with open("C:\Users\Ben\Documents\Python Files\PlatformerGame Files\World.txt", "r") as world_file:
    WORLD = [Tile(*line.strip().split(":", 1)) for line in world_file if ':' in line]

これは、行に文字がある場合にのみ行を処理:し、一度だけ分割しWORLD、1 つのループでリストを作成します。

使用に関してos.startfile()は、バックグラウンドで他のスクリプトを開始しています。そのスクリプトは、新しいデータを生成する前に、書き込むファイルを開き、ファイルを明示的に空にします。同時に、そのファイルから読み取ろうとしています。他のプロセスがまだデータの生成と書き込みを完了していないため、その時点で空のファイルを読み取る可能性があります。ファイルの書き込みはバッファリングされるため、他のプロセスがファイルを閉じるまですべてのデータは表示されません。そして終了します。

os.startfile() ここでは一切使用しないでください。代わりに他のファイルをインポートします。インポート中にコードが実行され、ファイルが閉じられることが保証されます。

于 2013-08-07T20:17:47.040 に答える