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

Python实现数独游戏代码无法运行,求问题排查与解决方案

数独代码问题排查与修复方案

存在的问题

  • 缩进错误:check_conditions函数的宫格处理、校验逻辑、行校验代码全部写在函数外部,访问函数内部变量会触发NameError,行校验代码前多余缩进还会触发语法错误。
  • 3x3宫格取值错误:中间三列对应的d/e/f三个宫格错误截取了每行[1:6]范围,而非正确的[3:6],宫格元素完全不符合规则要求。
  • 校验逻辑缺陷:行、列、宫格校验直接对包含0的列表做去重判断,0是待填充标识,多个0属于正常情况,会导致未填完时校验永远不通过;原宫格用sum=45的判断仅在全填充完成后有效,未填充时永远返回False。
  • 函数调用错误:begin_soduko的循环条件中check_conditions未加括号,直接判断函数对象本身而非返回值,逻辑永远为真。
  • 循环条件逻辑错误:原循环要求三个校验同时为False才执行,几乎不可能进入循环;列校验的all_column仅在初始化时生成一次,后续棋盘更新不会同步,导致列校验永远无效。
  • 存在HTML转义字符:粘贴带入的"、<等转义符未替换为正常符号,会触发语法错误。
  • 结束提示逻辑错误:通关提示直接写在模块层面,程序启动就会打印,和游戏进度无关。
  • 函数缺少正确返回值:所有校验函数通过后没有返回True,默认返回None会导致逻辑判断出错。
  • 输入未适配用户习惯:数独行列通常从1开始计数,代码直接用输入值作为0起始的索引,容易导致越界错误。

修复后的完整代码

board = [
    [0,0,6,9,0,5,0,1,0],
    [9,7,0,0,1,2,3,0,5],
    [0,2,0,0,0,4,8,6,0],
    [5,0,3,8,0,0,0,2,0],
    [0,0,0,0,0,0,0,0,0],
    [0,8,0,0,0,1,9,0,7],
    [0,5,4,1,0,0,0,7,0],
    [2,0,7,4,5,0,0,9,3],
    [0,6,0,7,0,3,1,0,0]
]

# 校验3x3宫格、行是否符合规则
def check_conditions():
    # 正确提取所有3x3宫格
    a = board[0][0:3] + board[1][0:3] + board[2][0:3]
    b = board[3][0:3] + board[4][0:3] + board[5][0:3]
    c = board[6][0:3] + board[7][0:3] + board[8][0:3]
    d = board[0][3:6] + board[1][3:6] + board[2][3:6]
    e = board[3][3:6] + board[4][3:6] + board[5][3:6]
    f = board[6][3:6] + board[7][3:6] + board[8][3:6]
    g = board[0][6:9] + board[1][6:9] + board[2][6:9]
    h = board[3][6:9] + board[4][6:9] + board[5][6:9]
    i = board[6][6:9] + board[7][6:9] + board[8][6:9]

    all_squares = [a,b,c,d,e,f,g,h,i]
    # 校验宫格非0元素无重复
    for square in all_squares:
        non_zero = [x for x in square if x != 0]
        if len(non_zero) != len(set(non_zero)):
            return False
    # 校验行非0元素无重复
    for row in board:
        non_zero = [x for x in row if x != 0]
        if len(non_zero) != len(set(non_zero)):
            return False
    return True

# 校验棋盘是否没有0(已填完)
def zero_condition():
    for row in board:
        for j in row:
            if j == 0:
                return False
    return True

# 获取指定列
def get_column(col, board):
    column = []
    for i in range(len(board)):
        column.append(board[i][col])
    return column

# 校验列非0元素无重复
def check_column():
    all_column = [get_column(i, board) for i in range(9)]
    for col in all_column:
        non_zero = [x for x in col if x != 0]
        if len(non_zero) != len(set(non_zero)):
            return False
    return True

# 选择单元格填数
def choose_cell():
    try:
        row = int(input("选择行(1-9):")) - 1
        column = int(input("选择列(1-9):")) - 1
        choose_num = int(input("选择1-9之间的数字:"))
        if 0 < choose_num <=9 and 0 <= row <9 and 0 <= column <9:
            board[row][column] = choose_num
        else:
            print("输入不合法,请重新输入")
            choose_cell()
    except:
        print("输入格式错误,请重新输入")
        choose_cell()

# 游戏主逻辑
def begin_soduko():
    answer= input("要玩数独吗?输入yes开始:")
    if answer == "yes":
        # 未满足通关条件就持续循环
        while not (zero_condition() and check_conditions() and check_column()):
            choose_cell()
        print("你已经完成数独!!!")

# 启动游戏
begin_soduko()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:24:07