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
相关产品推荐
相关产品推荐

