Python棋盘绘制模块draw方法生成多余空行问题求助
问题原因排查
多余空行来自三个逻辑错误:
- 前序行拼接时每行末尾重复加
\n,最后多了额外换行符 - 目标行修改完成后拼接剩余行的切片范围错误,包含了无效空元素
- 遍历取前height行的逻辑存在下标越界问题,导致误取末尾空行拼接
修复后完整代码
class board: def __init__(self, length, height, default_char='.'): # 初始化棋盘,每行结尾不加多余换行,避免split产生空元素 self.layout = '\n'.join([(' ' + default_char) * length + ' ' for _ in range(height)]) self.length = length self.height = height self.objects = {} def draw(self, pos_x=None, pos_y=None, draw_char=None, double=False, show=True): # 无参数时直接打印棋盘 if pos_x is None or pos_y is None or draw_char is None: print(self.layout) return # 只取字符第一个 if draw_char != '': draw_char = draw_char[0] # 拆分棋盘为行列表,无多余空元素 layout = self.layout.split('\n') # 坐标合法性校验 if pos_y < 0 or pos_y >= len(layout): raise ValueError("y坐标超出棋盘范围") if pos_x < 0 or pos_x >= self.length: raise ValueError("x坐标超出棋盘范围") # 拆分前序行、目标行、后续行 pre_lines = layout[:pos_y] target_line = list(layout[pos_y]) post_lines = layout[pos_y+1:] # 替换目标位置字符,x坐标对应位置是pos_x*2(因为每个字符前有空格) replace_idx = pos_x * 2 + 1 old_block = target_line[replace_idx] target_line[replace_idx] = draw_char target_line = ''.join(target_line) # 拼接新棋盘,不额外加多余换行 new_layout = '\n'.join(pre_lines + [target_line] + post_lines) self.layout = new_layout self.objects[draw_char] = (pos_x, pos_y, old_block) if show: if double: print(new_layout.replace(' ', ' ')) else: print(new_layout)
关键修改说明
- 初始化棋盘时改用
'\n'.join生成布局,避免末尾多余换行 - 去掉了错误的下标减1逻辑,改用切片拆分前序行、目标行、后续行,逻辑更清晰不易出错
- 拼接新布局时统一用
'\n'.join处理,不会额外增加多余换行 - 新增了坐标合法性校验,避免下标越界问题
测试示例
# 测试:生成5*5的棋盘,在(2,2)位置画X b = board(5,5) b.draw(2,2,'X')
运行后不会出现多余空行。
内容的提问来源于stack exchange,提问作者Webbop Work
相关产品推荐
相关产品推荐

