如何在pygame中读取磁贴地图的.csv文件



我正在为我在GMTK Game Jam中的一个条目制作续集。这是一个平台游戏机,玩家必须通过随机选择的各种游戏模式的地图,比如平台游戏比赛、boss之战,以及我只能描述为躲避球但有一个巨大的杀手pac man。为此,我想制作许多关卡,用python脚本慢慢编辑列表是不可行的。所以我想学习如何读取.csv文件,并使用它们创建一个使用多个瓦片的级别。但是我该怎么做呢?

到目前为止,我有一个主脚本,一个精灵脚本和一个关卡脚本。最后一个里面有两个测试级别的映射,我想用一个包含各种.csv文件的文件夹来代替它。在我的主要剧本中,我有一节游戏课。在__init__方法中,我设置了一个从级别脚本中提取的级别列表,随机选择一个要加载的级别,并在索引为某个值时循环通过它从我的精灵脚本创建一个精灵。

#Set tile map
self.level = [levels.plat_lvl_1, levels.plat_lvl_2]
self.tile_map = random.choice(self.level)
for i in range(len(self.tile_map)):
for j in range(len(self.tile_map[i])):
if self.tile_map[i][j] == 1:
sprites.Tile(j * 32, i * 32, 1, self.tile_group)
elif self.tile_map[i][j] == 2:
sprites.Tile(j * 32, i * 32, 2, self.tile_group, self.platform_group)
elif self.tile_map[i][j] == 3:
sprites.Tile(j * 32, i * 32, 3, self.tile_group, self.platform_group)
elif self.tile_map[i][j] == 4:
sprites.Tile(j * 32, i * 32, 4, self.tile_group, self.platform_group)
elif self.tile_map[i][j] == 5:
self.player = sprites.Player(j * 32, i * 32, self.player_group, self.platform_group)
elif self.tile_map[i][j] == 6:
sprites.Tile(j * 32, i * 32 - 32, 6, self.tile_group)

我该如何用.csv文件替换列表,以及我需要如何循环或剥离它或其他什么才能正确创建我的级别?如果你需要的话,这是整个项目的链接。

非常感谢!

-多米尼克。

我有这个函数可以将csv映射转换为List[List[int]]格式。

def convert_csv_to_2d_list(csv_file: str):
tile_map = []
with open(csv_file, "r") as f:
for map_row in csv.reader(f):
tile_map.append(list(map(int, map_row)))
return tile_map

它的用途将是:

self.tile_map = convert_csv_to_2d_list(csv_file="csv_file_location.csv")
for row in range(len(self.tile_map)):
for col in range(len(self.tile_map[row])):
# specific codes follows here

您可以这样做:

import csv
with open('level_file.csv') as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')

for row in csv_reader:
for column in range(len(row)):
if row[column] == 1:
#do sprite stuff
sprites.Tile(column * 32, row * 32, 1, self.tile_group)
elif row[column] == 2:
#etc

导入csv

#LOADING A MAP DATA
with open("YOUR CSV FILE") as f:
data = csv.reader(f, delimiter=',')
y = 0
for row in data:
x = 0
for column in range(len(row)):
x += 1
#IF THE TILE IS IN THE ROW THEN WE RENDERING IT
if row[column] == "-1":
#Render your tile here

display.blit(image, (x * your tile width, y * your tile height , tile width size, tile height size))
y += 1

最新更新