背景
Morra游戏是一个简单的游戏。在“原始”版本中,几个玩家同时用双手抛出0-5,同时猜测每个人的总手数。我将在此处使用的版本已经过修改,以增加潜在的非平凡策略,下面对此进行了说明:
- 有两个球员。
- 就像剪刀石头布一样,玩家同时移动。
- 每回合,每个玩家选择一个0-5的数字,并猜测对手的选择0-5。这意味着每转输出两个数字。为了明确起见,两个数字的输出应在0-5(含)范围内。
- 如果您正确猜出了对手的选择,但是您的对手猜错了,您将赢得一定数量的点数,该点数等于两个数字之和。例如,如果打出的数字是3和5,则正确的猜测将价值8分。
- 如果两个或两个玩家都猜对了,则不会获得任何积分。
- 1000回合后得分最高的人将赢得比赛。
比赛
比赛将以循环赛的方式进行,并通过创建每个可能的参赛者配对来进行。每次胜利,参赛者将获得2胜利分。每次平局都会获得1个胜利点。没有获得胜利点的损失。
凭直觉,比赛的获胜者是与他人对分最高的选手。
输入方式
提交机器人进行比赛的方式有两种。第一种也是首选的方法是实现控制器提供的Java接口。第二种方法是编写一个独立的程序。
让我们首先介绍Java方法。您将需要实现的接口是Player
,它定义了两种方法:public String getName()
标识您的机器人,并public int[] getMove(String[] args)
采用args
六个字符串组成的数组mychoices myguesses myscore opponentchoices opponentguesses opponentscore
。下面是一个示例:
042 045 0 324 432 6
这意味着我在第一轮选择了0,并且猜到了我的对手将掷出0。我的对手投了3,然后猜到了我将投掷4。在第三轮中,我的对手做出了正确的猜测,我将投出2,表示他获得2 + 4 = 6分。
您的方法将返回一个由两个整数组成的数组,分别是您的选择和猜测。一个例子是{4,2}
选择4和猜测2。
这是作为方法编写的完整Java机器人的示例。如果需要,您的提交只需包含getMove
方法中的操作。
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;
}
}
作为独立程序
目前,我对其他语言的支持有限。除了Java,我还可以接受用Python 3.4,Perl 5或Ruby 2.1.5编写的程序。如果有几种人似乎想要的一种语言,我会尽力添加。
程序的输入将是命令行上的参数。它可能看起来像这样:
perl awesomebot.plx 042 045 0 324 432 6
程序的输出应该是您的选择,然后是您的猜测,每一个之后都是空格。
请在您的答案中包括运行它所需的确切命令。请记住,我正在运行Windows 8.1。
额外规则
保存状态和超时
您的程序将被允许在本地目录中创建一个文本文件,您可以在其中存储信息。该信息将在整个比赛中保留,但之后将被删除。给文件起一个我可以识别的名称。
您的代码有500毫秒的响应时间。未能在时限内做出回应(或给出无效举动)将导致该场比赛被没收。Java提交当前具有被动超时(我可以将其升级为主动超时),而非Java提交具有主动超时,其中其过程在500毫秒后终止。
更多提交规则
- 您可以多次提交,只要它们遵守规则并且不加标签。
- 每个条目必须是唯一的。您无法用另一种语言精确复制另一个机器人的逻辑。
- 僵尸程序无法彼此互动(形成任何形式的团队)。
- 您无法使用漫游器内部其他漫游器的逻辑来识别竞争对手并预测其行为。当然,您可以尝试确定对手的策略。
- 不要试图弄乱控制器,其他参赛者或我的计算机。不要连接到外部信息源。
控制器
可在此处找到控制器的当前版本。它是用Java 8编写的。“ Tournament”文件是主控制器,它还包含竞争对手的列表(如果您想举办自己的比赛)。
排行榜
我确实无法经常更新排行榜。这个周末我比较忙。“相当忙”是指从6:30 AM到9:30 PM无法访问计算机。这是5次跑步后的分数。由于某些原因,“ Echo”机器人一直没收(可能是我的错,我尚未调查)。
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
信用
非常感谢Rainbolt和Peter Taylor对控制器的帮助。