寻求最Pythonic的游戏瓦片布尔列表转整数实现(含特殊规则)
优化后的Pythonic实现方案
针对你游戏瓦片拼接的去重需求,这里提供更简洁、可读性更强的Python风格实现:
def calculate_tile_id(pixels): # 定义8个瓦片位置对应的3x3像素坐标(行, 列),对应编号0-7 tile_positions = [ (0, 1), # 0 (主方向) (0, 2), # 1 (斜向) (1, 2), # 2 (主方向) (2, 2), # 3 (斜向) (2, 1), # 4 (主方向) (2, 0), # 5 (斜向) (1, 0), # 6 (主方向) (0, 0), # 7 (斜向) ] # 提取原始8位布尔值 original_bits = [pixels[y][x] for y, x in tile_positions] # 应用去重规则处理每一位: # - 偶数索引(主方向位)保留原值 # - 奇数索引(斜向位)仅当相邻两个主方向位都为True时保留原值,否则设为False processed_bits = [ original_bits[idx] if idx % 2 == 0 else (original_bits[idx] if original_bits[idx-1] and original_bits[(idx+1) % 8] else False) for idx in range(8) ] # 转换为二进制字符串并生成整数ID binary_str = ''.join('1' if bit else '0' for bit in processed_bits) return int(binary_str, 2), binary_str # 测试示例输入 pixels = [[True, False, True], [True, True, False], [False, True, True]] tile_id, binary_str = calculate_tile_id(pixels) print(binary_str, tile_id) # 输出: 10100000 160
优化亮点
- 直观的坐标映射:用列表显式定义每个瓦片编号对应的像素坐标,替代原代码中绕逻辑的循环,可读性大幅提升
- 简洁的列表推导式:用列表推导式替代冗余的for循环拼接,符合Python的简洁风格
- 清晰的变量命名:避免了原代码中重复使用
i导致的变量混淆,逻辑更易追踪 - 模块化封装:将逻辑封装为函数,便于实际项目中复用和维护
- 显式环形处理:用
(idx+1) % 8直接处理最后一个斜向位的环形相邻主方向,替代原代码中追加列表元素的hack写法
内容的提问来源于stack exchange,提问作者John Caudill
相关产品推荐
相关产品推荐

