https://en.wikipedia.org/wiki/Connect_Four
Кто-нибудь помнит, как 2 игрока соединяют 4? Для тех, кто этого не делал, это была доска 6х7, которая стоит вертикально на поверхности. Цель подключения 4 - хорошо подключить 4! Соединение считается, если оно горизонтальное, диагональное или вертикальное. Вы помещаете свои фигуры на доску, вставляя фигуру в верхнюю часть колонки, где она падает до нижней части этой колонки. Наши правила меняют 3 вещи в Connect 4.
- Изменение № 1 Победа определяется как игрок с наибольшим количеством очков. Вы получаете очки, подключив 4, как в правилах - подробнее об этом позже.
- Изменение # 2 У вас есть 3 игрока в каждом раунде.
- Изменение № 3 Размер доски 9x9.
Подсчет очков:
Оценка основана на том, сколько вы получаете подряд. Если у вас 4 группы подряд, вы получаете 1 очко. Если у вас есть 5 в группе подряд, вы получаете 2 очка, 6 в строке 3 и так далее.
Примеры:
Обратите внимание o
и x
заменены на #
и ~
соответственно для лучшей контрастности
Пример пустой доски: (все примеры - доска стандартного размера для 2 игроков)
a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | | | | | |
3 | | | | | | | |
2 | | | | | | | |
1 |_|_|_|_|_|_|_|
Если мы бросим кусок в столкновении d
, он приземлится на месте 1d
.
a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | | | | | |
3 | | | | | | | |
2 | | | | | | | |
1 |_|_|_|#|_|_|_|
Если мы d
снова бросим кусок в столкновении , он окажется на месте 2d
. Вот примеры положения 4 в ряд:
a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | |~| | | |
3 | | |~|#| | | |
2 | |~|#|~| |#| |
1 |~|#|~|#|_|#|_|
В этом случае x
получает 1 балл по диагонали ( 1a 2b 3c 4d
).
a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | |#| | | |
3 | | | |#| | | |
2 | | | |#| | | |
1 |_|~|_|#|~|_|~|
В этом случае o
получает 1 очко по вертикали ( 1d 2d 3d 4d
).
a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | | | | | |
3 | | | | | | | |
2 | | |#|#|#|#| |
1 |_|_|~|~|~|~|~|
В этом случае o
получает 2 точки по горизонтали ( 1c 1d 1e 1f 1g
) и x
получает 1 точку по горизонтали ( 2c 2d 2e 2f
).
a b c d e f g
6 | | |#| | | | |
5 | | |#| | | | |
4 | | |#| | | | |
3 | | |#| | |~| |
2 |~| |#| | |#|~|
1 |~|_|#|~| |~|~|
На этот раз x
3 очка за 6 подряд ( 1c 2c 3c 4c 5c 6c
).
Ввод, вывод
У вас будет доступ к плате через 2d массив. Каждое место будет представлено с int
представлением идентификатора игрока. Вам также будет передан ваш идентификатор игрока в вашу функцию. Вы делаете свой ход, возвращая коллизию, в которую хотите бросить свою фигуру. В каждом раунде будут выбраны 3 игрока. В конце игры все игроки сыграют в равное количество игр.
На данный момент будет запущено 100 000 раундов (обратите внимание, что это занимает много времени, вы можете уменьшить его для быстрого тестирования). В целом победителем становится игрок с наибольшим количеством побед.
Контроллер можно найти здесь: https://github.com/JJ-Atkinson/Connect-n/tree/master .
Написание бота:
Чтобы написать бота, вы должны расширить Player
класс. Player
является абстрактным и имеет один метод для реализации int makeMove(void)
. В makeMove
вас будет решать , какие Coll вы хотели бы бросить свой кусок в. Если вы выбрали неверный колл (например, колл не существует, колл уже заполнен), ваш ход будет пропущен . В Player
классе у вас есть много полезных вспомогательных методов. Ниже приводится список наиболее важных из них:
boolean ensureValidMove(int coll)
: Вернуть true, если колл на доске и колл еще не заполнен.int[] getBoardSize()
Возвращает массив типа int, где[0]
количество столбцов и[1]
количество строк.int[][] getBoard()
: Вернуть копию доски. Вы должны получить доступ к нему , как это:[coll number][row number from bottom]
.- Чтобы найти остальное, посмотрите на
Player
класс. EMPTY_CELL
: Значение пустой ячейки
Так как это будет многопоточным, я также включил random
функцию, если вам это нужно.
Отладка вашего бота:
Я включил некоторые вещи в контроллер, чтобы упростить отладку бота. Первый Runner#SHOW_STATISTICS
. Если это включено, вы увидите распечатку сыгранных групп игроков, включая количество выигрышей ботов. Пример:
OnePlayBot, PackingBot, BuggyBot,
OnePlayBot -> 6
PackingBot -> 5
BuggyBot -> 3
Draw -> 1
Вы также можете сделать пользовательскую игру с connectn.game.CustomGame
классом, вы можете увидеть результаты и победителя каждого раунда. Вы даже можете добавить себя в смесь с UserBot
.
Добавление вашего бота:
Чтобы добавить своего бота в линейку, перейдите в PlayerFactory
статический блок и добавьте следующую строку:
playerCreator.put(MyBot.class, MyBot::new);
Другие вещи, чтобы отметить:
- Симуляции многопоточные. Если вы хотите отключить это, перейдите
Runner#runGames()
и прокомментируйте эту строку (.parallel()
). - Чтобы изменить количество игр, установите
Runner#MINIMUM_NUMBER_OF_GAMES
по своему вкусу.
Добавлено позже:
- Общение между ботами запрещено.
Связанный: Play Connect 4!
================================
Табло: (100 000 игр)
MaxGayne -> 22662
RowBot -> 17884
OnePlayBot -> 10354
JealousBot -> 10140
Progressive -> 7965
Draw -> 7553
StraightForwardBot -> 7542
RandomBot -> 6700
PackingBot -> 5317
BasicBlockBot -> 1282
BuggyBot -> 1114
FairDiceRoll -> 853
Steve -> 634
================================
Player
класс, чтобы увидеть все доступные методы.
ensureValidMove
(если ваша стратегия, конечно, не пройти этот поворот).