Задать вопрос
@bigburn
Делаю неживое живым

Придумал настольную игру, какой посоветуете алгоритм для соперника-бота?

Точки

Игра для двух участников, в которой игроки по очереди пытаются отгадать расположение нарисованных соперником точек на карте последнего.

Игровые поля — 50-клеточные прямоугольники, 10 "вертикалей" на 5 "горизонталей".

3f1443a15f354e02be1430501fe7598d.png

Клеткам каждой горизонтали присвоены "номера" 1..10, нумерация слева направо.

Каждый игрок рисует на своем поле 5 точек (либо по-другому отмечает клетки), по одной на каждой горизонтали.

Расположение точек на поле выражается последовательностью "номеров" клеток начиная с верхней (первой) горизонтали и кончая нижней (пятой).
Ход. Игрок А за один ход называет 2 варианта предположительного расположения точек на поле игрока В. Игрок В указывает игроку А на тот вариант, который наиболее близок к загаданному. Пусть игрок А назвал Вариант1 и Вариант2. Тогда игрок В проделывает следующее:

для каждой горизонтали находит абсолютную разность номеров помеченной клетки и клетки, согласно Варианту1, эти пять значений складываются = Результат1;

проводятся те же операции с номерами помеченной клетки и клетки согласно варианту2 = Результат2;

сравниваются Результат1 и Результат2. Если Результат1<Результат2, то к загаданному варианту более близким был Вариант1.

bc93b93443b343c28b99cf72c7c6e1a9.png

Если Результат1=Результат2, то игрок В заявляет, что оба варианта одинаково близки к загаданному.

После этого начинается ход другого игрока, и так до тех пор, пока один из вариантов не совпадет с загаданным расположением точек на поле соперника. Здесь, предусмотрены 2 разновидности игры: 1) завершение игры, 2) "угадывание до конца" - определение расположения точек соперника проигравшим игроком (без перехода хода)
  • Вопрос задан
  • 2754 просмотра
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
Symphony
@Symphony
Игра для двух участников, в которой игроки по очереди пытаются отгадать расположение нарисованных соперником точек на карте последнего.

Посмотрите алгоритм игры "Морской бой"
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Вы мне мозг взорвали!
Ответ написан
ProgramCodePav
@ProgramCodePav
Front-end developer. Love open source
Есть просто идея:)

Можно сделать заранее много наиболее эффективных (или по сложности) семлов. А также бот будет записывать каждый примененный семпл в файл. На основе данных файла может быть осуществлен алгоритм псевдохитрости соперника. Например, 3 раза один семпл (или похожие) работают, а в четвертый раз самый страшный семпл для игрока, который подстроится под предыдущие 3 варианта. Также для одного из 5 вариантов бота можно сделать случайным. Это все для первого шага.

Далее нужно небольшое исследование эффективности. Вообще бот может читерить, но если игра честная, то алгоритм должен быть человеческий.

Например, первый этап:
вариант 1 и 2 начинаются ровно в центре, но вариант 2 в верхней горизонтали на 1 клетку правее для оценки разницы в верхней горизонтали. Если меньше, то в следующий раз - дважды влево.

Второй пример выходит из первого: можно сначала проверить все 5 горизонталей, выдвигая левее и правее лишь одну точку в варианте Б.

Да, первый вариант получается бездействует, что нехорошо, но дает точность в оценке.

Второй этап:
После оценки всех горизонталей можно резко выдвинуть в положительные стороны все варианты ответов (например, 5 точек варианта 1, все до края - влево, вправо, влево, влево, влево - это на основе анализа результатов первого этапа, а 5 точек варианта 2 - тоже самое, что у варианта 1, но деленное на 2).

Третий этап: (fail)
совмещать варианты 1 и 2 по шагам.
например, вариант 1 выиграл более, чем вариант 2.
Напомню расположение варианта 1 (от центра): влево, вправо, влево, влево, влево .
А это расположение варианта 2 (от центра): влево/2, вправо/2, влево/2, влево/2, влево/2 .
Значит первая (верхняя) горизонталь варианта 2 двигается влево на расстояние влево/4 (то есть на клетку). Если Ва... тут я сломался:) потому что возвращаемые данные не цифры, а bool. ( я додумать его попробую, просто дам ответ лучше по-раньше, вдруг вы поймаете направление и справитесь лучше )

-----------

Еще один алгоритм: последовательный.

Первый этап аналогичный предыдущему алгоритму, то есть оба варианта одинаково расположены с отклонением в одну клетку, на одной горизонтали, потом на другой и до конца, чтобы собрать данные.

Отличие в том, что если исследует карту вариант 2, то вариант 1 становится на выигрышную точку вместе с вариантом 2.

например:
Расположение всех точек, шаг 1:
Вариант 1 <=> вариант 2
Центр <=> Центр+1клетка вправо
Центр <=> Центр
Центр <=> Центр
Центр <=> Центр
Центр <=> Центр

Вариант 2 выиграл. Значит в первой горизонтали стандартной точкой становится Центр+1клетка вправо. То есть:
Расположение всех точек, шаг 2:
Вариант 1 <=> вариант 2
Центр+1клетка вправо<=> Центр+1клетка вправо
Центр <=> Центр+1клетка вправо
Центр <=> Центр
Центр <=> Центр
Центр <=> Центр

Вариант 2 проиграл.
Расположение всех точек, шаг 3:
Вариант 1 <=> вариант 2
Центр+1клетка вправо<=> Центр+1клетка вправо
Центр <=> Центр+1клетка влево
Центр <=> Центр
Центр <=> Центр
Центр <=> Центр

Если вариант 2 проиграл, то точка второй горизонтали оказалась по центру. И в таком плане.

--

Плюсы и минусы. У первого варианта, очевидно, больше эффективность, но он не продуман до конца, а второй вариант 100% рабочий, но достаточно долгий.
Конечно, можно совместить 1 и 2 вариант. Таким образом После первого этапа (оценки ближних от центра клеток), можно перемещать точки в крайние положения.

Что я не продумал - вероятно есть способ использовать оба вариант, а не когда один в простое :)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы