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

四子棋游戏check函数异常排查:列满校验失效问题

四子棋(4 in a row)游戏check函数修复方案

核心问题分析

  • 列索引偏移导致校验与操作列不匹配:主循环中调用check()验证用户输入后,执行了col -= 1,使得后续function()填充的列是用户输入列号减1,但check()判断的是用户原始输入列对应的matrix[0][col]。例如用户输入列3,check()检测列3是否已满,实际却填充列2,即便列2已满,check()也会因列3为空而放行。
  • check函数列范围判断错误:硬编码col>10作为无效列判断,应使用全局变量SIZE替换(正确条件为col >= SIZE),否则当棋盘尺寸不等于11时,会出现允许无效列或误拦截有效列的问题。
  • function函数循环逻辑冗余:通过i +=1; i *= -1遍历负索引,逻辑绕弯易出错,直接从最后一行向上遍历更清晰。
  • SIZE变量未定义:代码多处使用SIZE但未赋值,会直接引发运行错误,需先定义棋盘尺寸。

修复后的关键代码

1. 修正check函数

def check():
    global col
    global SIZE
    global booli
    global matrix

    # 修正列范围判断,用SIZE替代硬编码值;校验实际要操作的列是否已满
    while (col >= SIZE or col < 0) or (col != -1 and matrix[0][col] != EMPTY):
        col = int(input("try again."))

    if col == -1:
        booli = False
    return False

2. 移除主循环中的列索引偏移

删除check()后的col -= 1,确保校验与操作的是同一列:

while col != -1 :
    if who%2 == 0:
        check()
        if booli == False:
            break
        # 移除 col -= 1
        function(FIRST)
        pboard(matrix)
        print(win(FIRST))
    elif who % 2 != 0:
        check()
        if booli == False:
            break
        # 移除 col -= 1
        function(SECOND)
        pboard(matrix)
        print(win(SECOND))
    # 后续逻辑保持不变...

3. 优化function函数逻辑

def function(who2):
    global col
    # 从最后一行向上遍历,找到第一个空位填充
    for row in range(SIZE-1, -1, -1):
        if matrix[row][col] == EMPTY:
            matrix[row][col] = who2
            break

4. 补充SIZE定义

在代码开头添加棋盘尺寸定义:

SIZE = 7  # 标准四子棋为7列6行,可按需调整

额外优化建议

  • 减少全局变量使用:尽量通过参数传递matrix、col等变量,避免全局变量引发的逻辑混乱
  • 完善win函数:当前仅支持横向、纵向四子连线判断,需补充对角线校验逻辑
  • 优化输入提示:在input()中给出明确指引,比如"enter the column (0-6, -1 to quit): "

内容的提问来源于stack exchange,提问作者joee__mama

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 02:17:03