简单实现python数独游戏
更新时间:2018年03月30日 15:28:02 作者:单鹏飞
这篇文章主要为大家详细介绍了如何简单实现python数独游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
网上看到一个python写的数独,很好玩,分享给大家。
import random import itertools from copy import deepcopy def make_board(m = 3): numbers = list(range(1, m**2 + 1)) board = None while board is None: board = attempt_board(m, numbers) return board def attempt_board(m, numbers): n = m**2 board = [[None for _ in range(n)] for _ in range(n)] for i, j in itertools.product(range(n), repeat = 2): i0, j0 = i - i % m, j - j % m random.shuffle(numbers) for x in numbers: if(x not in board[i]) and all(row[j] != x for row in board) and all(x not in row[j0:j0+m] for row in board[i0:i]): board[i][j] = x break else: return None return board def print_board(board, m = 3): numbers = list(range(1, m**2 + 1)) omit = 5 challange = deepcopy(board) for i, j in itertools.product(range(omit), range(m ** 2)): x = random.choice(numbers) - 1 challange[x][j] = None spacer = "++---+---+---++---+---+---++---+---+---++" print (spacer.replace('-', '=')) for i, line in enumerate(challange): print("|| {0} | {1} | {2} || {3} | {4} | {5} || {6} | {7} | {8} ||".format(*(cell or ' ' for cell in line))) if(i + 1) % 3 == 0: print(spacer.replace('-', '=')) else: print(spacer) return challange def print_answer(board): spacer = "++---+---+---++---+---+---++---+---+---++" print(spacer.replace('-','=')) for i, line in enumerate(board): print("|| {0} | {1} | {2} || {3} | {4} | {5} || {6} | {7} | {8} ||".format(*(cell or ' ' for cell in line))) if(i + 1) % 3 == 0: print(spacer.replace('-','=')) else: print(spacer) def is_full(challange, m = 3): for i, j in itertools.product(range(m**2), repeat = 2): if challange[i][j] is None: return False return True def cal_candidate(challange, x, y, m = 3): candidate = range(1, m ** 2 + 1) for i in range(m ** 2): if challange[x][i] in candidate: candidate.remove(challange[x][i]) if challange[i][y] in candidate: candidate.remove(challange[i][y]) for i, j in itertools.product(range(m), repeat = 2): x0, y0 = x - x % m, y - y % m if challange[x0 + i][y0 + j] in candidate: candidate.remove(challange[x0 + i][y0 + j]) return candidate def least_candidate(challange, m = 3): least, x, y = m ** 2, -1, -1 for i, j in itertools.product(range(m ** 2), repeat = 2): if not challange[i][j]: num = len(cal_candidate(challange, i, j)) if num < least: least = num x, y = i, j return x, y def solving_soduku(challange, m = 3): if is_full(challange): return challange x, y = least_candidate(challange) id = x * (m ** 2) + y result = try_candidate(challange, id) return result def try_candidate(challange, id, m = 3): if is_full(challange): return challange x = id / (m ** 2) y = id % (m ** 2) while challange[x][y]: id = (id + 1) % m ** 4 x = id / (m ** 2) y = id % (m ** 2) candidate = cal_candidate(challange, x, y) if len(candidate) == 0: return False for i in range(len(candidate)): challange[x][y] = candidate[i] result_r = try_candidate(challange, (id + 1) % m ** 4) if not result_r: pass else: return challange challange[x][y] = None return False #Board = make_board() #print Board #challange = print_board(Board) #print_answer(Board) #result = solving_soduku(challange) #print_answer(result) testing = [[8, None, None, None, None, None, None, None, None], [None, None, 3, 6, None, None, None, None, None], [None, 7, None, None, 9, None, 2, None, None], [None,5 , None, None, None, 7, None, None, None ], [None, None, None, None, 4, 6, 7, None, None], [None, None, None, 1, None, None, None, 3, None], [None, None, 1, None, None, None, None, 6, 8], [None, None, 8, 5, None, None, None, 1, None], [None, 9, None, None, None, None, 4, None, None]] result = solving_soduku(testing) print_answer(result)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
浅谈python 中的 type(), dtype(), astype()的区别
这篇文章主要介绍了浅谈python 中的 type(), dtype(), astype()的区别,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-04-04解决Jupyter notebook更换主题工具栏被隐藏及添加目录生成插件问题
这篇文章主要介绍了解决Jupyter notebook更换主题工具栏被隐藏及添加目录生成插件问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-04-04matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)
这篇文章主要介绍了matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-08-08Python使用Webargs实现简化Web应用程序的参数处理
在开发Web应用程序时,参数处理是一个常见的任务,Python的Webargs模块为我们提供了一种简单而强大的方式来处理这些参数,下面我们就来学习一下具体操作吧2024-02-02
最新评论