Я пытаюсь создать сеттингеры игрового поля 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-х оранжево-оранжевых.
Этот шаблон ограничивает количество сравнений, которые мне нужно сделать.
Возможно, вы захотите упомянуть, что особенного в 6, 7 и 8. 'гарантируя, что они не являются шестиугольными (?), Примыкающими друг к другу' просит объяснения: что они? Мой удар: (псевдослучайно) сначала выбирайте плитки для чисел с ограничениями размещения, а заполняйте. Заполните массив номерами/позициями для назначения; выберите действительный индекс и присвойте значение этому индексу; если индекс не был последним, назначьте последнее значение только что используемому индексу; повторите с более коротким массивом. – greybeard
6 и 8 являются особенными, потому что они являются номерами, которые вы, скорее всего, катите, поэтому игра не хочет их рядом друг с другом, поскольку игроки получают непропорционально более высокие ресурсы такого рода. A 7 означает, что вам необходимо отказаться от ресурсов. Я понимаю вашу реализацию, но есть много плавности, когда 6 и 8 (числа, которые будут ограничены вашим подходом) могут идти, если они не ограничены. Спасибо за ваш ответ. – tsurantino
Может быть, «очень медленно», потому что он работает вечно? Если последний гексагон будет помещен, это 6 или 8, и он не может попасть в последнюю плитку ... –