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.
źródło
XXX000---
? czy jest to, że „nikt nie dostaje, mimo że O wygrał jako pierwszy”?Odpowiedzi:
Python 2.7, głębia
Implementacja przycinania w wersji alfa-beta bez niczego wymyślnego. Stara się porządkować ruchy w mniej naiwny sposób, aby zmaksymalizować eliminacje alfa-beta. Prawdopodobnie spróbuję go przyspieszyć, ale szczerze mówiąc, nie wiem, jak konkurencyjny może być Python, jeśli sprowadza się do kwestii szybkości.
Aby go uruchomić, możesz po prostu to zrobić
python Depth.py <input>
, chociaż sugerowałbym użycie,pypy
ponieważ zauważalnie przyspiesza.Nie wiem też, jak szybki jest twój system, ale możesz zmodyfikować pierwszy argument
DepthPlayer
na samym końcu, aby był wyższy, jeśli nadal może działać w określonym czasie (w moim systemie wykonał prawie wszystkie rzeczy bardzo szybko z głębokością 7 lub 8, ale było kilka przypadków, które były blisko lub powyżej sekundy, więc ustawiłem ją na 6, aby być bezpiecznym).źródło
sys.argv
nie zwraca łańcucha oddzielonego znakiem nowej linii. Daje listę ciągów w tym formacie:['Depth.py', 'X', '---------', '---------', ...]
Naprawiłem to, edytując do tego ostatnie dwa wiersze.command = '\n'.join(sys.argv[1:]) print DepthPlayer(6).run(command)
Mam nadzieję, że nie masz nic przeciwko.Java, naiwny
Jeśli to możliwe, wygrywa. W przeciwnym razie przeciwnik wygrywa.
źródło
Naive.class
w katalogu o nazwienaiveBot
wewnątrz katalogu głównego.java Naive <args>
polecenie, zakładając, że zmienne środowiskowe zawierają wskaźnik doC:\Program Files\Java\jdk1.8.0\bin
. Mam nadzieję, że to pomoże.java -classpath naiveBot Naive
;)legalAnywhere
to prawda, przesyłanie nie powiedzie się, ponieważ próbujesz użyć planszy , które zostały już wygrane przez gracza.Python 2, MiddleBot
MiddleBot lubi środek. Zanim wygrana zostanie gra centralna (4), spróbuje ona złapać środkowy kwadrat z jak największej liczby gier, zmuszając przeciwnika do powrotu do gry środkowej raz za razem.
Po wykonaniu tej czynności próbuje wygrać dowolną grę lub po prostu zapełnia pierwsze dostępne miejsce, jeśli nie (chyba, że trzeba popracować nad jego późną grą)
Aby go uruchomić,
python MiddleBot.py <input>
wydaje mi się, że z radością zabiera mi to sekundę, więc mam nadzieję, że tak też będzieźródło
Równie dobrze mogę wrzucić mojego bota do miksu.
python 2, goodRandomBot
Ten bot nie dba o to, gdzie się porusza, o ile jest to prawidłowy ruch. Wybiera losowo ze wszystkich prawidłowych ruchów i wykonuje średnią liczbę
0
nieprawidłowych ruchów.źródło