tło
Gra Morra jest prostą grą. W „oryginalnej” wersji kilku graczy jednocześnie wyrzuca z rąk liczbę 0-5, zgadując całkowitą sumę rąk wszystkich. Wersja, której użyję tutaj, została zmodyfikowana w celu zwiększenia potencjału nietrywialnej strategii i została opisana poniżej:
- Jest dwóch graczy.
- Podobnie jak w papierowych nożyczkach, gracze poruszają się jednocześnie.
- W każdej turze każdy gracz wybiera liczbę 0-5, a także zgaduje wybór przeciwnika 0-5. Oznacza to, że w każdej turze wyprowadzane są dwie liczby. Aby wyjaśnić, dane wyjściowe obu liczb powinny zawierać się w przedziale 0–5 włącznie.
- Jeśli poprawnie odgadniesz wybór przeciwnika, ale przeciwnik nie zgadł poprawnie, wygrywasz określoną liczbę punktów równą sumie dwóch rozegranych liczb. Na przykład, jeśli rozegrane liczby to 3 i 5, prawidłowe odgadnięcie byłoby warte 8 punktów.
- Jeśli obaj lub żaden z graczy nie zgadnie poprawnie, nie przyznaje się punktów.
- Osoba z największą liczbą punktów po 1000 rundach wygrywa tę grę.
Turniej
Turniej zostanie przeprowadzony w stylu robota okrągłego i będzie prowadzony przez utworzenie każdej możliwej pary zawodnika. Za każde zwycięstwo uczestnik otrzymuje 2 punkty zwycięstwa. Każdy remis daje 1 punkt zwycięstwa. Przegrana nie daje żadnych punktów zwycięstwa.
Intuicyjnie zwycięzcą turnieju będzie zawodnik z największą liczbą punktów zwycięstwa nad innymi.
Jak wejść
Będą dwie metody zgłaszania botów do rywalizacji. Pierwszą i bardzo preferowaną metodą jest implementacja interfejsu Java dostarczanego przez kontroler. Drugą metodą jest napisanie niezależnego programu.
Najpierw omówmy metodę Java. Interfejs trzeba będzie wdrożyć to Player
i to definiuje dwie metody: public String getName()
identyfikuje bot, i public int[] getMove(String[] args)
trwa args
jako tablica sześciu strun, mychoices myguesses myscore opponentchoices opponentguesses opponentscore
. Przykład jest następujący:
042 045 0 324 432 6
Oznacza to, że wybrałem 0 w pierwszej rundzie i zgadywałem, że mój przeciwnik rzuci 0. Mój przeciwnik rzucił 3 i domyśliłem się, że rzuci 4. W trzeciej rundzie mój przeciwnik poprawnie zgadywał, że rzuciłem 2, co oznacza, że zyskuje 2 + 4 = 6 punktów.
Twoja metoda zwróci tablicę dwóch liczb całkowitych, które są odpowiednio twoim wyborem i zgadnij. Przykładem jest {4,2}
wybór 4 i zgadywanie 2.
Oto przykład kompletnego bota Java napisanego jako metoda. Jeśli chcesz, Twoje zgłoszenie musi zawierać tylko to, co dzieje się w getMove
metodzie.
import java.util.Random;
/**
* A simple example Morra bot to get you started.
*/
public class ExampleBot implements Player
{
public String getName()
{
return "ExampleBot";
}
public int[] getMove(String [] args)
{
//easiest way I know to break down to create a move history
//(just contains their throw history)
char[] theirThrowsC = args[3].toCharArray();
int[] theirThrows = new int[theirThrowsC.length];
for(int i = 0; i < theirThrowsC.length; i++)
{
theirThrows[i] = Integer.parseInt(Character.toString(theirThrowsC[i]));
}
//get my score
int myScore = Integer.parseInt(args[2]);
Random r = new Random();
int guess = r.nextInt(6);
if(theirThrows.length > 0)
{
guess = theirThrows[theirThrows.length-1];
}
//throws a random number, guesses what they threw last
return new int[] {r.nextInt(6),guess};
}
public static int otherMethod(int example) //you can write additional static methods
{
return 0;
}
}
Jako niezależny program
Obecnie mam ograniczone wsparcie dla dodatkowych języków. Poza Javą mogę akceptować programy napisane w Python 3.4, Perl 5 lub Ruby 2.1.5. Jeśli istnieje język, który wydaje się być potrzebny kilku osobom, dołożę wszelkich starań, aby go dodać.
Dane wejściowe do programu będą argumentami w wierszu poleceń. Może to wyglądać tak:
perl awesomebot.plx 042 045 0 324 432 6
Wyjście twojego programu powinno być twoim wyborem, a następnie zgadnięciem, a po każdym spacją.
Podaj w odpowiedzi dokładne polecenie potrzebne do jego uruchomienia. Pamiętaj, że korzystam z systemu Windows 8.1.
Dodatkowe zasady
Saving State and Timeouts
Twój program będzie mógł utworzyć jeden plik tekstowy w katalogu lokalnym, w którym możesz przechowywać informacje. Informacje te będą przechowywane przez cały turniej, ale zostaną później usunięte. Nadaj plikowi nazwę, którą mogę zidentyfikować.
Kod ma limit czasowy 500 milisekund na odpowiedź. Brak odpowiedzi w wyznaczonym terminie (lub udzielenie nieprawidłowego ruchu) spowoduje przepadek tego konkretnego meczu. Zgłoszenia Java mają obecnie pasywny limit czasu (który mogę uaktualnić do aktywnego), podczas gdy zgłoszenia inne niż Java mają aktywny limit czasu, w którym ich proces kończy się po 500 milisekundach.
Więcej zasad składania
- Dozwolone jest wielokrotne przesyłanie, o ile są one zgodne z zasadami i nie tagują zespołu.
- Każdy wpis musi być unikalny. Nie można wykonać dokładnej kopii logiki innego bota w innym języku.
- Boty nie mogą ze sobą wchodzić w interakcje (w celu utworzenia jakiegokolwiek zespołu).
- Nie możesz użyć logiki innych botów wewnątrz bota, aby, powiedzmy, zidentyfikować konkurenta i przewidzieć jego działania. Możesz oczywiście spróbować ustalić strategię przeciwnika.
- Nie próbuj zadzierać z kontrolerem, innymi uczestnikami lub moim komputerem. Nie łącz się z zewnętrznymi źródłami informacji.
Kontroler
Aktualna wersja kontrolera znajduje się tutaj . Jest napisany w Javie 8. Plik „Tournament” jest głównym kontrolerem, który zawiera również listę zawodników (jeśli chcesz organizować własne zawody).
Tabela liderów
Tak naprawdę nie byłem w stanie często aktualizować tabeli wyników. Jestem raczej zajęty w ten weekend. Przez „raczej zajęty” mam na myśli brak dostępu do komputera od 6:30 do 21:30. Oto wyniki po 5 biegach. Bot „Echo” z jakiegoś powodu wciąż przepadał (być może to moja wina, jeszcze nie zbadałem).
170 - Quinn and Valor
158 - Historian
142 - DeltaMax
140 - MorraCowbell
132 - Extrapolator
115 - Rainbolt
102 - Popularity
100 - Interpolator
83 - CounterBot
80 - Basilisk
76 - Erratica
65 - Trendy
63 - Scholar
62 - RandomGuesser
60 - KingFisher
59 - NullifierBot
55 - EvolvedBot
48 - Confused
Kredyt
Ogromne podziękowania dla Rainbolt i Petera Taylora za pomoc w obsłudze kontrolera.