直接上代码
1 #!/usr/bin/python3
2 #coding=GB2312
3 import tkinter as tk
4 import threading
5 import time
6 import random
7 import sys
8
9 class Cell():
10 def __init__(self, row, col):
11 self.row, self.col = row, col
12 self.top, self.right, self.bottom, self.left = True, True, True, True
13 self.visited = False
14 def __str__(self):
15 return 'row:{} col:{}--{} {} {} {}'.format( \
16 self.row, self.col, self.top, self.right, \
17 self.bottom, self.left)
18 def setVisited(self):
19 self.visited = True
20 def isVisited(self):
21 return self.visited
22
23 class Maze(threading.Thread):
24 colCount = 50
25 rowCount = 50
26 winWidth = 700
27 winHeight = 700
28 beginOf = (0, 0)
29 endOf = (colCount - 1, rowCount - 1)
30 def __init__(self):
31 threading.Thread.__init__(self)
32 self.initData()
33 self.initUi()
34
35
36 """
37 以下是ui界面方法
38 """
39 def initUi(self):
40 self.ui = tk.Tk()
41 self.centeredDisplay()
42 self.cs = tk.Canvas(self.ui, bg = '#121a2a')
43 self.cs.pack(fill = tk.BOTH, expand = 1)
44 self.ui.bind('<Key-h>', self.hideCell)
45 self.ui.bind('<Key-Up>', self.up)
46 #self.updateUi()
47
48 self.start()
49 def hideCell(self, event):
50 self.cs.delete('currend')
51 def up(self, event):
52 pass
53 def updateUi(self):
54 w = float(self.winWidth / self.colCount)
55 h = float(self.winHeight / self.rowCount)
56 for row in range(self.rowCount):
57 for col in range(self.colCount):
58 cell = self.cells[row][col]
59 tagtmp = 'wall%02d%02d' % (row, col)
60 if cell.top:
61 self.cs.create_line(\
62 (w * col, h * row), \
63 (w * (col + 1), h * row), \
64 width = 3, fill = 'yellow', tag = 'top' + tagtmp)
65 else:
66 self.cs.delete('top' + tagtmp)
67 if cell.right:
68 self.cs.create_line(\
69 (w * (col + 1), h * row), \
70 (w * (col + 1), h * (row + 1)), \
71 width = 3, fill = 'yellow', tag = 'right' + tagtmp)
72 else:
73 self.cs.delete('right' + tagtmp)
74 if cell.bottom:
75 self.cs.create_line(\
76 (w * (col + 1), h * (row + 1)), \
77 (w * col, h * (row + 1)), \
78 width = 3, fill = 'yellow', tag = 'bottom' + tagtmp)
79 else:
80 self.cs.delete('bottom' + tagtmp)
81 if cell.left:
82 self.cs.create_line(\
83 (w * col, h * (row + 1), \
84 (w * col, h * row)), \
85 width = 3, fill = 'yellow', tag = 'left' + tagtmp)
86 else:
87 self.cs.delete('left' + tagtmp)
88
89 self.cs.create_rectangle((self.beginOf[0] * w + 3, self.beginOf[1] * h + 3), \
90 (self.beginOf[0] + 1) * w - 3, (self.beginOf[1] + 1) * h - 3, \
91 fill = '#b4532a', tag = 'begin')
92 self.cs.create_rectangle((self.endOf[0] * w + 3, self.endOf[1] * h + 3), \
93 (self.endOf[0] + 1) * w - 3, (self.endOf[1] + 1) * h - 3, \
94 fill = '#ff0000', tag = 'end')
95 self.cs.delete('currend')
96 self.cs.create_rectangle((self.currentCell.col * w + 10, self.currentCell.row * h + 10), \
97 (self.currentCell.col + 1) * w - 10, (self.currentCell.row + 1) * h - 10, \
98 fill = '#00ff00', tag = 'currend')
99
100 self.cs.update()
101
102 def centeredDisplay(self):
103 w = self.ui.winfo_screenwidth()
104 h = self.ui.winfo_screenheight()
105 self.ui.geometry('{}x{}+{}+{}'.format(\
106 self.winWidth, self.winHeight, \
107 int((w - self.winWidth)/2), \
108 int((h - self.winHeight)/2)))
109 self.ui.resizable(False, False)
110 self.ui.title('Maze by jianc')
111
112 """
113 以是ui界面方法
114
115 以下是逻辑线程方法
116 """
117 def initData(self):
118 self.cells = [[Cell(row, col) for col in range(self.colCount)] \
119 for row in range(self.rowCount)]
120 self.cellStack = []
121
122 self.currentCell = self.cells[self.beginOf[0]][self.beginOf[1]]
123 def delWall(self, cell, cell2):
124 if 1 == cell.row - cell2.row:
125 cell.top, cell2.bottom = False, False
126 elif -1 == cell.row - cell2.row:
127 cell.bottom, cell2.top = False, False
128 if 1 == cell.col - cell2.col:
129 cell.left, cell2.right = False, False
130 elif -1 == cell.col - cell2.col:
131 cell.right, cell2.left = False, False
132 def topCell(self, cell):
133 if 0 == cell.row:
134 return None
135 ret = self.cells[cell.row - 1][cell.col]
136 if ret.isVisited():
137 return None
138 return ret
139 def rightCell(self, cell):
140 if self.colCount - 1 == cell.col:
141 return None
142 ret = self.cells[cell.row][cell.col + 1]
143 if ret.isVisited():
144 return None
145 return ret
146 def bottomCell(self, cell):
147 if self.rowCount - 1 == cell.row:
148 return None
149 ret = self.cells[cell.row + 1][cell.col]
150 if ret.isVisited():
151 return None
152 return ret
153 def leftCell(self, cell):
154 if 0 == cell.col:
155 return None
156 ret = self.cells[cell.row][cell.col - 1]
157 if ret.isVisited():
158 return None
159 return ret
160
161 def checkNeighbor(self):
162 curCell = self.currentCell
163 curCell.setVisited()
164 neighbor = [self.topCell(curCell), self.rightCell(curCell), \
165 self.bottomCell(curCell), self.leftCell(curCell)]
166 while None in neighbor:
167 neighbor.remove(None)
168 n = len(neighbor)
169 if 0 == n:
170 try:
171 self.currentCell = self.cellStack.pop()
172 if None == curCell:
173 return
174 #self.updateUi()
175 self.checkNeighbor()
176 return
177 except:
178 return
179 self.cellStack.append(self.currentCell)
180 self.currentCell = neighbor[random.randint(0, n - 1)]
181
182 self.delWall(curCell, self.currentCell)
183
184 #self.updateUi()
185 self.checkNeighbor()
186
187 def run(self):
188 self.checkNeighbor()
189 self.updateUi()
190 print('thread finish')
191 """
192 以上是逻辑线程方法
193 """
194
195 sys.setrecursionlimit(100000)
196 maze = Maze()
197 tk.mainloop()