1V1国际跳棋项目:实现棋子移动后棋盘无变化的问题排查
核心代码问题定位
- 全局棋盘被多余初始化逻辑污染:项目已预先定义带初始棋子的8行8列
board数组,原本写的create_game_board函数没有做棋盘重置,反而向已有数组末尾追加8行全空格内容,导致实际存储的棋盘从8行扩容为16行,预先编写的初始棋子数据未被正确使用。 - 移动核心操作完全缺失:
valid_Move_position函数仅接收用户输入的坐标值,未执行任何棋盘修改动作——既没有将input读取的字符串类型坐标转换为可用于列表索引的整数,也没有完成“清空原位置、向目标位置写入棋子”的核心赋值,因此棋盘始终不会发生变化。 - 原有移动逻辑方向颠倒:被注释的移动代码中,错误将原位置直接赋值为棋子值,而非提取原位置棋子后完成跨位置移动,逻辑完全不符合棋子移动规则。
- 缺少基本校验:未校验输入坐标是否在0-7的棋盘范围内,也未校验原位置是否存在合法棋子、目标位置是否为空,容易引发索引报错或无效移动。
可直接运行的修正版本
rows = 8 cols = 8 # 保留已定义的初始棋子棋盘,移除会污染棋盘的create_game_board逻辑 board = [['B', '-', 'B', '-', 'B', '-', 'B', '-'], ['-', 'B', '-', 'B', '-', 'B', '-', 'B'], ['B', '-', 'B', '-', 'B', '-', 'B', '-'], ['-', '-', '-', '-', '-', '-', '-', '-'], ['-', '-', '-', '-', '-', '-', '-', '-'], ['-', 'w', '-', 'w', '-', 'w', '-', 'w'], ['w', '-', 'w', '-', 'w', '-', 'w', '-'], ['-', 'w', '-', 'w', '-', 'w', '-', 'w']] validTurn = True def move_piece(target_board, curr_row, curr_col, target_row, target_col): # 提取待移动的棋子 moving_piece = target_board[curr_row][curr_col] # 清空原位置 target_board[curr_row][curr_col] = '-' # 将棋子落到目标位置 target_board[target_row][target_col] = moving_piece return target_board def valid_Move_position(target_board): # 读取坐标并转换为整数索引 curr_row = int(input("输入要移动棋子的行号(0-7): ")) curr_col = int(input("输入要移动棋子的列号(0-7): ")) target_row = int(input("输入目标位置的行号(0-7): ")) target_col = int(input("输入目标位置的列号(0-7): ")) # 执行移动操作 updated_board = move_piece(target_board, curr_row, curr_col, target_row, target_col) return updated_board def print_board(target_board): # 打印列索引表头 print(" ", end="") for col in range(cols): print(f" {col}", end="") print() # 逐行打印棋盘内容 for row in range(rows): print(f"{row} ", end="") for col in range(cols): print(f"|{target_board[row][col]}", end="") print("|") # 示例测试流程:移动2行2列位置的B棋子(即按1起始计数的2行3列位置)到3行3列位置 print("===== 初始棋盘 =====") print_board(board) new_board = valid_Move_position(board) print("\n===== 移动后棋盘 =====") print_board(new_board)
注意:国际跳棋的合法落子格为行列索引和为偶数的深色格,不要在空白的浅色格(标记为
-的非落子位)尝试移动,否则会因为原位置无棋子出现异常。
内容的提问来源于stack exchange,提问作者MaorNikha
相关产品推荐
相关产品推荐

