Python四子棋(Connect4)输入验证异常:重复循环问题修复求助
四子棋(Connect4)输入验证问题修复方案
原代码核心问题
- 重复调用验证函数:
play_game中先后调用两次validate_input(x),第一次验证后的正确结果未保存,第二次仍传入原始错误输入值,导致验证流程重复执行。 - 验证函数逻辑缺陷:
validate_input的while循环未实现真正的循环校验——错误输入后仅重新获取一次输入就直接返回,未验证新输入是否合法;同时未处理非数字输入引发的ValueError异常。 - 落子逻辑小问题:原代码中
ROWS=7,但最后一行是列号提示,落子会误操作到列号行,导致提示被覆盖。
修复后的完整代码
board = [['⚪', '⚪', '⚪', '⚪', '⚪', '⚪', '⚪'], ['⚪', '⚪', '⚪', '⚪', '⚪', '⚪', '⚪'], ['⚪', '⚪', '⚪', '⚪', '⚪', '⚪', '⚪'], ['⚪', '⚪', '⚪', '⚪', '⚪', '⚪', '⚪'], ['⚪', '⚪', '⚪', '⚪', '⚪', '⚪', '⚪'], ['⚪', '⚪', '⚪', '⚪', '⚪', '⚪', '⚪'], ['1️⃣ ', '2️⃣ ', '3️⃣ ', '4️⃣ ', '5️⃣ ', '6️⃣ ', '7️⃣']] ROWS = 7 COLUMNS = 7 def print_board(): '''打印游戏棋盘''' for row in board: print(' '.join(row)) def place_chip(col, player): '''在指定列的最下方空位放置棋子''' col_idx = col - 1 # 从倒数第二行开始向上找空位(跳过最后一行的列号提示) for row_idx in range(ROWS-2, -1, -1): if board[row_idx][col_idx] == '⚪': board[row_idx][col_idx] = player break def validate_input(): '''获取并验证玩家输入,直到得到1-7的合法列号''' while True: try: col = int(input('请选择1-7之间的列号:')) if 1 <= col <=7: return col else: print(f'列号{col}不存在,请选择1-7之间的列号') except ValueError: print('输入无效,请输入数字') def play_game(): print_board() # 仅调用一次验证函数,获取合法列号 valid_col = validate_input() place_chip(valid_col, '🔴') print_board() play_game()
关键修复说明
- 重构验证函数:让
validate_input主动内部获取输入,通过while True持续循环校验,同时用try-except捕获非数字输入的异常,确保只有符合1-7范围的数字才会返回。 - 优化调用逻辑:
play_game中仅调用一次验证函数,将返回的合法列号赋值给变量后再传入落子函数,彻底解决重复验证问题。 - 修正落子范围:调整落子的行索引范围,跳过最后一行的列号提示行,避免误覆盖操作提示。
内容的提问来源于stack exchange,提问作者HuzzyOg
相关产品推荐
相关产品推荐

