https://en.wikipedia.org/wiki/Connect_Four
Czy ktoś pamięta, że gra dla 2 graczy łączy 4? Dla tych, którzy tego nie zrobili, była to tablica 6x7, która stoi pionowo na powierzchni. Celem Connect 4 jest, dobrze połączyć 4! Połączenie jest liczone, jeśli jest poziome, ukośne lub pionowe. Umieszczasz swoje pionki na planszy, wstawiając pion na górze kolumny, gdzie spada na dół tej kolumny. Nasze zasady zmieniają 3 rzeczy w Connect 4.
- Zmiana nr 1 Wygrana jest definiowana jako gracz z największą liczbą punktów. Otrzymujesz punkty, łącząc 4 jak w regulaminie - więcej na ten temat później.
- Zmiana # 2 W każdej rundzie masz 3 graczy.
- Zmień nr 3 Rozmiar planszy to 9x9.
Punktacja:
Wynik opiera się na liczbie zdobytych z rzędu. Jeśli masz grupę 4 z rzędu, otrzymasz 1 punkt. Jeśli masz grupę 5 w rzędzie, dostajesz 2 punkty, 6 w rzędzie 3 i tak dalej.
Przykłady:
Uwaga o
i x
są zastępowane #
i ~
odpowiednio dla lepszego kontrastu
Przykład pustej planszy: (wszystkie przykłady to plansza o standardowym rozmiarze dla 2 graczy)
a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | | | | | |
3 | | | | | | | |
2 | | | | | | | |
1 |_|_|_|_|_|_|_|
Jeśli upuścimy kawałek w kol d
, wyląduje on na miejscu 1d
.
a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | | | | | |
3 | | | | | | | |
2 | | | | | | | |
1 |_|_|_|#|_|_|_|
Jeśli teraz upuścimy kawałek d
ponownie w kol , wyląduje on na miejscu 2d
. Oto przykłady 4 pozycji w rzędzie:
a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | |~| | | |
3 | | |~|#| | | |
2 | |~|#|~| |#| |
1 |~|#|~|#|_|#|_|
W tym przypadku x
dostaje 1 punkt po przekątnej ( 1a 2b 3c 4d
).
a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | |#| | | |
3 | | | |#| | | |
2 | | | |#| | | |
1 |_|~|_|#|~|_|~|
W takim przypadku o
dostaje 1 punkt w pionie ( 1d 2d 3d 4d
).
a b c d e f g
6 | | | | | | | |
5 | | | | | | | |
4 | | | | | | | |
3 | | | | | | | |
2 | | |#|#|#|#| |
1 |_|_|~|~|~|~|~|
W tym przypadku o
otrzymuje 2 punkty w poziomie ( 1c 1d 1e 1f 1g
) i x
otrzymuje 1 punkt w poziomie ( 2c 2d 2e 2f
).
a b c d e f g
6 | | |#| | | | |
5 | | |#| | | | |
4 | | |#| | | | |
3 | | |#| | |~| |
2 |~| |#| | |#|~|
1 |~|_|#|~| |~|~|
Tym razem x
dostaje 3 punkty za 6 z rzędu ( 1c 2c 3c 4c 5c 6c
).
Wejście wyjście
Będziesz miał dostęp do tablicy za pomocą tablicy 2d. Każda lokalizacja będzie int
reprezentowana przez identyfikator gracza. Będziesz także przekazywał swój identyfikator gracza do swojej funkcji. Poruszasz się, zwracając do której kolekcji chcesz wrzucić swój kawałek. W każdej rundzie do gry zostaną wybrani 3 gracze. Pod koniec gry wszyscy gracze rozegrają parzystą liczbę gier.
W tej chwili zostanie uruchomionych 100 000 rund (pamiętaj, że zajmuje to dużo czasu, możesz chcieć je zmniejszyć w celu szybkiego przetestowania). Ogólnie rzecz biorąc, zwycięzcą zostaje gracz z największą liczbą wygranych.
Kontroler można znaleźć tutaj: https://github.com/JJ-Atkinson/Connect-n/tree/master .
Pisanie bota:
Aby napisać bota, musisz rozszerzyć Player
klasę. Player
jest abstrakcyjna i ma jedną metodę wdrożenia, int makeMove(void)
. W makeMove
sam zdecydujesz, do której kolekcji chcesz wrzucić swój kawałek. Jeśli wybrałeś niepoprawne coll (np. Coll nie istnieje, coll jest już wypełniony), twoja kolej zostanie pominięta . W Player
klasie masz wiele przydatnych metod pomocniczych. Oto lista najważniejszych z nich:
boolean ensureValidMove(int coll)
: Zwraca true, jeśli coll jest na planszy, a coll nie jest jeszcze wypełniony.int[] getBoardSize()
: Zwraca tablicę int, gdzie[0]
jest liczba kolumn i[1]
liczba wierszy.int[][] getBoard()
: Zwróć kopię planszy. Należy do niego dostęp tak:[coll number][row number from bottom]
.- Aby znaleźć resztę, spójrz na
Player
klasę. EMPTY_CELL
: Wartość pustej komórki
Ponieważ będzie to wielowątkowe, dołączyłem również random
funkcję, jeśli jej potrzebujesz.
Debugowanie bota:
Dodałem kilka rzeczy do kontrolera, aby ułatwić debugowanie bota. Pierwszy to Runner#SHOW_STATISTICS
. Jeśli ta opcja jest włączona, zobaczysz wydruk grup graczy, w tym liczbę zwycięstw botów. Przykład:
OnePlayBot, PackingBot, BuggyBot,
OnePlayBot -> 6
PackingBot -> 5
BuggyBot -> 3
Draw -> 1
Możesz również stworzyć niestandardową grę z connectn.game.CustomGame
klasą, możesz zobaczyć wyniki i zwycięzcę każdej rundy. Możesz nawet dodać siebie do miksu za pomocą UserBot
.
Dodanie bota:
Aby dodać bota do składu, przejdź do PlayerFactory
bloku statycznego i dodaj następujący wiersz:
playerCreator.put(MyBot.class, MyBot::new);
Inne rzeczy do zapamiętania:
- Symulacje są wielowątkowe. Jeśli chcesz to wyłączyć, przejdź do
Runner#runGames()
i skomentuj ten wiersz (.parallel()
). - Aby zmienić liczbę gier, ustaw
Runner#MINIMUM_NUMBER_OF_GAMES
według własnych upodobań.
Dodano później:
- Komunikacja między botami jest niedozwolona.
Powiązane: Zagraj w Connect 4!
================================
Tablica wyników: (100 000 gier)
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
klasę, aby zobaczyć wszystkie dostępne metody.
ensureValidMove
(chyba że twoją strategią jest oczywiście przejście tej kolejki).