Прикреплённый файл «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 из ссылки «[получить]», так как он чисто внутренний и может измениться.

Вам нельзя прикреплять файлы к этой странице.