Advertisement
Guest User

Untitled

a guest
Dec 14th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.56 KB | None | 0 0
  1. # генератор лабиринтов с помощью обхода в глубину
  2. from tkinter import *
  3. import random
  4. import time
  5.  
  6. start = time.time()
  7.  
  8. window = Tk()
  9. window.title("Генератор лабиринтов")
  10. window.resizable(width='False', height='False')
  11.  
  12. w = 30
  13. h = 30
  14.  
  15. c = Canvas(window, width=20*w + 29, height=20*h + 29, bg='white')
  16. c.focus_set()
  17. c.pack()
  18.  
  19. lab = [] # лабиринт (хранит координаты клеток)
  20. visited = [] # массив посещенных клеток
  21. stack = [] # стек для пути по лабиринту
  22. # структура лабиринта (у каждой клетки все границы)
  23. for y in range(2*h + 3):
  24. new = []
  25. for x in range(2*w + 3):
  26. if x == 0 or x == 2*w + 2 or y == 0 or y == 2*h + 2:
  27. new.append('s')
  28. visited.append((y, x))
  29. elif (y % 2 == 0 and x % 2 == 0):
  30. new.append('')
  31. else:
  32. new.append('s')
  33. visited.append((y, x))
  34. lab.append(new)
  35.  
  36.  
  37. def neighbours(i, j): # возвращает непосещенных соседей
  38. n = []
  39. if ((i + 2, j) not in visited):
  40. n.append((i + 2, j))
  41. if ((i - 2, j) not in visited):
  42. n.append((i - 2, j))
  43. if ((i, j + 2) not in visited):
  44. n.append((i, j + 2))
  45. if ((i, j - 2) not in visited):
  46. n.append((i, j - 2))
  47. return n
  48.  
  49.  
  50. def remove_wall(i, j, i2, j2): # удаление стенки между двумя клетками
  51. if (i + 2, j) == (i2, j2):
  52. lab[i + 1][j] = ''
  53. if (i - 2, j) == (i2, j2):
  54. lab[i - 1][j] = ''
  55. if (i, j + 2) == (i2, j2):
  56. lab[i][j + 1] = ''
  57. if (i, j - 2) == (i2, j2):
  58. lab[i][j - 1] = ''
  59.  
  60. visited.append((2, 2)) # отметили как посещенную
  61. i = 2
  62. j = 2
  63. flag = False
  64. while len(visited) != (2*w + 3) * (2*h + 3): # пока обошли не все клетки
  65. if len(neighbours(i, j)) != 0: # проверили, что есть непосещенные соседи
  66. stack.append((i, j))
  67. # рандомно выбрали направление движения
  68. a = random.choice(neighbours(i, j))
  69. remove_wall(i, j, a[0], a[1])
  70. # сделали клетку текущей
  71. i = a[0]
  72. j = a[1]
  73. visited.append(a)
  74. elif len(stack) != 0:
  75. # спускаемся по стеку вниз
  76. b = stack.pop()
  77. i = b[0]
  78. j = b[1]
  79.  
  80.  
  81. def build(): # построение лабиринта в канвасе
  82. x = 0
  83. y = 0
  84. for k in lab:
  85. for q in k:
  86. if q == 's':
  87. c.create_rectangle(x, y, x + 10, y + 10,
  88. fill='black', outline='black')
  89. x += 10
  90. x = 0
  91. y += 10
  92.  
  93. build()
  94.  
  95. p = c.create_rectangle(20, 20, 30, 30, fill='red', outline='black')
  96.  
  97.  
  98. def right(event):
  99. if lab[int(c.coords(p)[1] / 10)][int(c.coords(p)[0] / 10) + 1] == '':
  100. c.move(p, 10, 0)
  101.  
  102.  
  103. def left(event):
  104. if lab[int(c.coords(p)[1] / 10)][int(c.coords(p)[0] / 10) - 1] == '':
  105. c.move(p, -10, 0)
  106.  
  107.  
  108. def up(event):
  109. if lab[int(c.coords(p)[1] / 10) - 1][int(c.coords(p)[0] / 10)] == '':
  110. c.move(p, 0, -10)
  111.  
  112.  
  113. def down(event):
  114. if lab[int(c.coords(p)[1] / 10) + 1][int(c.coords(p)[0] / 10)] == '':
  115. c.move(p, 0, 10)
  116.  
  117. c.bind('<Up>', up)
  118. c.bind('<Down>', down)
  119. c.bind('<Left>', left)
  120. c.bind('<Right>', right)
  121.  
  122.  
  123. print(time.time() - start)
  124. window.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement