python自带tkinter库实现棋盘覆盖图形界面


Posted in Python onJuly 17, 2019

python实现棋盘覆盖图形界面,供大家参考,具体内容如下

一、解决方案和关键代码

工具: python tkinter库

问题描述:

  在一个2^k×2^k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘.显然特殊方格在棋盘上出现的位置有4^k种情形.因而对任何k≥0,有4^k种不同的特殊棋盘。
  在棋盘覆盖问题中,要用下图中 4 中不同形态的 L 型骨牌覆盖一个给定的特殊棋牌上除特殊方格以外的所有方格,且任何 2 个 L 型骨牌不得重叠覆盖。易知,在任何一个 2^k × 2^k 的棋盘中,用到的 L 型骨牌个数恰为 (4^k-1)/3 。

python自带tkinter库实现棋盘覆盖图形界面

解决方法:递归与分治法

  用分治策略,可以设计解棋盘问题的一个简捷的算法。
  当 k>0 时,将 2^k * 2^k 棋盘分割为 4 个 2^(k-1) * 2^(k-1) 子棋盘;
  特殊方格必位于 4 个较小子棋盘之一中,其余 3 个子棋盘中无特殊方格。为了将这 3 个无特殊方格的子棋盘转化为特殊棋盘,我们可以用一个 L 型骨牌覆盖这 3 个较小的棋盘的汇合处,如下图所示,这 3 个子棋盘上被 L 型骨牌覆盖的方格就成为该棋盘上的特殊方格,从而将原问题化为 4 个较小规模的棋盘覆盖问题。递归的使用这种分割,直至棋盘简化为 1x1 棋盘。

python自带tkinter库实现棋盘覆盖图形界面

算法关键代码

def chessBoard(tr,tc,dr,dc,size):
 global tile
 global board
 if (size==1):
  return 0
 tile+=1
 t=tile
 s=size//2
 #the upper left corner
 if (dr<tr+s and dc<tc+s):
  chessBoard(tr,tc,dr,dc,s)
 else:
  board[tr+s-1,tc+s-1]=t
  chessBoard(tr,tc,tr+s-1,tc+s-1,s)
 #the upper right corner
 if (dr<tr+s and dc>=tc+s):
  chessBoard(tr,tc+s,dr,dc,s)
 else:
  board[tr+s-1,tc+s]=t
  chessBoard(tr,tc+s,tr+s-1,tc+s,s)
 #the lower left corner
 if (dr>=tr+s and dc<tc+s):
  chessBoard(tr+s,tc,dr,dc,s)
 else:
  board[tr+s,tc+s-1]=t
  chessBoard(tr+s,tc,tr+s,tc+s-1,s)
 #the lower right corner
 if (dr>=tr+s and dc>=tc+s):
  chessBoard(tr+s,tc+s,dr,dc,s)
 else:
  board[tr+s,tc+s]=t
  chessBoard(tr+s,tc+s,tr+s,tc+s,s)

画棋盘关键代码:

def drawboard(canvas1,board,colors,startx=50,starty=50,cellwidth=50):
 width=2*startx+len(board)*cellwidth
 height=2*starty+len(board)*cellwidth
 canvas1.config(width=width,height=height)#布置画布
 for i in range(len(board)):
  for j in range(len(board)):
   index=board[i][j]
   if index== 0:    
    color='white'#特殊方格显示为白色
   else:
    color=colors[6*index]#为了间隔开颜色
   cellx=startx+i*50
  celly=starty+j*50  
  canvas1.create_rectangle(cellx,celly,cellx+cellwidth,celly+cellwidth,fill=color,outline="black")#画方格
 canvas1.update()

二、数据测试

特殊方格坐标为(1,1),棋盘大小为(2^2*2^2)

python自带tkinter库实现棋盘覆盖图形界面

特殊方格坐标为(2,2),棋盘大小为(2^3*2^3)

 python自带tkinter库实现棋盘覆盖图形界面

完整代码下载链接点这里

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python使用Scrapy保存控制台信息到文本解析
Dec 27 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
Jul 13 Python
详解Python发送email的三种方式
Oct 18 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
Mar 30 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
Sep 23 Python
Python numpy数组转置与轴变换
Nov 15 Python
Python模块的制作方法实例分析
Dec 21 Python
pytorch 中pad函数toch.nn.functional.pad()的用法
Jan 08 Python
django 链接多个数据库 并使用原生sql实现
Mar 28 Python
python如何调用java类
Jul 05 Python
Python绘制词云图之可视化神器pyecharts的方法
Feb 23 Python
教你怎么用Python监控愉客行车程
Apr 29 Python
python递归法解决棋盘分割问题
Jul 17 #Python
Django-Model数据库操作(增删改查、连表结构)详解
Jul 17 #Python
python通过TimedRotatingFileHandler按时间切割日志
Jul 17 #Python
python递归法实现简易连连看小游戏
Mar 25 #Python
django2笔记之路由path语法的实现
Jul 17 #Python
Django之创建引擎索引报错及解决详解
Jul 17 #Python
python实现连连看辅助之图像识别延伸
Jul 17 #Python
You might like
DC动漫人物排行
2020/03/03 欧美动漫
咖啡风味 世界咖啡主要分布分布 咖啡的生长要求
2021/03/06 新手入门
php注入实例
2006/10/09 PHP
php循环创建目录示例分享(php创建多级目录)
2014/03/04 PHP
thinkPHP和onethink微信支付插件分享
2019/08/11 PHP
更正确的asp冒泡排序
2007/05/24 Javascript
简短几句 通俗解释javascript的闭包
2011/01/17 Javascript
新发现一个骗链接的方法(js读取cookies)
2012/01/11 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
浅谈Javascript中深复制
2014/12/01 Javascript
JavaScript forEach()遍历函数使用及介绍
2015/07/08 Javascript
JS实现网页上随机产生超链接地址的方法
2015/11/09 Javascript
js与applet相互调用的方法
2016/06/22 Javascript
JavaScript中有关一个数组中最大值和最小值及它们的下表的输出的解决办法
2016/07/01 Javascript
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
vue中使用cookies和crypto-js实现记住密码和加密的方法
2018/10/18 Javascript
在vue中使用vuex,修改state的值示例
2019/11/08 Javascript
使用Typescript开发微信小程序的步骤详解
2021/01/12 Javascript
[36:45]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[47:08]OG vs INfamous 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python使用7z解压软件备份文件脚本分享
2014/02/21 Python
python实现TCP服务器端与客户端的方法详解
2015/04/30 Python
Python基于jieba库进行简单分词及词云功能实现方法
2018/06/16 Python
浅谈Python在pycharm中的调试(debug)
2018/11/29 Python
python判断一个数是否能被另一个整数整除的实例
2018/12/12 Python
Django如何使用第三方服务发送电子邮件
2019/08/14 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
2019/10/14 Python
numpy 声明空数组详解
2019/12/05 Python
Python ORM编程基础示例
2020/02/02 Python
pytorch torchvision.ImageFolder的用法介绍
2020/02/20 Python
函授自我鉴定范文
2014/02/06 职场文书
优秀员工推荐信
2014/05/10 职场文书
服务宗旨标语
2014/07/01 职场文书
船舶调度指挥系统——助力智慧海事
2022/02/18 无线电
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
2022/03/16 Redis
Ruby处理CSV数据方法详解
2022/04/18 Ruby