上图:

直接上代码

 #!/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. JS 時間戳轉日期格式

    1.日期轉換為時間戳,(如果日期格式為時間戳,將其轉為日期類型,否則輸出傳入的數據) // 如果時間格式為時間戳,將其轉為日期 function timestampToDate(timestamp) ...

  2. Python3函数中特殊形参的使用:*、*args、**kwargs

    Python3函数中特殊形参的使用:*.*args.**kwargs ==用法1:不定长参数== 当函数需要的参数数量不确定的时候,可以使用*args 和 **kwargs , 所有的位置参数保存在* ...

  3. 用vim写go代码——vim-go插件

    GoImport:导入包 GoImport!:导入远程包 GoImportAs: 导入包并且重命名

  4. 各种Web服务器与Nginx的对比

    Tomcat和Jetty面向Java语言,先天就是重量级的Web服务器,它们的性能与Nginx没有可比性. IIS只能在windows操作系统上运行,Windows作为服务器在稳定性与其他一些性能上都 ...

  5. 如何访问 Redis 中的海量数据,服务才不会挂掉?

    来源:www.toutiao.com/i6697540366528152077 一.前言 有时候我们需要知道线上的Redis的使用情况,尤其需要知道一些前缀的key值,让我们怎么去查看呢?并且通常情况 ...

  6. Java数组遍历

    1.数组声明格式: 数据类型 [] 数组名 = new 数据类型[长度]: 数组长度一旦确定无法更改. 数组里的数据必须是相同类型或自动向上转型后兼容的类型 2.数组遍历 //一维数组 String ...

  7. Mac 电脑如何卸载 重装node

    由于在日常开发中,部分node版本不支持,因此,我们需要对已安装的node进行卸载重装,步骤如下: 一.在终端依次输入以下命令   sudo npm uninstall npm -g   sudo r ...

  8. linux c 链接详解1-多目标文件链接

    1. 多目标文件的链接 摘自:linux c编程一站式学习 http://learn.akae.cn/media/index.html 可以学会在linux下将多个c语言文件一起编译. 现在我们把例  ...

  9. bzoj 1176 cdq分治套树状数组

    题面: 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=2000000. Inp ...

  10. SP2-0618: Cannot find the Session Identifier.

    [oracle@trade1 ~]$ sqlplus  user1/user1 SQL*Plus: Release 11.2.0.3.0 Production on Tue Aug 6 14:31:1 ...