2014-10-24 2 views
1

Я пытаюсь создать сеттингеры игрового поля Catan и застреваю, пытаясь создать эффективную реализацию шестнадцатеричных чисел.Создание поселенцев номеров Catan?

Цель состоит в том, чтобы случайным образом сгенерировать набор чисел из 2-12 (только с одним экземпляром из 2 и 12 и двумя экземплярами всех чисел между ними), гарантируя, что значения 6 и 8 не являются шестиугольными (?), смежные друг с другом. 6 & 8 являются особенными, потому что они - числа, которые вы, скорее всего, катите, чтобы игра не хотела их рядом друг с другом, поскольку игроки получают непропорционально более высокие ресурсы такого рода. 7 означает, что вам нужно отбрасывать ресурсы.

Ожидаемый результат: http://imgur.com/Ng7Siy8

Сейчас у меня есть рабочий грубой реализации силы, которая очень медленно, и я надеюсь, чтобы оптимизировать его, но я не знаю, как. Реализация в VBA, которая ограничивает структуры данных, которые я могу использовать.

В псевдокоде я делаю что-то вроде этого:

For Each of the 19 hexes 
    Loop Until we have a valid number 
     Generate a random number between 1 and 12 
     Check 
      Have we already placed too many of that number? 
      Is the number equal to 6 or 8? 
       Is the number being placed on a hex next to another hex with 6 or 8 placed on it? 
     If valid 
      Place 
     If invalid 
      Regenerate random number 

Это очень ручной и с учетом функции генератора случайных чисел, что означает, что он может быть где-нибудь от того, действительно коротка, чтобы быть действительно действительно долго (составило более 19 гексов).

Примечание: Насколько важны мои номера, важно. Я начинаю снаружи игрового поля (см. Здесь http://imgur.com/Ng7Siy8) на сером шестерке с номером 6, а затем перемещайтесь против часовой стрелки вокруг доски внутрь. Это означает, что мой следующий гексагон 2 светло-зеленый, 4 светло-оранжевый ... продолжается примерно до 9 темно-зеленых, а затем идет внутрь до 4-х оранжево-оранжевых.

Этот шаблон ограничивает количество сравнений, которые мне нужно сделать.

+1

Возможно, вы захотите упомянуть, что особенного в 6, 7 и 8. 'гарантируя, что они не являются шестиугольными (?), Примыкающими друг к другу' просит объяснения: что они? Мой удар: (псевдослучайно) сначала выбирайте плитки для чисел с ограничениями размещения, а заполняйте. Заполните массив номерами/позициями для назначения; выберите действительный индекс и присвойте значение этому индексу; если индекс не был последним, назначьте последнее значение только что используемому индексу; повторите с более коротким массивом. – greybeard

+0

6 и 8 являются особенными, потому что они являются номерами, которые вы, скорее всего, катите, поэтому игра не хочет их рядом друг с другом, поскольку игроки получают непропорционально более высокие ресурсы такого рода. A 7 означает, что вам необходимо отказаться от ресурсов. Я понимаю вашу реализацию, но есть много плавности, когда 6 и 8 (числа, которые будут ограничены вашим подходом) могут идти, если они не ограничены. Спасибо за ваш ответ. – tsurantino

+0

Может быть, «очень медленно», потому что он работает вечно? Если последний гексагон будет помещен, это 6 или 8, и он не может попасть в последнюю плитку ... –

ответ

2

Есть несколько оптимизаций, которые вы можете сделать - в первую очередь, вы точно знаете, сколько номеров присутствует в каждой плитке - у вас есть 2,3,3,4,4,5,5,6,6,8,8,9,9,10,10,11,11,12. Поэтому начните с этого набора чисел - вы устраните проверку, если число было создано слишком много раз. теперь вы можете сделать случайную перетасовку этого набора чисел и проверить, действительно ли он «действителен». Я думаю, что это все равно приведет к слишком большому количеству негативных проверок, но оно должно работать лучше, чем ваш текущий подход.

+0

[Bogosort] (http://en.wikipedia.org/wiki/Bogosort)? – greybeard

+0

@greybeard не совсем. Нам не нужно ничего разбираться. Нам нужна только какая-то действительная последовательность, и есть не так уж плохая возможность попасть в нее (соотношение допустимых/недопустимых последовательностей не слишком мало, но я ленив, чтобы вычислить его точно :)) –

0

Поместите 8 первых, подсчитайте, какие из оставшихся фрагментов вы с удовольствием поместите 6 на (то есть несмежные), затем произвольно выберите для 6. Затем поместите остальные.

Смежные вопросы