python3迷宫,多线程版
上图:
直接上代码
- #!/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迷宫,多线程版的更多相关文章
- python网络聊天器多线程版
在之前的一篇文章(python网络编程-udp)中实现了一个简单的udp聊天器,只能在单线程下进行收发数据,在学习完多线程之后,实现一个能同时收发数据的udp聊天器. 说明: 编写一个有2个线程的程序 ...
- 【pyhon】nvshens按目录图片批量下载爬虫1.00(多线程版)
# nvshens按目录图片批量下载爬虫1.00(多线程版) from bs4 import BeautifulSoup import requests import datetime import ...
- Python3.11正式版,它来了!
转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/b055fbf2.html 你好,我是测试蔡坨坨. 就在前几天,2022年10月24日,Python3.11正式版发布了! P ...
- Python3之多线程学习
这里做一个自己复习多线程的笔记 Python中使用线程有两种方式:函数或者用类来包装线程对象. 函数式:调用 _thread 模块中的start_new_thread()函数来产生新线程.语法如下: ...
- Python3.4 多线程
线程安全和全局解释器锁 Thread State and the Global Interpreter Lock 总结: 通过使用GIL后, Python多线程安全, 并且数据保持同步. Python ...
- 【Python3之多线程】
一.threading模块 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性. 1.开启线程的两种方式(同Process) 方法一 from thr ...
- 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(多线程版)
# 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 from queue import Queue import requests from lxml import etree ...
- Python3用多线程替代for循环提升程序运行速度
[本文出自天外归云的博客园] 优化前后新老代码如下: from git_tools.git_tool import get_collect_projects, QQNews_Git from thre ...
- python3.4多线程实现同步的四种方式
临界资源即那些一次只能被一个线程访问的资源,典型例子就是打印机,它一次只能被一个程序用来执行打印功能,因为不能多个线程同时操作,而访问这部分资源的代码通常称之为临界区. 1. 锁机制 threadin ...
随机推荐
- day64 views文件
from django.shortcuts import HttpResponse, render, redirect from app01 import models # Create your v ...
- php的注释方法
注释是每个程序员学习时的基础,我们通过可以注释来备注一信息.增加代码的可读性.下面我们就为大家介绍一下PHP的注释方法. 1, // 这是单行注释 2,# 这也是单行注释 3,/* */多行注释块 ...
- 常用css代码(scss mixin)
溢出显示省略号 参过参数可以只是单/多行. /** * 溢出省略号 * @param {Number} 行数 */ @mixin ellipsis($rowCount: 1) { @if $rowCo ...
- 46-python基础-python3-字符串-常用字符串方法(四)-join()-split()
5-字符串方法 join()和 split() 1-join()方法 将字符串列表连接成一个单独的字符串. join()方法在一个字符串上调用,参数是一个字符串列表,返回一个字符串. 请注意,调用 j ...
- 领域驱动设计(DDD:Domain-Driven Design) 转摘自:http://www.jdon.com/ddd.html
Eric Evans的“Domain-Driven Design领域驱动设计”简称DDD,Evans DDD是一套综合软件系统分析和设计的面向对象建模方法,本站Jdon.com是国内公开最早讨论DDD ...
- mySQL的表连接
一.mysql表的连接方式 内连接和外连接的区别: 我把两个表比作集合A.B,其中,内连接是集合A和集合B的交集,而交集的内容在两个表中都存在,即在每一个表的内部:而外连接则是除了交集外,还有另一个表 ...
- opensns建站
opensns建站 标签(空格分隔):软件工程 贪玩蓝月 购买云服务器 首选阿里云,一个月9.9元,还能直接安全宝塔Linux界面 后台初始化 输入ip地址:8888访问宝塔后台,第一次进入后台会让你 ...
- 十五、API请求接口-远程服务器返回错误: (400) 错误的请求错误
一.远程服务器返回错误: (400) 错误的请求错误 捕获异常查看具体错误 using Newtonsoft.Json; using System; using System.Collections. ...
- 【Java学习笔记】百度面试问题回顾(一)
今天回顾了部分百度面试时被问到的问题: 1.常见的包装类有哪些,他们与基本类型的区别,有哪些方法? Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很 ...
- python连接mongodb集群
一 安装模块pymongo pip3 install pymongo 二 创建一个MongoClient conn=MongoClient('mongodb://cbi:pass@ip1:20000, ...