JavaRush /Java блог /Архив info.javarush /Реализация стратегии.
Joysi
41 уровень

Реализация стратегии.

Статья из группы Архив info.javarush
Судя по записям задач поиска контуров, brainfuck кодирования многим интересна алгоритмика, как одна из сторон программирования. Предлагаю вам реализовать "мозги" следующей игры. И если, авторов решения будет несколько, можно устроить "соревнование". Я накидал код реализации игры с выдачей результатов на консоль. Исходники на https://github.com/maratsr/MatrixGame Для реализации своего алгоритма необходимо создать реализацию интерфейса IGameStrategy и реализовать в нем: 1) метод getTurn(). Где собственно и происходит поиск оптимального хода 2) метод toString(). Просто вывод информации о вашем методе. Достаточно: 1) добавить код в getTurn() класса MyGameStrategy, где прописать алгоритм. Весь упор именно на алгоритмику, а не собственно знание Java. 2) добавить его одним из игроков в метод static main класса Game для игры. Всего то пару десятков строк реализации... Для облегчения написания собственного алгоритма я привел примеры реализаций (как заготовки): NonZeroFirstValueGameStrategy - Поиск первого доступного элемента MaxValueGameStrategy - Поиск максимального значения в строке или колонке RandomValueGameStrategy - Случайный ход Для тестирования вашего алгоритма можете посоревноваться с ними. Можете также изменить кол-во игроков, размер начальной матрицы и т.п. Game - основной класс, реализующий игру: - Генерирует поле игры. - Создает игроков с их стратегиями. - В процессе игры передает ход стратегиям и ограничивает время принятия решения (в случае его превышения, прерывает стратегию). - Выводит в консоль ход игры и ее результат. Вариантов реализации прочих стратегий вагон: Перебор на первые 2,3,4... хода с выбором лучшего ("ветви и границы"). Можете по ходу нахождения хода присваивать его аргументу функции move, процесс перебора программа прервет и в качестве решения возьмет ход, найденный до этого момента. Подсчет сумм элементов колонок или строк матрицы + поиск с учетом этого... Можно добавить элементы случайности... и т.п. и т.д. P.S. Буду также благодарен, если кто подскажет более правильный способ (чем Executor + Future) для ограничения времени работы любого метода (который не знает что его время выполнения лимитировано).">
Комментарии (4)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
fatfaggy Уровень 26
1 ноября 2017
перед первым ходом строим граф/дерево всех возможных ходов. выбираем самый оптимальный (у кого результат даст максимальное число).
это если у каждого игрока свое поле.

если же на одном поле играет одновременно сразу несколько игроков — тогда придется строить такой граф на каждом ходе. точнее, «вычеркивать» невозможные ходы. при поле 10*10 я думаю построение графа займет несколько секунд максимум. это если работать с примитивами, конечно же)) редактирование — значительно быстрее (просто выкидываем из деревьев ненужные ветки).

ну или если совсем просто — тогда обычный жадный алгоритм. который, в принципе, можно улучшить введя «пропуск хода», если есть реальная возможность на следующем ходу получить число значительно большее, чем на этом (например, ход доступен для поиска по рядку, в рядке остались цифры 1, 3, 7, 9. но если пропустить ход — станет доступен поиск по столбцу, где цифры 81, 94, 97, 99). но если его еще улучшить — тогда надо смотреть на два шага вперед, а если еще улучшить — то на три, итд. в итоге снова же задача сводится к построению дерева))

так что я думаю, основная задача тут — выбрать такую структуру данных, которая бы давала хороший результат именно в момент обновления весов в графе/дереве, а это уже дискретка и всякий матан)) так что кто знает такую структуру — пишите))
DefNeo Уровень 36
10 марта 2017
Типа героев что ли?))
JuriMik Уровень 26
2 марта 2017
Почти неделя без комментов. Мне кажется, достаточно объемное задание по времени. Да и по сложности не для джунов (ИМХО, разумеется). Это так, на первый взгляд. Я попробовал бы заняться, т.к. реально интересная задача для меня, но занят на работе, свободного времени пока нет