简单实现python数独游戏


Posted in Python onMarch 30, 2018

网上看到一个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 相关文章推荐
python实现斐波那契数列的方法示例
Jan 12 Python
使用Python中的tkinter模块作图的方法
Feb 07 Python
用tensorflow实现弹性网络回归算法
Jan 09 Python
Python爬虫包BeautifulSoup学习实例(五)
Jun 17 Python
python K近邻算法的kd树实现
Sep 06 Python
详解python--模拟轮盘抽奖游戏
Apr 12 Python
Django框架实现的普通登录案例【使用POST方法】
May 15 Python
Django中多种重定向方法使用详解
Jul 17 Python
Python 内置变量和函数的查看及说明介绍
Dec 25 Python
Python面向对象原理与基础语法详解
Jan 02 Python
python按顺序重命名文件并分类转移到各个文件夹中的实现代码
Jul 21 Python
Python页面加载的等待方式总结
Feb 28 Python
Python使用MD5加密算法对字符串进行加密操作示例
Mar 30 #Python
windows环境下tensorflow安装过程详解
Mar 30 #Python
Python切片工具pillow用法示例
Mar 30 #Python
Python实现OpenCV的安装与使用示例
Mar 30 #Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
Mar 30 #Python
Jupyter安装nbextensions,启动提示没有nbextensions库
Apr 23 #Python
python+opencv识别图片中的圆形
Mar 25 #Python
You might like
第十四节 命名空间 [14]
2006/10/09 PHP
php中的boolean(布尔)类型详解
2013/10/28 PHP
ThinkPHP之M方法实例详解
2014/06/20 PHP
PHP解析RSS的方法
2015/03/05 PHP
PHP使用Pthread实现的多线程操作实例
2015/11/14 PHP
Laravel程序架构设计思路之使用动作类
2018/06/07 PHP
JavaScript触发器详解
2007/03/10 Javascript
javascript 一个自定义长度的文本自动换行的函数
2007/08/19 Javascript
extjs 学习笔记(三) 最基本的grid
2009/10/15 Javascript
jQuery层次选择器选择元素使用介绍
2013/04/18 Javascript
JavaScript的Date()方法使用详解
2015/06/09 Javascript
举例讲解JavaScript中关于对象操作的相关知识
2015/11/16 Javascript
jQuery Ajax使用FormData对象上传文件的方法
2016/09/07 Javascript
jQuery判断邮箱格式对错实例代码讲解
2017/04/12 jQuery
Vue.js tab实现选项卡切换
2017/05/16 Javascript
react-router中的属性详解
2017/06/01 Javascript
TypeScript基础入门教程之三重斜线指令详解
2018/10/22 Javascript
深入理解使用Vue实现Context-Menu的思考与总结
2019/03/09 Javascript
基于node简单实现RSA加解密的方法步骤
2019/03/21 Javascript
vscode vue 文件模板的配置方法
2019/07/23 Javascript
基于js实现抽红包并分配代码实例
2019/09/19 Javascript
json.stringify()与json.parse()的区别以及用处
2021/01/25 Javascript
实例说明Python中比较运算符的使用
2015/05/13 Python
在Python的Django框架中编写错误提示页面
2015/07/22 Python
基于Python的文件类型和字符串详解
2017/12/21 Python
Python理解递归的方法总结
2019/01/28 Python
让IE6支持css3,让 IE7、IE8 都支持CSS3
2011/10/09 HTML / CSS
加拿大鞋子连锁店:Town Shoes
2016/09/26 全球购物
Everlast官网:拳击、综合格斗和健身相关的体育用品
2020/08/03 全球购物
CAT鞋加拿大官网:CAT Footwear加拿大
2020/08/05 全球购物
集团公司党的群众路线教育实践活动工作总结
2014/03/03 职场文书
新闻传播专业求职信
2014/07/22 职场文书
2014年保洁工作总结
2014/11/24 职场文书
家长评语怎么写
2014/12/30 职场文书
新教师教学工作总结
2015/08/14 职场文书
springboot为异步任务规划自定义线程池的实现
2022/06/14 Java/Android