上图:

直接上代码

 #!/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. DB:目录

    ylbtech-DB:目录 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtech出处:http://ylbtech.cn ...

  2. ExportOptions.plis是什么?

    参考: 具体每个字段的说明,参考: https://group.cnblogs.com/topic/80752.html 为什么自动化打包时,需要用到ExportOptions.plis文件,参考: ...

  3. 记录MNIST采用卷积方式实现与理解

    从时间上来说,这篇文章写的完了,因为这个实验早就做完了:但从能力上来说,这篇文章出现的早了,因为很多地方我都还没有理解.如果不现在写,不知道什么时候会有时间是其一,另外一个原因是怕自己过段时间忘记. ...

  4. POJ1426-Find The Multiple-bfs

    Given a positive integer n, write a program to find out a nonzero multiple m of n whose decimal repr ...

  5. ubuntu 去除开机背景

    sudo apt remove plymouth sudo sed -i 's/ splash//g' /etc/default/grub sudo update-grub

  6. 转 cpu高 问题分析定位

    文章来源: http://www.blogjava.net/hankchen/archive/2012/08/09/377735.html 一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原 ...

  7. Redis项目实战,一些经验总结

    来源:https://my.oschina.net/u/920698/blog/3031587 背景 Redis 是一个开源的内存数据结构存储系统. 可以作为数据库.缓存和消息中间件使用. 支持多种类 ...

  8. C++中函数模板的深入理解

    1,函数模板深入理解: 1,编译器从函数模板通过具体类型产生不同的函数: 1,模板就是模子,通过这个模子可以产生很多的实物: 2,函数模板就是编译器用来产生具体函数的模子: 2,编译器会对函数模板进行 ...

  9. vue基础学习一

    写一个例子,告诉你VUE的方便之处,就是双向绑定,不需要操作DOM对象,而是操作数据 div中msg 和JS中msg是一一对应的 然后看浏览器中 然后如果我想改变浏览器中值,我在console这么操作 ...

  10. 多线性方程组迭代算法——Jacobi迭代算法的Python实现

    多线性方程(张量)组迭代算法的原理请看这里:若想看原理部分请留言,不方便公开分享 Gauss-Seidel迭代算法:多线性方程组迭代算法——Gauss-Seidel迭代算法的Python实现 impo ...