https://en.wikipedia.org/wiki/Connect_Four
Хтось пам’ятає, що гра з двома гравцями підключає 4? Для тих, хто цього не робить, це була дошка 6x7, яка стоїть вертикально на поверхні. Мета підключення 4 - добре, 4 з'єднати! З'єднання рахується, якщо воно горизонтальне, діагональне або вертикальне. Ви розміщуєте свої шматки на дошці, вставляючи шматок у верхній частині стовпця, де він падає на дно цього стовпця. Наші правила змінюють 3 речі в підключенні 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-кілограмовий раунд (зауважте, що це потребує тривалого часу, ви можете скоротити його для швидкого тестування повороту). Загалом переможець - це гравець із найбільшою кількістю перемог.
Контролер можна знайти тут: https://github.com/JJ-Atkinson/Connect-n/tree/master .
Написання бота:
Щоб написати бота, ви повинні продовжити Player
клас. Player
є абстрактним і має один метод для реалізації, int makeMove(void)
. У makeMove
вас буде вирішувати , які Coll ви хотіли б кинути свій шматок в. Якщо ви вибрали недійсну колонку (наприклад, coll не існує, coll вже заповнена), ваша черга буде пропущена . У Player
класі у вас є багато корисних допоміжних методів. Перелік найважливіших з них випливає:
boolean ensureValidMove(int coll)
: Повернути справжнє значення, якщо сторона знаходиться на дошці, а колла ще не заповнена.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
(якщо тільки ваша стратегія не повинна пройти цю чергу).