上图:

直接上代码

 #!/usr/bin/python3
#coding=GB2312
import tkinter as tk
import threading
import time
import random
import sys class Cell():
def __init__(self, row, col):
self.row, self.col = row, col
self.top, self.right, self.bottom, self.left = True, True, True, True
self.visited = False
def __str__(self):
return 'row:{} col:{}--{} {} {} {}'.format( \
self.row, self.col, self.top, self.right, \
self.bottom, self.left)
def setVisited(self):
self.visited = True
def isVisited(self):
return self.visited class Maze(threading.Thread):
colCount = 50
rowCount = 50
winWidth = 700
winHeight = 700
beginOf = (0, 0)
endOf = (colCount - 1, rowCount - 1)
def __init__(self):
threading.Thread.__init__(self)
self.initData()
self.initUi() """
以下是ui界面方法
"""
def initUi(self):
self.ui = tk.Tk()
self.centeredDisplay()
self.cs = tk.Canvas(self.ui, bg = '#121a2a')
self.cs.pack(fill = tk.BOTH, expand = 1)
self.ui.bind('<Key-h>', self.hideCell)
self.ui.bind('<Key-Up>', self.up)
#self.updateUi() self.start()
def hideCell(self, event):
self.cs.delete('currend')
def up(self, event):
pass
def updateUi(self):
w = float(self.winWidth / self.colCount)
h = float(self.winHeight / self.rowCount)
for row in range(self.rowCount):
for col in range(self.colCount):
cell = self.cells[row][col]
tagtmp = 'wall%02d%02d' % (row, col)
if cell.top:
self.cs.create_line(\
(w * col, h * row), \
(w * (col + 1), h * row), \
width = 3, fill = 'yellow', tag = 'top' + tagtmp)
else:
self.cs.delete('top' + tagtmp)
if cell.right:
self.cs.create_line(\
(w * (col + 1), h * row), \
(w * (col + 1), h * (row + 1)), \
width = 3, fill = 'yellow', tag = 'right' + tagtmp)
else:
self.cs.delete('right' + tagtmp)
if cell.bottom:
self.cs.create_line(\
(w * (col + 1), h * (row + 1)), \
(w * col, h * (row + 1)), \
width = 3, fill = 'yellow', tag = 'bottom' + tagtmp)
else:
self.cs.delete('bottom' + tagtmp)
if cell.left:
self.cs.create_line(\
(w * col, h * (row + 1), \
(w * col, h * row)), \
width = 3, fill = 'yellow', tag = 'left' + tagtmp)
else:
self.cs.delete('left' + tagtmp) self.cs.create_rectangle((self.beginOf[0] * w + 3, self.beginOf[1] * h + 3), \
(self.beginOf[0] + 1) * w - 3, (self.beginOf[1] + 1) * h - 3, \
fill = '#b4532a', tag = 'begin')
self.cs.create_rectangle((self.endOf[0] * w + 3, self.endOf[1] * h + 3), \
(self.endOf[0] + 1) * w - 3, (self.endOf[1] + 1) * h - 3, \
fill = '#ff0000', tag = 'end')
self.cs.delete('currend')
self.cs.create_rectangle((self.currentCell.col * w + 10, self.currentCell.row * h + 10), \
(self.currentCell.col + 1) * w - 10, (self.currentCell.row + 1) * h - 10, \
fill = '#00ff00', tag = 'currend') self.cs.update() def centeredDisplay(self):
w = self.ui.winfo_screenwidth()
h = self.ui.winfo_screenheight()
self.ui.geometry('{}x{}+{}+{}'.format(\
self.winWidth, self.winHeight, \
int((w - self.winWidth)/2), \
int((h - self.winHeight)/2)))
self.ui.resizable(False, False)
self.ui.title('Maze by jianc') """
以是ui界面方法 以下是逻辑线程方法
"""
def initData(self):
self.cells = [[Cell(row, col) for col in range(self.colCount)] \
for row in range(self.rowCount)]
self.cellStack = [] self.currentCell = self.cells[self.beginOf[0]][self.beginOf[1]]
def delWall(self, cell, cell2):
if 1 == cell.row - cell2.row:
cell.top, cell2.bottom = False, False
elif -1 == cell.row - cell2.row:
cell.bottom, cell2.top = False, False
if 1 == cell.col - cell2.col:
cell.left, cell2.right = False, False
elif -1 == cell.col - cell2.col:
cell.right, cell2.left = False, False
def topCell(self, cell):
if 0 == cell.row:
return None
ret = self.cells[cell.row - 1][cell.col]
if ret.isVisited():
return None
return ret
def rightCell(self, cell):
if self.colCount - 1 == cell.col:
return None
ret = self.cells[cell.row][cell.col + 1]
if ret.isVisited():
return None
return ret
def bottomCell(self, cell):
if self.rowCount - 1 == cell.row:
return None
ret = self.cells[cell.row + 1][cell.col]
if ret.isVisited():
return None
return ret
def leftCell(self, cell):
if 0 == cell.col:
return None
ret = self.cells[cell.row][cell.col - 1]
if ret.isVisited():
return None
return ret def checkNeighbor(self):
curCell = self.currentCell
curCell.setVisited()
neighbor = [self.topCell(curCell), self.rightCell(curCell), \
self.bottomCell(curCell), self.leftCell(curCell)]
while None in neighbor:
neighbor.remove(None)
n = len(neighbor)
if 0 == n:
try:
self.currentCell = self.cellStack.pop()
if None == curCell:
return
#self.updateUi()
self.checkNeighbor()
return
except:
return
self.cellStack.append(self.currentCell)
self.currentCell = neighbor[random.randint(0, n - 1)] self.delWall(curCell, self.currentCell) #self.updateUi()
self.checkNeighbor() def run(self):
self.checkNeighbor()
self.updateUi()
print('thread finish')
"""
以上是逻辑线程方法
""" sys.setrecursionlimit(100000)
maze = Maze()
tk.mainloop()

