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

Pygame平台游戏开发:2D数组加载CSV瓦片图片报错问询

问题解决思路与代码修正

错误原因

你触发ValueError的直接原因是这段代码:

self.tiles[rowcounter][colcounter] = int("Tile_" + data[colcounter] + ".png")

你试图把字符串"Tile_36.png"转换成整数,而这个字符串并非纯数字格式,自然无法完成转换。

2D数组应该存什么?

推荐两种实用方案,按需选择:

  • 方案1:存瓦片ID(csv中的数字):内存占用小,适合瓦片数量多的场景,渲染时根据ID匹配预加载的图片即可,灵活性更高。
  • 方案2:存Pygame Surface对象:直接存储加载好的图片,渲染时可直接使用,但瓦片数量较多时会占用更多内存。

通常优先选择方案1,兼顾性能与灵活性。

修正后的代码

level.py 修改版

import pygame

class Tilemap:
    def __init__(self):
        self.tile_size = 32
        self.start_x = 0
        self.start_y = 0
        self.tiles = []
        # 预加载瓦片图片的字典:key为瓦片ID,value为Surface对象
        self.tile_images = {}

    def load_map(self, filename, tile_folder="tiles"):
        # 合并原initArray与PopArray功能,减少文件IO次数
        self.tiles = []
        with open(filename, "r") as file:
            for line in file:
                row_data = line.strip().split(",")
                current_row = []
                for tile_id_str in row_data:
                    tile_id = int(tile_id_str)
                    if tile_id == -1:
                        current_row.append(-1)
                    else:
                        # 方案1:存储瓦片ID
                        current_row.append(tile_id)
                        # 预加载对应图片(避免重复加载)
                        if tile_id not in self.tile_images:
                            tile_path = f"{tile_folder}/Tile_{tile_id}.png"
                            self.tile_images[tile_id] = pygame.image.load(tile_path).convert_alpha()
                self.tiles.append(current_row)
        return self.tiles

    # 新增瓦片渲染示例方法
    def draw(self, screen):
        for y, row in enumerate(self.tiles):
            for x, tile_id in enumerate(row):
                if tile_id == -1:
                    continue
                tile_img = self.tile_images[tile_id]
                screen.blit(tile_img, (x * self.tile_size, y * self.tile_size))

Main.py 修改版

import pygame
from level import Tilemap

pygame.init()
screen = pygame.display.set_mode((800, 600))

map = Tilemap()
tile_array = map.load_map("project.csv")
print(tile_array)

# 游戏主循环示例
running = True
while running:
    screen.fill((0, 0, 0))
    map.draw(screen)
    pygame.display.flip()
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

pygame.quit()

关键修改说明

  1. 移除了错误的字符串转整数逻辑,直接存储csv中的瓦片ID(整数)。
  2. 合并原两个数组处理方法,用with语句自动管理文件关闭,避免资源泄漏。
  3. 新增瓦片图片预加载逻辑,用字典缓存已加载的图片,避免重复IO操作影响性能。
  4. 添加了渲染示例方法,展示如何通过2D数组中的ID渲染对应瓦片。

内容的提问来源于stack exchange,提问作者The epic Gamer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 05:32:53