You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 11:15:31