Hintergrund
Das Spiel Morra ist ein einfaches Spiel. In der "Original" -Version werfen mehrere Spieler gleichzeitig eine Zahl von 0 bis 5 mit ihren Händen aus, während sie die Gesamtsumme aller Hände erraten. Die hier verwendete Version wurde geändert, um das Potenzial für nicht-triviale Strategien zu erhöhen. Sie wird nachfolgend beschrieben:
- Es gibt zwei Spieler.
- Wie bei einer Stein-Papier-Schere bewegen sich die Spieler gleichzeitig.
- In jeder Runde wählt jeder Spieler eine Zahl von 0-5 und errät auch die Wahl seines Gegners von 0-5. Dies bedeutet, dass jede Runde zwei Zahlen ausgegeben werden. Zur Verdeutlichung sollte die Ausgabe beider Zahlen im Bereich von 0 bis einschließlich 5 liegen.
- Wenn Sie die Wahl Ihres Gegners richtig erraten, aber Ihr Gegner nicht richtig geraten hat, gewinnen Sie eine bestimmte Anzahl von Punkten, die der Summe der beiden gespielten Zahlen entspricht. Wenn zum Beispiel die gespielten Zahlen 3 und 5 wären, wäre eine korrekte Schätzung 8 Punkte wert.
- Wenn beide oder keiner der Spieler richtig raten, werden keine Punkte vergeben.
- Die Person mit den meisten Punkten nach 1000 Runden gewinnt das Spiel.
Der Wettbewerb
Das Turnier wird im Round-Robin-Stil ausgetragen und es wird jede mögliche Paarung von Teilnehmern erstellt. Für jeden Sieg erhält der Teilnehmer 2 Siegpunkte. Jedes Unentschieden ergibt 1 Siegpunkt. Für einen Verlust werden keine Siegpunkte gewonnen.
Intuitiv ist der Gewinner des Turniers der Teilnehmer mit den meisten Siegpunkten gegen andere.
Wie betrete ich?
Es gibt zwei Methoden, um Bots zum Wettbewerb einzureichen. Die erste und am meisten bevorzugte Methode besteht darin, eine vom Controller bereitgestellte Java-Schnittstelle zu implementieren. Die zweite Methode besteht darin, ein unabhängiges Programm zu schreiben.
Lassen Sie uns zuerst die Java-Methode behandeln. Die Schnittstelle, die Sie implementieren müssen, ist Player
und definiert zwei Methoden: public String getName()
Identifiziert Ihren Bot und public int[] getMove(String[] args)
nimmt args
als Array von sechs Zeichenfolgen mychoices myguesses myscore opponentchoices opponentguesses opponentscore
. Ein Beispiel ist das folgende:
042 045 0 324 432 6
Dies bedeutet, dass ich in der ersten Runde 0 gewählt und vermutet habe, dass mein Gegner eine 0 werfen würde. Mein Gegner hat eine 3 geworfen und ich habe eine 4 geworfen. In der dritten Runde hat mein Gegner die richtige Vermutung gemacht, dass ich werfen würde eine 2, was bedeutet, dass er 2 + 4 = 6 Punkte gewinnt.
Ihre Methode gibt ein Array mit zwei Ganzzahlen zurück, die Sie auswählen bzw. schätzen. Ein Beispiel ist {4,2}
für eine Auswahl von 4 und eine Vermutung von 2.
Hier ist ein Beispiel für einen vollständigen Java-Bot, der als Methode geschrieben wurde. Wenn Sie möchten, muss Ihre Einreichung nur enthalten, was in der getMove
Methode vor sich geht.
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;
}
}
Als eigenständiges Programm
Ich kann derzeit nur begrenzt weitere Sprachen unterstützen. Neben Java kann ich auch Programme akzeptieren, die in Python 3.4, Perl 5 oder Ruby 2.1.5 geschrieben wurden. Wenn es eine Sprache gibt, die mehrere Leute zu wollen scheinen, werde ich mein Bestes tun, um sie hinzuzufügen.
Die Eingabe in Ihr Programm erfolgt über Argumente in der Befehlszeile. Es könnte so aussehen:
perl awesomebot.plx 042 045 0 324 432 6
Die Ausgabe Ihres Programms sollte Ihre Wahl sein, gefolgt von Ihrer Vermutung, gefolgt von Leerzeichen.
Bitte geben Sie in Ihrer Antwort den genauen Befehl an, der zum Ausführen erforderlich ist. Denken Sie daran, dass ich Windows 8.1 verwende.
Extra Regeln
Status und Zeitüberschreitungen werden gespeichert
Ihr Programm darf eine Textdatei im lokalen Verzeichnis erstellen, in der Sie Informationen speichern können. Diese Informationen werden während des gesamten Turniers gespeichert, aber anschließend gelöscht. Geben Sie der Datei einen Namen, den ich identifizieren kann.
Es gibt ein Zeitlimit von 500 Millisekunden, bis Ihr Code antwortet. Wenn Sie nicht innerhalb der vorgegebenen Frist antworten (oder einen ungültigen Zug ausführen), verfällt das jeweilige Spiel. Java-Übermittlungen haben derzeit eine passive Zeitüberschreitung (die ich möglicherweise auf aktive aktualisieren möchte), wohingegen Nicht-Java-Übermittlungen eine aktive Zeitüberschreitung aufweisen, bei der ihr Prozess nach 500 Millisekunden beendet wird.
Weitere Einreichungsregeln
- Sie können mehrere Beiträge einreichen, sofern diese den Regeln entsprechen und kein Tag-Team bilden.
- Jeder Eintrag muss eindeutig sein. Sie können keine exakte Kopie der Logik eines anderen Bots in einer anderen Sprache erstellen.
- Die Bots können nicht miteinander interagieren (um ein Team zu bilden).
- Sie können die Logik der anderen Bots in Ihrem Bot nicht verwenden, um beispielsweise Ihren Konkurrenten zu identifizieren und dessen Aktionen vorherzusagen. Sie können natürlich versuchen, die Strategie Ihres Gegners zu bestimmen.
- Versuchen Sie nicht, mit dem Controller, anderen Teilnehmern oder meinem Computer in Konflikt zu geraten. Stellen Sie keine Verbindung zu externen Informationsquellen her.
Der Controller
Die aktuelle Version des Controllers finden Sie hier . Es ist in Java 8 geschrieben. Die "Tournament" -Datei ist der Haupt-Controller, der auch die Liste der Teilnehmer enthält (wenn Sie Ihre eigenen Wettbewerbe veranstalten möchten).
Bestenliste
Ich konnte die Bestenliste nicht sehr oft aktualisieren. Ich bin dieses Wochenende ziemlich beschäftigt. Mit "ziemlich beschäftigt" meine ich, dass von 6.30 bis 21.30 Uhr kein Zugriff auf einen Computer möglich ist. Hier sind die Ergebnisse nach 5 Läufen. Der "Echo" -Bot verfiel aus irgendeinem Grund (könnte meine Schuld sein, die ich noch nicht untersucht habe).
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
Kredit
Vielen Dank an Rainbolt und Peter Taylor für ihre Hilfe beim Controller.