python3迷宫,多线程版的更多相关文章

  1. python网络聊天器多线程版

    在之前的一篇文章(python网络编程-udp)中实现了一个简单的udp聊天器,只能在单线程下进行收发数据,在学习完多线程之后,实现一个能同时收发数据的udp聊天器. 说明: 编写一个有2个线程的程序 ...

  2. 【pyhon】nvshens按目录图片批量下载爬虫1.00(多线程版)

    # nvshens按目录图片批量下载爬虫1.00(多线程版) from bs4 import BeautifulSoup import requests import datetime import ...

  3. Python3.11正式版,它来了!

    转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/b055fbf2.html 你好,我是测试蔡坨坨. 就在前几天,2022年10月24日,Python3.11正式版发布了! P ...

  4. Python3之多线程学习

    这里做一个自己复习多线程的笔记 Python中使用线程有两种方式:函数或者用类来包装线程对象. 函数式:调用 _thread 模块中的start_new_thread()函数来产生新线程.语法如下: ...

  5. Python3.4 多线程

    线程安全和全局解释器锁 Thread State and the Global Interpreter Lock 总结: 通过使用GIL后, Python多线程安全, 并且数据保持同步. Python ...

  6. 【Python3之多线程】

    一.threading模块 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性. 1.开启线程的两种方式(同Process) 方法一 from thr ...

  7. 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(多线程版)

    # 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 from queue import Queue import requests from lxml import etree ...

  8. Python3用多线程替代for循环提升程序运行速度

    [本文出自天外归云的博客园] 优化前后新老代码如下: from git_tools.git_tool import get_collect_projects, QQNews_Git from thre ...

  9. python3.4多线程实现同步的四种方式

    临界资源即那些一次只能被一个线程访问的资源,典型例子就是打印机,它一次只能被一个程序用来执行打印功能,因为不能多个线程同时操作,而访问这部分资源的代码通常称之为临界区. 1. 锁机制 threadin ...

随机推荐

  1. 热经-北京中地时空数码科技有限公司-研发工程师(WEBGIS方向)

    一面: 登记,填写个人信息 笔试 选择题: HTML,CSS,JS 的选择题,都是基础题.其中有一道问哪个不是 document 的属性或方法,我在 bgColor 和 focus() 上面纠结了一下 ...

  2. javascript: 禁用右键、文本选择功能、复制按键

    <script type="text/javascript"> //禁用右键.文本选择功能.复制按键 //http://www.jinyuanbao.cn $(docu ...

  3. django 视图与网址

    我是一个新手,内容粗糙,望大家多多指点.在这里我只是总结自身所学. 视图与网址 操作文件:urls.py.views.py urls.py 作用:用于处理前台的链接(如前台访问:127.0.0.1:8 ...

  4. ID和Phone高压缩比存储和查询

    ID和Phone高压缩比存储和查询的简单例子, 无多线程处理 运行环境JDK8+maven 0. 模块分割 1. 基本思路 源文件BCP每一行都转为一个全局的RowID,可以直接映射到FileName ...

  5. mysqldump 多实例备份

    通过/var/lib/mysql/mysql4406.sock   登录到某一个实例,备份 mysqldump -uroot -p --all-databases --add-drop-databas ...

  6. Ubuntu18.04+CUDA9.0+cuDNN7.1.3+openface安装总结

    目录 前言 编译工具CMake C++标准库安装 下载OpenFace代码 OpenCV安装 luarocks-Lua 包管理器,提供一个命令行的方式来管理 Lua 包依赖.安装第三方 Lua 包等功 ...

  7. 项目部署到IIS后,明明存在某个文件,但是访问却返回404

    项目部署到IIS后,明明存在某个文件,但是访问却返回404,这是为什么呢,原因很可能是未添加MIME类型 比如我的文件名是“iconfont.woff” 打开IIS,点击对应的项目,右面展示的是下图 ...

  8. 三、IDS4建立authorization server

    建立authorization server 一.环境搭建 1.创建项目 2.引用NuGet的identityserver4 3.配置asp.net core 管道 打开Startup.cs, 编辑C ...

  9. C++ I/O库练习

    编写函数,以读模式打开一个文件,将其内容读入到一个string的vector中,将每一行作为一个独立的元素存于vector中,并输出. 思路:1.以读的模式打开文件“目录.txt”: 2.先创建str ...

  10. js 输入整数

    1.我用 /^\+?[1-9][0-9]*$/ 貌似不对(小数也可以输入) 2.输入整数  n = /^[1-9]\d*$/; . -]\d*$/; //判断字符串是否为数字 if (!value) ...