畅玩Mu Torere游戏


14

背景

Mu Torere是一款游戏,是欧洲毛病爆发前新西兰毛利人玩过的仅有的两种游戏之一。这使其成为一个非常独特的游戏,因为它具有与现有大多数其他游戏不同的“客观获胜标准”和游戏规则。

游戏玩法:

木板是一个八边形。每个相邻顶点之间都有连接,并且有一个中心节点连接到所有顶点。在任何时间点,九个节点中的八个都被石头占据。刚开始时,有四个白色的石头和四个黑色的石头,它们分别占据八角形的一半,而中心节点为空。黑先。

玩家每回合可以将其石头之一沿16个边之一从一个节点移动到空节点。如果石头位于对手的石头旁边,则只能将石头从外部节点移动到中心节点。

玩家无法进行合法移动时会输,这是因为没有边缘将石头连接到空节点时发生。

规则图和说明

是一个解释规则(带有图表)并提供一些分析的网站。

挑战

您面临的挑战是编写最短的程序,以与人类对手玩一个完美的Mu Torere游戏。您的程序应该能够显示和更新游戏板,进行移动并接收来自人类对手的移动。最重要的是,它应该扮演一个完美的游戏。

完美的游戏?

是的,完美的游戏。我一直在进行一些游戏分析,发现如果双方完美玩法,游戏将持续无限长的时间。这意味着您的程序永远不会丢失。同样,只要人类对手犯下允许程序强制胜利的错误,您的程序就应该能够强制胜利。至于您的程序如何找到理想的动作,这取决于您。

细节

每次移动之后(以及游戏开始时),您的程序都应打印游戏板。但是,无论您选择显示板,它都必须显示所有节点并已完全连接(所有16条连接线均应绘制成无交叉线)。在开始时,木板应具有正确的开始位置。实现此目的的一种方法是将游戏板做成正方形。

w-w-w
|\|/|
b-o-w
|/|\|
b-b-b

这两种颜色是黑白或暗/浅。棋盘必须显示哪个节点被哪个玩家的棋子占据,例如用“ b”或“ w”标记它们,以及哪个节点是空的。鼓励(但不是必须)使游戏板更具图形效果,而不是纯文本格式。

您的游戏板应该具有一个编号系统,该编号系统为每个节点分配一个唯一的编号。您可以选择自己喜欢的方式给木板编号,但应在答案中或程序中说明。方板可以编号如下:

1-2-3
|\|/|
4-5-6
|/|\|
7-8-9

人是第一个移动的人。他的输入将是一个数字。这将是当前移动的石头所在节点的编号。如果我想将结石从节点4移动到空节点5,我将输入a 4。暗含5,因为它是唯一的空节点。

假设人类将始终采取法律行动。

在人类行动之后,应打印更新的木板。程序决定采取合法行动后,它应该打印另一个更新的标牌,然后等待人员输入其他行动。

程序一旦获胜,应终止。

笔记

应用标准的代码高尔夫规则,不访问外部文件等,等等。此外,我将为程序执行每个动作施加15秒的灵活时限(在合理的机器上)。如上所述,该游戏有可能形成无限循环,我不希望深度优先搜索进入无限循环。


2
巨大的挑战。仅“如果人员输入了非法动作,则您的程序应等待并允许他输入其他动作。” 对我来说似乎有点不合时宜:在非法输入的情况下,我们不能仅将行为定义为未定义吗?
于2012年

1
我在最后一分钟提出了这个要求,我想如果我们消除它就可以了。对于已经注定不会赢的人来说,这只会增加难度。:)
PhiNotPi 2012年

1
这不是很难始终输入合法的移动...顺便说一下,相当详细的分析后,我认为这是没有必要提前搜索超过1.5移动。该方法是否最短是另一个问题。
彼得·泰勒

3
链接的网站不再可用,最好将其更改为指向存档版本的链接。
Tally 2014年

Answers:


6

Ruby,390个字符

o=->s,c{f=s=~/o/;[*0..8].select{|t|s[t]==c&&(t<1||(t+6)%8+1==f||t%8+1==f||f<1&&(s[(t+6)%8+1]!=c||s[t%8+1]!=c))}.map{|t|k=s*1;k[f]=c;k[t]=?o;k}}
v=->s,c,h{f=o[s,c];f==[]?0:h<1?1:2-f.map{|t|v[t,c>?b??b:?w,h-1]}.min}
q=->g{puts"1-2-3\n|\\|/|\n8-0-4\n|/|\\|\n7-6-5\n".tr"0-8",g;$>.flush}
q[g="obbbbwwww"]
(g.tr!?o,?b;g[gets.to_i]=?o;q[g];q[g=o[g,?w].sort_by{|q|v[q,?w,5]}[-1]])while v[g,?b,5]>0

红宝石中的一种实现,它直接计算游戏树(需要相当多的代码),因此始终发挥最佳性能。电路板的位置向外盘旋,如下图所示:

1 - 2 - 3
| \ | / |
8 - 0 - 4
| / | \ |
7 - 6 - 5

5

bash和朋友(463447个字符)

t(){ tr 0-8a-i $b$b
}
p(){ t<<E
0-1-2
|\|/|
3-4-5
|/|\|
6-7-8

E
}
g(){ b=`tr $x$e $e$x<<<012345678|t`
p
e=$x
}
b=bbbbowwww
e=4
m=0
p
while [ $m != 5 ]&&read x;do
g
m=0
for y in {0..8};do
s=0
S=05011234
grep -E "w.*($y$e|$e$y)"<<<${b:$y:1}30125876340142548746>/dev/null&&for p in wow.\*/ww wow.\*/w bbo.\*/b obb.\*/b www wbw .
do
((s++))
tr $y$e $e$y<<<3012587630/4e|t|grep $p>/dev/null&&break
done
s=${S:$s:1}
[ $s -gt $m ]&&m=$s x=$y
done
g
done

人扮演b,电脑扮演w。董事会职位的编号与顶部文档的编号相同。事实证明,玩完美游戏的启发法非常简单。

另一方面,很难走出有趣的道路。http://ideone.com/sXJPy展示了针对该机器人的最短自杀时间。请注意,最后的额外0是为了测试它是否正确脱离循环。


注意:我可以通过read x强制设置来保存一个字符,但这会使测试非常令人沮丧。我也可以通过删除木板后的空白行来保存字符,但是……
彼得·泰勒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.