说谎者的骰子是一个相当简单的骰子游戏。我看到了一些不同的规则变体,但这是我最熟悉的版本:
- 每个玩家以5d6开始
- 除了在回合结束时计算骰子时,每个玩家都可以看到自己的骰子,但看不到任何对手的骰子
- 在任何给定回合开始时,所有玩家都掷出他们当前拥有的任何骰子
- 然后,一个玩家(通常是前一轮的获胜者,或者是上次开始的玩家左侧的玩家;我们将前者用于此KotH;随机玩家在第一轮开始)猜测桌子上有多少个特定数字(很野生)
- 竞标继续向右移动,每次竞标都更高(例如,3个5、3个6和4个2都高于3个4个,但3个3个不是; 4个也更高,但竞标可能会使您处于坏处); 直到任何玩家称他们之前的玩家为骗子
- 在这一点上,所有玩家都展示自己的骰子,并在桌子上一并计算最后一次竞标的次数
- 如果总价低于出价,则出价的玩家必须给称他们为说谎者的玩家致死,否则,称出价者为说谎者的玩家必须给出价者致死(这样,出价者获胜。如果他们的数量至少等于他出价的数量,则不必是确切的数量)
- 当骰子用完时,您会输
- 最后一名站长获胜
例如:
玩家一有1,1,2,4,6 玩家二有1,2,2,3,5 玩家三有1,3,3,4,6 玩家一:三分之六。 玩家二:四分之二。 玩家三:四个三分。 玩家一:五分之二。 玩家二:六个二。 玩家三:六个三分。 玩家一:六四。 玩家二:骗子! 他们露出自己的骰子,并数出骰子(因为有些是野生的)和四数。 事实证明,实际上恰好有六个四。 因此,第二个玩家给一个玩家一个死亡。 他们重新投掷,第一人开始下一轮比赛。
您必须编写一个机器人才能玩此游戏。它必须实现以下抽象java类:
public abstract class Player {
public Player() {}
public String toString() {
return this.getClass().getSimpleName();
}
public abstract String bid(int yourId, int[] diceEachPlayerHas, int[] yourDice, String[] bids);
}
- 您必须实施出价方法
- 第一个参数是您的机器人在回合顺序中的当前位置,第二个参数是显示每个玩家(包括您自己)当前拥有多少个骰子的数组,第三个是显示当前在您自己的骰子上显示的值的数组,第四个是自当前回合开始以来所有出价的数组-如果您是第一轮出价,则长度为0
- 输出应该是“数字面”形式的字符串,或者是“骗子!”字符串。称前竞标者为骗子。
- 如果您的输出格式不正确,您将被淘汰。
- 您可以重写toString方法,但不是必需的。但是,您不得以任何妨碍控制器输出可读性的方式对其进行编辑。
- 您可以调用控制器的任何其他公共方法,但不能调用其主要方法。
- 您只能读取和编辑运行目录中以您自己的机器人名称开头的文件
- 您不得从任何其他来源获取输入
- 实例变量在每个新游戏开始时都会重置,但静态变量不会重置。
计分
- 每次添加一个机器人(一旦提交了三个或更多机器人),就会模拟一组1,000个游戏,每个游戏中有3-5个玩家,其得分如控制器来源所示(在任何给定游戏中,在每个回合开始时获得1个,每一次赢得一次死亡获得10个,如果获胜则获得1,000个奖金);每场比赛限制5,000个回合(非回合)。
- 您的机器人将根据最新游戏中的得分进行评分;如果是非负数,则加上其投票分数的十倍。(后者不太可能对分数产生重大影响)
截至2015-06-19得分:
Badnomial: 434,924 + 6x10 = 424,984
Nobody: 282,329 + 6x10 = 282,389
StraightShooter: 265,205 + 5x10 = 265,255
MostlyHonestAbe: 158,958 + 4x10 = 158,998
The Pirate: 157,005 + 1x10 = 157,015
Statistician: 144,012 + 2x10 = 144,032
Fidelio: 49,973 + 2x10 = 49,993
Absurd Bot: 6,831
DrHouse: 2,638 + 3x10 = 2,668
diceEachPlayerHas[yourId]
=您的骰子数,bids[yourId]
是您的第一个出价(如果是第一次,则为null)。那是对的吗?