0

我试图将我的世界生成与我的实际游戏分开,因为我通常会失败。但是由于某种原因,它一直坚持文件是空的/从中获得的变量是空的,有时,当我事后查看时,实际的程序文件已经清空了包含所有信息的文本文件,有时不是。这是代码:

Dropbox 主要代码

Dropbox World 一代

这是主要代码中文件处理的一小部分摘录:

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在一个循环中创建列表。

至于使用os.startfile():您正在后台启动另一个脚本。然后,该脚本会打开要写入的文件并显式清空文件,然后再生成新数据。同时,您正试图从该文件中读取。那时您可能最终读取了一个空文件,因为其他进程尚未完成生成和写入数据,并且由于文件写入被缓冲,您将看不到所有数据,直到其他进程关闭文件并退出。

完全不要os.startfile() 这里使用。而是导入另一个文件;然后代码将导入期间执行,并保证文件被关闭。

于 2013-08-07T20:17:47.040 回答