sfondo
Il gioco di Morra è un gioco semplice. Nella versione "originale", diversi giocatori lanciano simultaneamente un numero 0-5 con le loro mani mentre indovina la somma totale delle mani di tutti. La versione che userò qui è stata modificata per aumentare il potenziale per una strategia non banale, ed è descritta di seguito:
- Ci sono due giocatori.
- Come nelle forbici da roccia, i giocatori si muovono contemporaneamente.
- Ogni turno, ogni giocatore sceglie un numero 0-5 e indovina anche la scelta degli avversari di 0-5. Ciò significa che vengono emessi due numeri per turno. Per chiarire, entrambi i numeri devono essere compresi nell'intervallo 0-5, compreso.
- Se indovini la scelta del tuo avversario correttamente ma il tuo avversario non ha indovinato correttamente, vinci un certo numero di punti pari alla somma dei due numeri giocati. Ad esempio, se i numeri giocati fossero 3 e 5, un'ipotesi corretta varrebbe 8 punti.
- Se entrambi o nessuno dei giocatori indovina correttamente, non viene assegnato alcun punto.
- La persona con più punti dopo 1000 round vince quella partita.
Il torneo
Il torneo si svolgerà in uno stile round-robin e verrà gestito creando ogni possibile accoppiamento del concorrente. Per ogni vittoria, il concorrente guadagna 2 punti vittoria. Ogni pareggio comporta 1 punto vittoria. Nessun punto vittoria viene guadagnato in perdita.
Intuitivamente, il vincitore del torneo sarà il concorrente con il maggior numero di punti vittoria contro altri.
Come entrare
Ci saranno due metodi per inviare i robot per competere. Il primo e molto preferito metodo è implementare un'interfaccia Java fornita dal controller. Il secondo metodo è scrivere un programma indipendente.
Vediamo prima il metodo Java. L'interfaccia è necessario implementare è Player
e definisce due metodi: public String getName()
identifica il bot, e public int[] getMove(String[] args)
prende args
come un array di sei corde, mychoices myguesses myscore opponentchoices opponentguesses opponentscore
. Un esempio è il seguente:
042 045 0 324 432 6
Questo significa che ho scelto 0 al primo turno e ho indovinato che il mio avversario avrebbe lanciato un 0. Il mio avversario ha lanciato un 3 e ha indovinato che avrei lanciato un 4. Nel terzo turno, il mio avversario ha fatto la supposizione corretta che avrei lanciato un 2, il che significa che guadagna 2 + 4 = 6 punti.
Il tuo metodo restituirà una matrice di due numeri interi, che sono la tua scelta e la tua ipotesi, rispettivamente. Un esempio è {4,2}
per una scelta di 4 e un'ipotesi di 2.
Ecco un esempio di un bot Java completo scritto come metodo. Se lo desideri, il tuo invio deve solo includere ciò che sta accadendo nel getMove
metodo.
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;
}
}
Come programma indipendente
Al momento sono limitato nel mio supporto per altre lingue. Oltre a Java, posso accettare programmi scritti in Python 3.4, Perl 5 o Ruby 2.1.5. Se esiste una lingua che molte persone sembrano desiderare, farò del mio meglio per aggiungerla.
L'input per il tuo programma saranno argomenti sulla riga di comando. Potrebbe apparire così:
perl awesomebot.plx 042 045 0 324 432 6
L'output del tuo programma dovrebbe essere la tua scelta seguita da una tua ipotesi, ciascuno seguito da uno spazio bianco.
Includi nella tua risposta l'esatto comando necessario per eseguirlo. Tieni presente che sto utilizzando Windows 8.1.
Regole extra
Stato di salvataggio e timeout
Il tuo programma sarà autorizzato a creare un file di testo nella directory locale, dove è possibile memorizzare informazioni. Queste informazioni verranno conservate per tutto il torneo ma successivamente cancellate. Assegna al file un nome che posso identificare.
C'è un limite di tempo di 500 millisecondi per la risposta del codice. La mancata risposta entro il termine (o la mossa non valida) comporterà la perdita di quel particolare incontro. Gli invii Java attualmente hanno un timeout passivo (che posso aggiornare a attivo), mentre gli invii non Java hanno un timeout attivo in cui il loro processo termina dopo 500 millisecondi.
Altre regole di presentazione
- Sono consentiti invii multipli, purché rispettino le regole e non tag-team.
- Ogni voce deve essere unica. Non è possibile effettuare una copia esatta della logica di un altro bot in una lingua diversa.
- I robot non possono interagire tra loro (per formare una squadra di qualsiasi tipo).
- Non puoi usare la logica degli altri robot all'interno del tuo bot per, per esempio, identificare il tuo concorrente e prevederne le azioni. Ovviamente puoi provare a determinare la strategia del tuo avversario.
- Non tentare di pasticciare con il controller, altri concorrenti o il mio computer. Non connettersi a fonti di informazioni esterne.
Il controller
La versione corrente del controller è disponibile qui . È scritto in Java 8. Il file "Torneo" è il controller principale, che contiene anche l'elenco dei concorrenti (se si desidera ospitare le proprie competizioni).
Classifica
Non sono stato davvero in grado di aggiornare la classifica molto spesso. Sono piuttosto impegnato questo fine settimana. Per "piuttosto impegnato" intendo nessun accesso a un computer dalle 6:30 alle 21:30. Ecco i punteggi dopo 5 punti. Il bot "Echo" ha continuato a perdere per qualche motivo (potrebbe essere colpa mia, non ho ancora indagato).
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
Credito
Mille grazie a Rainbolt e Peter Taylor per il loro aiuto con il controller.