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开发之IDEL(Python GUI)的使用方法图文详解
Nov 12 Python
python3.4控制用户输入与输出的方法
Oct 17 Python
python中的协程深入理解
Jun 10 Python
Pycharm运行加载文本出现错误的解决方法
Jun 27 Python
Django框架视图层URL映射与反向解析实例分析
Jul 29 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
Aug 20 Python
python基于event实现线程间通信控制
Jan 13 Python
Python模拟FTP文件服务器的操作方法
Feb 18 Python
python logging.info在终端没输出的解决
May 12 Python
Django 解决model 反向引用中的related_name问题
May 19 Python
基于python实现百度语音识别和图灵对话
Nov 02 Python
2021年值得向Python开发者推荐的VS Code扩展插件
Jan 25 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
NOT NULL 和NULL
2007/01/15 PHP
PHP数组无限分级数据的层级化处理代码
2012/12/29 PHP
PHP大小写问题:函数名和类名不区分,变量名区分
2013/06/17 PHP
微信支付开发教程(一)微信支付URL配置
2014/05/28 PHP
PHP记录搜索引擎蜘蛛访问网站足迹的方法
2015/04/15 PHP
WordPress导航菜单的滚动和淡入淡出效果的实现要点
2015/12/14 PHP
PHP扩展类型及安装方式解析
2020/04/27 PHP
JavaScript Event学习第十章 一些可替换的事件对
2010/02/10 Javascript
js中将String转换为number以便比较
2014/07/08 Javascript
JavaScript实现网页对象拖放功能的方法
2015/04/15 Javascript
JavaScript中innerHTML,innerText,outerHTML的用法及区别
2015/09/01 Javascript
谈谈js中的prototype及prototype属性解释和常用方法
2015/11/25 Javascript
JS基于递归算法实现1,2,3,4,5,6,7,8,9倒序放入数组中的方法
2017/01/03 Javascript
超全面的JavaScript开发规范(推荐)
2017/01/21 Javascript
JavaScript装饰器函数(Decorator)实例详解
2017/03/30 Javascript
写给vue新手们的vue渲染页面教程
2017/09/01 Javascript
ajax请求data遇到的问题分析
2018/01/18 Javascript
关于vue中的ajax请求和axios包问题
2018/04/19 Javascript
微信小程序中插入激励视频广告并获取收益(实例代码)
2019/12/06 Javascript
tornado捕获和处理404错误的方法
2014/02/26 Python
使用url_helper简化Python中Django框架的url配置教程
2015/05/30 Python
Python数据库的连接实现方法与注意事项
2016/02/27 Python
Tensorflow使用支持向量机拟合线性回归
2018/09/07 Python
解决c++调用python中文乱码问题
2020/07/29 Python
如何在scrapy中捕获并处理各种异常
2020/09/28 Python
css3实现的多级渐变下拉菜单导航效果代码
2015/08/31 HTML / CSS
澳大利亚的奢侈品牌:Oroton
2016/08/26 全球购物
Sneaker Studio乌克兰:购买运动鞋
2018/03/26 全球购物
C#如何调用Windows程序打开一个文档
2014/12/26 面试题
网络事业创业计划书范文
2014/01/09 职场文书
物流仓储计划书
2014/01/10 职场文书
《恐龙》教学反思
2014/04/27 职场文书
英文投诉信格式
2015/07/03 职场文书
微信小程序实现录音Record功能
2021/05/09 Javascript
浅谈PostgreSQL表分区的三种方式
2021/06/29 PostgreSQL
详解Spring事件发布与监听机制
2021/06/30 Java/Android