Zagrajmy w grę Meta kółko i krzyżyk!
To jest turniej na szczycie wzgórza w Meta kółko i krzyżyk. Zasady Meta kółko i krzyżyk są następujące:
Obowiązują wszystkie regularne zasady gry w kółko i krzyżyk.
Jest dziewięć tablic ułożonych, aby stworzyć jedną tablicę główną. Tak jak:
0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8 ======================== 0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8 ======================== 0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8
plansza 0 odnosi się do lewej górnej planszy, plansza 1 odnosi się do górnej środkowej planszy ... w ten sposób
0|1|2 ----- 3|4|5 ----- 6|7|8
Jeśli powiem plansza 3, płytka 4, oznacza to środkową płytkę planszy po środku po lewej stronie.
Możesz poruszać się tylko na jednej z mniejszych plansz.
Jeśli wygrasz jedną z mniejszych plansz, cała ta plansza liczy się jako płytka.
Jeśli jedna z plansz zostanie zapełniona, zanim którykolwiek z botów ją wygra, liczy się jako kafelek nobodies.
Kto wygra tablicę główną, wygrywa!
Istnieje jednak ważny zwrot. Powiedzmy, że wchodzę na planszę 7, kafelek 2. Oznacza to, że w twojej turze możesz wejść tylko na planszę 2. Powiedzmy, że wchodzisz na planszę 2, płytka 5. Teraz w mojej turze mogę wejść tylko na planszę 5. Powiedzmy, że tablica 1 jest pełna. (Nie ma już więcej miejsc lub jedno z nas wygra już planszę 1) Teraz, jeśli wejdę na planszę 5, płytkę 1, możesz wejść na dowolną z plansz.
Reguły te można uznać za:
- Musisz zagrać na planszy odpowiadającej pozycji, którą grał poprzedni gracz.
- Jeśli X gra na planszy 2, płytka 5; O musi grać na planszy 5
- Jeśli plansza jest pełna (remis) lub ma już zwycięzcę, następny ruch jest nieograniczony.
- Plansza ze zwycięzcą nie może być zagrana, nawet w przypadku nieograniczonego ruchu.
Jeśli jest to trochę mylące, możesz wypróbować to tutaj. (pamiętaj, aby przełączyć z „wygranych pierwszego kafelka” na „3 kafelki z rzędu”)
Teraz oto zasady wyzwania.
Musisz napisać bota, który gra w tę grę.
Bot 1 to Xs i musi iść pierwszy. Zostanie wywołany z tymi argumentami wiersza poleceń (bez elementów w nawiasach):
X (whose turn) --------- (board 0) --------- (board 1) --------- (board 2) --------- (board 3) --------- (board 4) --------- (board 5) --------- (board 6) --------- (board 7) --------- (board 8) --------- (master board) xx (last move)
Pierwsza postać reprezentuje bota. W tym przypadku bot 1 gra jako X. Następne 9 linii odnosi się do 9 plansz. 11. linia odnosi się do płyty głównej. „Xx” to ostatni ruch. Teraz bot1 musi wydrukować dwie liczby od 0 do 8. Numer 1 to plansza, w którą porusza się bot, a numer 2 to płytka na tej planszy. Kontroler będzie śledził ten ruch. Powiedzmy, że bot 1 drukuje 38. Teraz plansza będzie wyglądać następująco:
| | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | |X || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | |
i bot2 zostanie wywołany z tymi argumentami:
O --------- --------- --------- --------X --------- --------- --------- --------- --------- --------- 38
Teraz bot 2 musi poruszać się na planszy 8 (ponieważ bot1 umieścił x na płytce 3). Powiedzmy, że bot2 drukuje 84. Teraz tablica wygląda tak.
| | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | |X || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || |O| ----- || ----- || ----- | | || | | || | |
teraz bot1 zostanie wywołany z tymi argumentami:
X --------- --------- --------- --------X --------- --------- --------- --------- ----0---- --------- 84
Teraz bot1 musi poruszać się na planszy 4. Jednak bot1 jest niegrzecznym małym botem i decyduje się na ruch na planszy 3. Drukuje „30”. Plansza w ogóle się nie zmienia. Główny bot śledzi to. Teraz bot2 zostanie wywołany z tymi argumentami:
O --------- --------- --------- --------X --------- --------- --------- --------- ----0---- --------- xx
Teraz bot 2 może iść gdziekolwiek chce (oprócz 38 i 84, oczywiście). Trwa to do momentu, aż ktoś wygra 3 płyty główne z rzędu. Następnie jest drugi pojedynek, w którym bot2 to X i zaczyna się jako pierwszy.
To się powtarza, dopóki każdy bot nie zagra co drugiego bota.
Punktacja
Punktacja działa w następujący sposób:
Zwycięzca każdego meczu otrzymuje 100 + number of open spots
punkty. W ten sposób bardziej wartościowe jest, jeśli twój bot wygrywa szybko. Za każdym razem, gdy bot wykonuje nieprawidłowy ruch, traci 1 punkt. Jeśli po 250 rundach żaden bot nie wygrał, każdy bot traci 10 punktów i przechodzimy do następnej rundy.
Wszystko zostanie umieszczone w katalogu, który zawiera
Bot kontrolera. To jest program w C ++, który napisałem. Tutaj możesz zobaczyć kod źródłowy bota kontrolera . Daj mi znać, jeśli zobaczysz coś nie tak z kontrolerem.
Plik tekstowy o nazwie
instructions.txt
Ten plik będzie wyglądał mniej więcej tak:[Total number of bots that are competing] [bot1Name] [bot1 command to run] [bot2Name] [bot2 command to run] ...
Folder dla każdego bota. Ten folder pomieści Twój program (czy to skrypt, czy plik binarny) i JEDEN plik tekstowy o nazwie,
data.txt
że twój bot może czytać i pisać, co chce.
Specyfikacje techniczne i objaśnienia zasad
Każdy bot, który próbuje odczytać / napisać coś z dowolnego miejsca poza jego folderem, zostanie wyrzucony z gry.
Twój program musi być w stanie działać na komputerze Macbook z systemem Yosemite. Obecnie obsługiwane języki to Python (2.7.9 i 3.4.2), C / C ++, C-C, perl, ruby, bash, PHP, Java, C #, javascript i Haskell. Jest o wiele więcej, ale to tylko te, o których mogę teraz myśleć. Z czasem dodam więcej. Jeśli chcesz konkurować w określonym języku, napisz do mnie lub komentarz, a jeśli to możliwe, dodam go do listy.
Jeśli plansza jest wygrana, ale nadal jest miejsce, nadal nie możesz przejść do jednego z otwartych miejsc.
Zauważ, że katalog roboczy twojego zgłoszenia będzie katalogiem zawierającym kontroler i wszystkie inne boty, NIE katalogiem zawierającym twojego bota.
Proszę zamieścić wraz z kodem bota kontrolera prawidłowe polecenie do skompilowania (jeśli dotyczy) i uruchomienia bota. Większość tego zostanie wykonana z terminala OS X, który jest dość podobny do terminala Linux.
Boty muszą ukończyć się w mniej niż sekundę. Niestety nie jestem wystarczająco kompetentny, aby dodać timer do bota kontrolera. Jednak ręcznie ustawię czas botów.
Rezultaty!
Cóż, miałem rację. Zapomniałem zrobić bota kontrolera, aby sprawdzić, czy masterBoard jest pełny. Jeśli masterBoard jest pełny, KAŻDY ruch jest nieprawidłowy, ale nadal wywołuje boty, prawdopodobnie dlatego było tak wiele nieprawidłowych ruchów. Mam to teraz naprawione. Oto oficjalne wyniki z najnowszą wersją wszystkich botów.
Bot 1, goodRandBot, has 1 wins and made 0 illegal moves, for a total of 133 points.
Bot 2, naiveBot, has 3 wins and made 48 illegal moves, for a total of 361 points.
Bot 3, depthBot, has 5 wins and made 0 illegal moves, for a total of 664 points.
Bot 4, middleBot, has 1 wins and made 20 illegal moves, for a total of 114 points.
With 4 bots, This program took 477.471 seconds to finish.
Depth Bot jest panującym mistrzem! Przynajmniej na razie.
XXX000---
? czy jest to, że „nikt nie dostaje, mimo że O wygrał jako pierwszy”?