蛇梯棋棋盘打印函数异常:多余符号与行列错误修复求助
修复蛇梯棋棋盘打印功能的异常问题
问题概述
开发蛇梯棋棋盘打印功能时遇到以下异常:
- 特定位置(如玩家在20、CPU在18)会出现多余的
*符号,棋盘布局偏移 - 出现重复数字的额外行(如29重复10次)
- 本该显示0-9的最后一行缺失
需求回顾:
- 棋盘从99到90起始,行尾为偶数时,下一行从该行尾数字-10开始到该行尾数字-1结束(例如第二行80-89)
- 玩家位置用
*、CPU用#标记,位置重合时用@ - 每轮清空终端后重新打印,需恢复旧位置的数字
错误原因分析
- 行生成逻辑错误:原代码未正确控制奇偶行的数字排列方向,导致最后一行(0-9)未生成,反而多出错误行
- 位置替换索引计算错误:未准确映射数字到棋盘的行/列位置,导致符号替换到错误格子,出现多余标记
- 输出格式化缺失:未对棋盘元素做对齐处理,数字位数差异引发布局偏移
修复后的代码(Python实现)
import os def print_board(player_pos, opponent_pos): # 跨平台清空终端 os.system('cls' if os.name == 'nt' else 'clear') # 初始化棋盘:按规则生成10行数字 board = [] for row_idx in range(10): base_num = 99 - row_idx * 10 if row_idx % 2 == 0: # 偶数行(第0、2、4、6、8行):从base_num递减到base_num-9 current_row = list(range(base_num, base_num - 10, -1)) else: # 奇数行(第1、3、5、7、9行):从base_num-9递增到base_num current_row = list(range(base_num - 9, base_num + 1)) board.append(current_row) # 替换玩家与CPU位置标记 for r in range(10): for c in range(10): cell_num = board[r][c] if cell_num == player_pos and cell_num == opponent_pos: board[r][c] = '@' elif cell_num == player_pos: board[r][c] = '*' elif cell_num == opponent_pos: board[r][c] = '#' # 格式化打印棋盘 for row in board: # 每个元素居中对齐,占3字符宽度 formatted_cells = [f"{item:^3}" for item in row] print('|'.join(formatted_cells)) print('-' * 39) # 分隔线:3*10 + 9个分隔符 = 39字符长度 # 测试场景:玩家在20,CPU在18 print_board(20, 18)
修复要点说明
- 正确的行生成规则:通过
row_idx奇偶性控制数字排列方向,确保最后一行(第9行)自然生成0-9的顺序,解决最后一行缺失问题 - 精准位置映射:直接遍历棋盘每个格子对比数字,避免索引计算错误,消除多余符号和偏移
- 统一格式化输出:用
^3居中对齐每个元素,保证棋盘布局整齐,不会因数字位数差异导致错位 - 跨平台终端清空:适配Windows和类Unix系统的终端清空命令,保证每轮刷新效果
内容的提问来源于stack exchange,提问作者Fruitpunchsamurai
相关产品推荐
相关产品推荐

