You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python四子棋(Connect4)输入验证异常:重复循环问题修复求助

四子棋(Connect4)输入验证问题修复方案

原代码核心问题

  1. 重复调用验证函数:play_game中先后调用两次validate_input(x),第一次验证后的正确结果未保存,第二次仍传入原始错误输入值,导致验证流程重复执行。
  2. 验证函数逻辑缺陷:validate_input的while循环未实现真正的循环校验——错误输入后仅重新获取一次输入就直接返回,未验证新输入是否合法;同时未处理非数字输入引发的ValueError异常。
  3. 落子逻辑小问题:原代码中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:05:20