Contexte
Le jeu de Morra est un jeu simple. Dans la version "originale", plusieurs joueurs lancent simultanément un numéro 0-5 avec leurs mains tout en devinant la somme totale des mains de chacun. La version que j'utiliserai ici a été modifiée pour augmenter le potentiel de stratégie non triviale, et elle est décrite ci-dessous:
- Il y a deux joueurs.
- Comme dans les ciseaux à papier, les joueurs se déplacent simultanément.
- Chaque tour, chaque joueur choisit un nombre 0-5 et devine également le choix de son adversaire 0-5. Cela signifie que deux nombres sont sortis à chaque tour. Pour clarifier, la sortie des deux nombres doit être comprise entre 0 et 5 inclus.
- Si vous devinez correctement le choix de votre adversaire mais que votre adversaire n'a pas deviné correctement, vous gagnez un certain nombre de points égal à la somme des deux nombres joués. Par exemple, si les nombres joués étaient 3 et 5, une estimation correcte vaut 8 points.
- Si les deux joueurs ou aucun des deux ne devine correctement, aucun point n'est attribué.
- La personne avec le plus de points après 1000 tours remporte la partie.
Le tournois
Le tournoi se déroulera dans un style de tournoi à la ronde et se déroulera en créant chaque paire de concurrents possible. Pour chaque victoire, le candidat gagne 2 points de victoire. Chaque égalité donne 1 point de victoire. Aucun point de victoire n'est gagné pour une perte.
Intuitivement, le vainqueur du tournoi sera le concurrent avec le plus de points de victoire contre les autres.
Comment entrer
Il y aura deux méthodes pour soumettre des robots pour participer. La première méthode, et de loin préférée, consiste à implémenter une interface Java fournie par le contrôleur. La deuxième méthode consiste à écrire un programme indépendant.
Voyons d'abord la méthode Java. L'interface vous devrez implémenter est Player
et il définit deux méthodes: public String getName()
identifie votre bot et public int[] getMove(String[] args)
prend args
comme un tableau de six cordes, mychoices myguesses myscore opponentchoices opponentguesses opponentscore
. Un exemple est le suivant:
042 045 0 324 432 6
Cela signifie que j'ai choisi 0 au premier tour et j'ai deviné que mon adversaire allait lancer un 0. Mon adversaire a lancé un 3 et a deviné que je lancerais un 4. Au troisième tour, mon adversaire a fait la bonne supposition que je lancerais un 2, ce qui signifie qu'il gagne 2 + 4 = 6 points.
Votre méthode renverra un tableau de deux entiers, qui sont respectivement votre choix et votre supposition. Un exemple est {4,2}
pour un choix de 4 et une estimation de 2.
Voici un exemple de bot Java complet écrit comme méthode. Si vous le souhaitez, votre soumission doit uniquement inclure ce qui se passe dans la getMove
méthode.
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;
}
}
En tant que programme indépendant
Je suis actuellement limité dans ma prise en charge de langues supplémentaires. Outre Java, je peux accepter des programmes écrits en Python 3.4, Perl 5 ou Ruby 2.1.5. S'il y a une langue que plusieurs personnes semblent vouloir, je ferai de mon mieux pour l'ajouter.
L'entrée de votre programme sera des arguments sur la ligne de commande. Cela pourrait ressembler à ceci:
perl awesomebot.plx 042 045 0 324 432 6
La sortie de votre programme doit être votre choix suivi de votre supposition, chacun suivi d'un espace.
Veuillez inclure dans votre réponse la commande exacte nécessaire pour l'exécuter. Gardez à l'esprit que j'utilise Windows 8.1.
Règles supplémentaires
Enregistrement de l'état et des délais d'attente
Votre programme sera autorisé à créer un fichier texte dans le répertoire local, où vous pourrez stocker des informations. Ces informations seront conservées tout au long du tournoi mais supprimées par la suite. Donnez au fichier un nom que je peux identifier.
Il y a un délai de 500 millisecondes pour que votre code réponde. Le fait de ne pas répondre dans le délai imparti (ou de donner un coup invalide) entraînera la perte de ce match particulier. Les soumissions Java ont actuellement un délai d'attente passif (que je peux mettre à niveau vers actif), tandis que les soumissions non Java ont un délai d'attente où leur processus se termine après 500 millisecondes.
Plus de règles de soumission
- Vous êtes autorisé à soumettre plusieurs soumissions, tant qu'elles respectent les règles et ne marquent pas l'équipe.
- Chaque entrée doit être unique. Vous ne pouvez pas faire une copie exacte de la logique d'un autre bot dans une langue différente.
- Les bots ne peuvent pas interagir les uns avec les autres (pour former une équipe de toute sorte).
- Vous ne pouvez pas utiliser la logique des autres robots à l'intérieur de votre robot pour, par exemple, identifier votre concurrent et prédire ses actions. Vous pouvez, bien sûr, essayer de déterminer la stratégie de votre adversaire.
- N'essayez pas de jouer avec le contrôleur, les autres concurrents ou mon ordinateur. Ne vous connectez pas à des sources d'informations externes.
Le controlle
La version actuelle du contrôleur se trouve ici . Il est écrit en Java 8. Le fichier "Tournoi" est le contrôleur principal, qui contient également la liste des concurrents (si vous souhaitez héberger vos propres compétitions).
Classement
Je n'ai pas vraiment pu mettre à jour le classement très souvent. Je suis plutôt occupé ce week-end. Par "plutôt occupé", je veux dire pas d'accès à un ordinateur de 6h30 à 21h30. Voici les scores après 5 runs. Le bot "Echo" a continué à perdre pour une raison quelconque (peut-être ma faute, je n'ai pas encore enquêté).
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
Crédit
Un grand merci à Rainbolt et Peter Taylor pour leur aide avec le contrôleur.