Я пытаюсь написать решатель на C # .NET для игры под названием Flowerz. Для справки, вы можете сыграть в MSN здесь: http://zone.msn.com/gameplayer/gameplayer.aspx?game=flowerz . Я пишу это для удовольствия, а не для какого-либо задания или чего-либо связанного с работой. Из-за этого единственным ограничением является мой компьютер (ядро Intel i7 с 8 ГБ ОЗУ). Насколько мне известно, ему не нужно никуда бежать.
Короче, его правила таковы:
- Там очередь заполнена цветными цветами. Его длина произвольна
- На очередь нельзя повлиять
- Очередь генерируется в начале уровня
- Цветы имеют один или два цвета.
- Если есть два цвета, то есть внешний цвет и внутренний цвет. В случае двух цветов внешний цвет используется для соответствия.
- Если есть совпадение, то внешний цвет исчезает, и цветок теперь является цветком одного цвета того же цвета, что и внутренний цветок.
- Цель игры - создать спички из трех (или более) одного цвета
- Когда цветок одного цвета является частью матча, он удаляется с игрового поля, создавая пустое пространство
- Вы можете сопоставить один цветной цветок с внешним цветом двухцветного цветка. В этом случае исчезает один цветной цветок, внешний цвет двухцветного цветка исчезает, а внутренний цвет остается
- Вы выигрываете раунд, когда очередь пуста, и осталось хотя бы одно пустое место
- Возможны каскадные матчи. Каскад - это когда три (или более) внешних цветка исчезают, и когда их внутренние цвета образуют другую цепочку из 3 (или более цветов).
- Игровое поле всегда 7х7
- Некоторые места на поле покрыты камнями
- Вы не можете поместить цветы на скалах
- Очередь также может содержать лопату, которую можно использовать для перемещения любого размещенного цветка в незанятое пространство.
- Вы должны использовать лопату, но на самом деле вам не нужно перемещать цветок: совершенно законно положить его обратно туда, откуда он пришел
- Очередь также может содержать цветную бабочку. Когда вы используете эту бабочку на цветке, тогда цветок приобретает цвет бабочки
- Применение бабочки к цветку с двумя цветами приводит к тому, что цветок приобретает только один цвет, а именно цвет бабочки.
- Вы можете тратить бабочки на пустое место или цветок, который уже имеет этот цвет
- Очистка поля не выигрывает игру
Задача решателя проста: найти способ очистить очередь, используя как можно больше оставшихся пробелов на игровом поле. По сути, ИИ играет в эту игру для меня. Результатом решателя является список найденных ходов. Меня не интересует оценка, но выживание как можно дольше, поэтому мне интересны ходы, которые оставляют как можно больше открытых пространств.
Излишне говорить, что пространство поиска быстро увеличивается с увеличением очереди, поэтому о грубой силе не может быть и речи. Очередь начинается с 15 и увеличивается с 5 каждые два или три уровня, если я правильно помню. И, конечно же, размещение первого цветка в (0,0), а второго в (0,1) отличается от размещения первого в (1,0) и второго цветка в (0,0), особенно когда поле уже заполнено цветами из более раннего раунда. Такое простое решение может иметь значение при принятии или нет.
У меня есть следующие вопросы:
- Что это за проблема? (подумайте о коммивояжере, рюкзаке или о какой-то другой комбинаторной проблеме). Знание этого может сделать мой Google-фу чуть лучше.
- Какой алгоритм может дать мне хорошие результаты, быстро?
Что касается последнего: сначала я пытался написать свой собственный эвристический алгоритм (в основном: как бы я решил его, если бы знал очередь?), Но это приводило ко многим крайним случаям и подсчету совпадений, которые я мог бы пропустить.
Я думал об использовании генетического алгоритма (потому что я, по крайней мере, знаю, как его использовать ...), но у меня возникают некоторые проблемы с выбором двоичного представления платы. Тогда есть проблема кроссовера, но она может быть решена с помощью упорядоченного оператора кроссовера или аналогичного типа операции.
Я предполагаю, что решатель всегда должен знать конфигурацию платы и очередь, которую он пытается очистить.
Я знаю несколько других эвристических алгоритмов, таких как нейронные сети и системы нечеткой логики, но мне не хватает опыта, чтобы знать, какой из них лучше всего подходит, или есть другие, которые лучше подходят для поставленной задачи.