Прикреплённый файл «2013-01-25.labgen.py»
Загрузка 1 #!/usr/bin/env python
2 # coding: utf
3 '''
4 Генратор лабиринта:
5 · — всегда свободное место («комната»),
6 # — всегда непроходимое место («колонна»),
7 × — место, которое может быть проходимым, а может и нет («стена»):
8 ·×·×·×·
9 ×#×#×#×
10 ·×·×·×·
11 ×#×#×#×
12 ·×·×·×·
13 Лабиринт:
14 1. Заполняем всё камнями (тем самым помечаем комнаты «неизведанными»), кроме комнаты-входа. Помещаем комнату-вход в план разведки (список комнат, требующих разведки их соседей).
15 2. Цикл до тех пор, пока план разведки не пуст.
16
17 2.1 Выбираем случайную комнату в плане разведки («исследуемую»)
18 2.2 Если у неё нет неизведанных соседей, выбрасываем эту комнату из плана разведки и переходим к новому витку цикла
19 2.3 Случайно выбираем одного из неизведанных соседей исследуемой комнаты («новую»)
20 2.4 Заполняем нулями (проходами) новую комнату и стену между ней и исследуемой
21 '''
22
23 import sys, random
24
25 def Lab(Field):
26 '''Генерация проходимого лабиринта'''
27 Plan=[(0,0)] # План поиска
28 while Plan: # Есть ещё новооткрытые комнаты с неизведанными соседями
29 # Выберем любую
30 x,y=Plan.pop(random.randrange(len(Plan)))
31 # Найдём неизведанных соседей
32 Nabers=[(x+dx,y+dy) for dx,dy in D if (x+dx,y+dy) in Field and Field[x+dx,y+dy]]
33 if Nabers: # Соседи есть
34 # Потом ещё поищем вокруг этой комнаты
35 Plan.append((x,y))
36 # Случайный неизведанный сосед
37 nx,ny=random.choice(Nabers)
38 # Добавим его в план
39 Plan.append((nx,ny))
40 # Прорубим ход до него
41 Field[nx,ny]=Field[(nx+x)/2,(ny+y)/2]=0
42
43 def Lab3(Field,Pass=True,Circle=0):
44 '''Генерация проходимого/непроходимого (Pass) лабиринта
45 с циклами/без циклов (Circle). Модификация функции Lab'''
46 # Если добавить в план N комнат сразу, получится N несоединяющихся путей
47 Plan=Pass and [(0,0)] or [(0,0),(W-1,H-1)]
48 while Plan:
49 x,y=Plan.pop(random.randrange(len(Plan)))
50 Nabers=[(x+dx,y+dy) for dx,dy in D if (x+dx,y+dy) in Field and Field[x+dx,y+dy]]
51 if Nabers:
52 Plan.append((x,y))
53 nx,ny=random.choice(Nabers)
54 Plan.append((nx,ny))
55 Field[nx,ny]=Field[(nx+x)/2,(ny+y)/2]=0
56 # Стены, которые ещё не снесли
57 Walls=[(x,y) for x in xrange(W) for y in xrange(1-x%2,H,2) if Field[x,y]]
58 # Снесём Circle штук
59 for xy in random.sample(Walls,Circle):
60 Field[xy]=0
61
62 Pass,Circle=True,0
63
64 if len(sys.argv)>1 and not sys.argv[1].isdigit():
65 Pass=not 'n' in sys.argv[1]
66 Circle=sys.argv[1].count('c')
67 sys.argv.pop(1)
68
69 W=len(sys.argv)>1 and int(sys.argv[1]) or 23
70 H=len(sys.argv)>2 and int(sys.argv[2]) or 17
71
72 Field={(i,j):1 for i in xrange(W) for j in xrange(H)}
73 D=((-2,0),(0,-2),(2,0),(0,2))
74 Field[0,0]
75
76 Lab3(Field,Pass,Circle)
77
78 for j in xrange(H):
79 for i in xrange(W):
80 print Field[i,j],
81 print
Прикреплённые файлы
Для ссылки на прикреплённый файл в тексте страницы напишите attachment:имяфайла, как показано ниже в списке файлов. Не используйте URL из ссылки «[получить]», так как он чисто внутренний и может измениться.- [получить | показать] (2013-01-29 14:32:29, 1.7 KB) [[attachment:2013-01-25.lab.py]]
- [получить | показать] (2013-01-29 14:32:41, 3.8 KB) [[attachment:2013-01-25.labgen.py]]
Вам нельзя прикреплять файлы к этой странице.