вторник, 30 июня 2015 г.

Опять переписал генератор регионов.

   Уже наверное, пора ярлык вводить - "переписал генератор регионов". Однако, буду еще переписывать, похоже, есть такое ощущение... Еще добавил для регионов генерацию словаря связанных регионов, со списком индексов общих блоков для каждого. Оно будет надо сильно впоследствии, для вывода юнита в соседний регион.
  Так и не сообразил, как указать высоту блока, тем более, что блок может иметь сразу несколько высот. Типа "b,c,b,a" - весь диапазон высот присутствует. Это для "а,а,а,а" или "с,с,с,с" - никаких проблем.  Надо думать...
Ниже код, хотя без кода классов, оно малопонятно. Длиннота:


 def genRegions(self):
        # временный список регионов
        tempRegionList = []
        ## пробегаем блоки ландшафта, что бы создать центры роста регионов
        for currentBrick in self.brickList:
            # если блок еще не принадлежит какому-нибудь региону,
            if currentBrick.regions == []:
                # создаем список регионов
                relList = []
                # временный список блоков региона
                # в первый раз это копия списка связанных блоков
                tempList = list(currentBrick.relatedList)
                for i in tempList:
                    brick = self.brickList[i]
                    #print(brick.h - currentBrick.h)
                    #Если блок уже занят регионом, но находится на подходящей
                    #высоте и дальности
                    if (brick.regions != [] or
                    currentBrick.h - brick.h > self.maxH or
                    self.getDistTo2(currentBrick.position, brick.position) > self.regionDist):
                        # то добавляем в список регионов блока имя текущего региона
                        brick.regions.append(currentBrick.index)
                        # и добавляем индекс блока в список блоков региона                      
                        relList.append(brick.index)
                        #print('if')
                    # если блок свободен и находится на подходящей
                    #высоте и дальности
                    elif (brick.regions == [] and
                    currentBrick.h - brick.h < self.maxH and
                    self.getDistTo2(currentBrick.position, brick.position) < self.regionDist):
                        # то добавляем в список регионов блока имя текущего региона
                        brick.regions.append(currentBrick.index)
                        # и добавляем индекс блока в список блоков региона 
                        relList.append(brick.index)
                        # и поштучно добавляем индексы связанных блоков во 
                        # временный список
                        for appB in brick.relatedList:
                            # если их еще нет во временном списке
                            if appB not in tempList:
                                tempList.append(appB)
                 
                # любуемся на результат                                  
                print(currentBrick.index, relList)
                newRegion = landRegion.landRegion(currentBrick.index, relList)
                tempRegionList.append(newRegion)
        # любуемся на кучу "landRegion.landRegion object at 0xad53594c"              
        print(tempRegionList)
     
        # создаем для регионов словари связанных регионов
     
        # пробегаем список регионов
        for currentRegion in tempRegionList:
            # берем индексы блоков регионов
            for index in currentRegion.brickList:
                # и по ним находим список регионов блоков с этим индексом 
                for r in self.brickList[index].regions:
                    # если регион не тот же, что и текущий
                    if r != currentRegion.name:
                        # и если в словаре нет такого индекса
                        if r not in currentRegion.relatedList:
                            # то создаем новый подсловарь с именем региона в
                            # качестве ключа, и список с индексом блока, как значение
                            currentRegion.relatedList[r] = [index]
                         
                        else:
                            # иначе добавляем в подсловарь
                            currentRegion.relatedList[r].append(index)
            # любуемся на результат
            print(currentRegion.name, '---', currentRegion.relatedList)
         
        return 0


Еще ниже вывод в консоль того самого "полюбуемся":
Разделено мной, в консоли, оно без пустых строк и комментариев.

 # любуемся на результат                                  
print(currentBrick.index, relList) - это оттуда

0 [1, 8, 9, 0, 2, 10, 16, 17, 18, 3, 11, 19, 24, 25, 26, 27, 12, 20, 28, 33, 34, 35]
4 [3, 5, 12, 11, 13, 4, 6, 14, 21, 20, 22, 7, 15, 23, 29, 28, 30, 31, 37, 38, 39]
32 [33, 24, 25, 40, 41, 32, 48, 49, 42, 34, 50, 56, 57, 58, 43, 35, 51, 59, 44, 52, 60]
36 [35, 37, 28, 27, 29, 44, 43, 45, 46, 36, 38, 53, 52, 54, 47, 39, 55, 61, 60, 62, 63]

это та самая куча малопонятных наименований, по идее список

landRegion.landRegion object at 0xaa3f1cac, landRegion.landRegion object at 0xaa3f1e4c, landRegion.landRegion object at 0xaa3f1e8c, landRegion.landRegion object at 0xaa3f1ecc

это уже вывод имени региона со словарем связанных регионов.
0 --- {32: [24, 25, 33, 34, 35], 36: [27, 28, 35], 4: [3, 11, 12, 20, 28]}
4 --- {0: [3, 12, 11, 20, 28], 36: [29, 28, 37, 38, 39]}
32 --- {0: [33, 24, 25, 34, 35], 36: [43, 35, 44, 52, 60]}
36 --- {0: [35, 28, 27], 32: [35, 44, 43, 52, 60], 4: [37, 28, 29, 38, 39]}

    То есть видно, что регион 4 имеет с регионом 0 пять общих блоков, номера сами прочитаете. Для того, чтобы вывести юнит из региона 4 в регион 0, нам нужно из этих блоков определить ближайший, или любой, и заставит юнита двигаться к нему, по достижении выбранного блока, будем считать , что регион достигнут, и дальнейшие перемещения будут рассчитываться по нему. Хотя это дело отдаленного будущего.

P.S почему -то вывод "кучи малопонятных названий" не получился, пришлось удалять некоторые символы. Совпало с каким нибудь тегом...

P.P.S. Решил добавить картинку, которая поясняет, какие получаются регионы, так сказать визуально:


Где цвета чистые, те блоки, принадлежат исключительно одному региону, где есть смешение, значит блок принадлежит нескольким регионам. Только что цвета плохо подобрал.



Комментариев нет:

Отправить комментарий