如何在棋盘上正确渲染玩家位置与墙体?
动态渲染带玩家与墙体的棋盘实现方案
你当前的实现是硬编码生成空棋盘,无法动态插入玩家或墙体,扩展性极差。正确思路是先构建可修改的棋盘数据结构,再根据数据生成最终的棋盘字符串,具体步骤如下:
- 初始化棋盘格子:用二维列表表示9×9的棋盘,所有格子初始为
.,方便后续修改指定位置内容 - 坐标映射:玩家的
pos是[x, y](x为列号1-9,y为行号1-9),需转换成二维列表索引:- 行索引:
9 - y(棋盘行号从上到下是9→1,对应列表索引0→8) - 列索引:
x - 1(列号从左到右是1→9,对应列表索引0→8)
- 行索引:
- 填充玩家位置:遍历玩家列表,把对应索引位置的格子替换为玩家的
nom - 填充墙体:同理,遍历墙体列表(如果有),把对应位置替换为墙体符号(比如
#) - 生成棋盘字符串:根据二维列表内容,逐行拼接棋盘的边框、行号、格子内容,最后加上底部列号
实现代码示例
def formater_damier(joueurs, murs=None): # 初始化9×9的棋盘,所有格子为'.' grille_grids = [['.' for _ in range(9)] for _ in range(9)] # 处理玩家位置 for joueur in joueurs: x, y = joueur["pos"] row_idx = 9 - y col_idx = x - 1 grille_grids[row_idx][col_idx] = joueur["nom"] # 处理墙体(如果传入墙体列表) if murs: for mur_pos in murs: x, y = mur_pos row_idx = 9 - y col_idx = x - 1 grille_grids[row_idx][col_idx] = '#' # 构建棋盘字符串 grille_lines = [] grille_lines.append(' ----------------------------------- ') # 生成每一行的内容(行号9到1) for i in range(9): row_num = 9 - i row_content = ' '.join(grille_grids[i]) grille_lines.append(f'{row_num} | {row_content} | ') # 添加分隔行(最后一行内容后不需要) if i != 8: grille_lines.append(' | | ') # 底部分隔线与列号 grille_lines.append('--| ----------------------------------- ') grille_lines.append(' | 1 2 3 4 5 6 7 8 9 ') return '\n'.join(grille_lines) # 测试用例 if __name__ == '__main__': joueurs_test = [ {"nom": "1", "pos": [5, 5]}, {"nom": "2", "pos": [8, 6]} ] murs_test = [[3, 7], [6, 3]] # 示例墙体位置 print(formater_damier(joueurs_test, murs_test))
这种写法的优势:
- 完全动态,不管玩家数量、位置或墙体数量如何变化,都能正确渲染
- 代码可维护性强,修改格子样式、边框格式只需调整拼接逻辑
- 数据层(二维列表)与视图层(字符串输出)分离,逻辑清晰不易出错
内容的提问来源于stack exchange,提问作者Henricharles N'dri
相关产品推荐
相关产品推荐

