如何在Pygame中读取CSV文件用于瓦片地图关卡创建?
用CSV文件替换硬编码关卡的实现方案
一、准备CSV关卡文件
- 每个CSV文件对应一张关卡地图,格式和你原有列表结构完全一致:每行代表地图的一行,每个数字用逗号分隔,数字含义保持原有逻辑(1=普通瓦片,2-4=平台,5=玩家出生点,6=特殊瓦片)。
- 示例
race_level_1.csv内容:
1,1,1,1,1,1,1,1 1,0,0,2,0,0,0,1 1,0,0,0,0,3,0,1 1,0,5,0,0,0,0,1 1,1,1,1,1,1,1,1
- 把所有CSV文件统一放到一个文件夹,比如
levels_csv/,方便批量读取。
二、编写CSV读取工具函数
用Python内置模块实现读取逻辑,无需额外安装依赖:
import csv import os import random def load_level_from_csv(csv_path): """从CSV文件加载关卡,返回二维整数列表""" tile_map = [] with open(csv_path, 'r', encoding='utf-8') as f: reader = csv.reader(f) for row in reader: # 将每行字符串转为整数,忽略空行 if row: tile_row = [int(tile) for tile in row] tile_map.append(tile_row) return tile_map def get_all_level_paths(csv_dir): """获取指定文件夹下所有CSV关卡文件的路径""" level_paths = [] for filename in os.listdir(csv_dir): if filename.lower().endswith('.csv'): level_paths.append(os.path.join(csv_dir, filename)) return level_paths
三、修改主脚本的关卡加载逻辑
替换原来硬编码的关卡列表,改为读取CSV文件夹:
# 替换原有的 self.level = [levels.plat_lvl_1, levels.plat_lvl_2] self.csv_level_dir = 'levels_csv' # 替换为你的CSV文件夹实际路径 self.level_paths = get_all_level_paths(self.csv_level_dir) # 随机选择一个关卡并加载 selected_csv = random.choice(self.level_paths) self.tile_map = load_level_from_csv(selected_csv) # 原来的创建精灵循环代码完全不需要修改! 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文件的每行长度一致,否则地图会出现错位;
- 用表格工具(如Excel、Google Sheets)保存时,务必选择**逗号分隔值(.csv)**格式;
- 可按关卡模式给CSV文件命名(如
boss_fight_1.csv、pacman_dodge.csv),便于维护扩展。
内容的提问来源于stack exchange,提问作者Dominic B.
相关产品推荐
相关产品推荐

