前言
我之前写过一篇关于圈小猫游戏的文章,写了一半没有写完,但已经大致把我的容错值理论表达出来了。感觉由于个人学术能力不足,还是没有把这个游戏讲清楚,或者说文章太过于理论化了,难以真正应用在游戏里面。这篇文章希望通过一些简单的表达,讲清楚圈小猫游戏的具体获胜方法。
圈小猫游戏介绍
如图所示,在一个11*11的接近正方形的棋盘上,每个格子按照六边形规则排列(即每个内部的格子都与六个格子相邻)。最中间是小猫的初始位置,它想逃出棋盘。而我们不想让它逃出棋盘,所以要利用手中的棋子和初始障碍物(深色格子)围住它。执棋者先手,小猫后手。
这个游戏可以一人扮演小猫,一人下棋,两个人玩。也可以电脑扮演小猫,跟电脑玩。下面是我用matlab写的游戏代码:
axis([1 22 1 11])
hold on
p=zeros(22,11);
for ii=1:11if (mod(ii,2)==1) for j=1:2:21 plot(j,ii,'c.')endelsefor j=2:2:22plot(j,ii,'c.')endend
end
x0=12;
y0=6;
h=plot(x0,y0,'r*');
p(x0,y0)=2;
x=x0;
y=y0;
for ii=1:8 %%8表示初始障碍物的个数,初始障碍物越多越简单,可以自己调节难度x1=fix(rand*21)+1;y1=rand*10+1;if (mod(x1,2)==mod(fix(y1),2))y1=fix(y1);else y1=ceil(y1);endp(x1,y1)=1;plot(x1,y1,'k*');
end
t=2;
while (1<x&x<22&1<y&y<22)[a,b]=ginput(1);a=round(a);b=round(b);while (mod(a,2)~=mod(b,2))s="你的输入不合法!请重新选择你要设置的障碍物的坐标"[a,b]=ginput(1);a=round(a);b=round(b);endplot(a,b,'k*');p(a,b)=1;c=0;t0=0;if (t>6) t=t-6;endif (t<4)t=1;elseif (t==4) t=2;elseif (t==5) t=3;elseif (t==6) t=4;endwhile (c==0)t0=t0+1;if (t>6) t=t-6;endif (t0>12) break;endif (t==5) x=x-1;y=y+1;if (p(x,y)==1)x=x+1;y=y-1;else c=1;p(x,y)=2;endelseif (t==4)x=x+1;y=y+1;if (p(x,y)==1)x=x-1;y=y-1;else c=1;p(x,y)=2;endelseif (t==6|t==0)x=x-2;if (p(x,y)==1)x=x+2;else c=1;p(x,y)=2;endelseif (t==3)x=x+2;if (p(x,y)==1)x=x-2;else c=1;p(x,y)=2;endelseif (t==1)x=x-1;y=y-1;if (p(x,y)==1)x=x+1;y=y+1;else c=1;p(x,y)=2;endelseif (t==2)x=x+1;y=y-1;if (p(x,y)==1)x=x-1;y=y+1;else c=1;p(x,y)=2;endendif (c==0) t=t+1;endendif (t0>=12)break;endh.Color='c';h=plot(x,y,'r*');x0=x;y0=y;
end
if (t0>=12) s="恭喜你,成功了"
else s="很抱歉,你失败了"
end
代码复制到matlab里面,用实时编辑器运行就能玩了。红点表示小猫的位置,黑点表示初始障碍物,蓝点表示可以设置障碍物的位置。用鼠标点击蓝点表示下一步棋。游戏界面如下:
关于小猫的行走逻辑,我只是按照我个人的理解进行了模拟,可能并不是最优的走法。为了降低代码复杂度,判定获胜的标准为小猫一步也走不了了,所以即使有时候肉眼可见地把小猫围住了,仍然需要继续走。
圈小猫游戏策略分析
很多人在初次看到这个游戏的时候,往往会在离小猫很近的地方去围堵。其实这样做很不好,因为这个棋盘的特殊性,小猫可以有非常多选择,所以离太近,小猫很容易逃出去。玩这个游戏,要有大局观。可以发现,要围住小猫,就要形成一个很大的包围圈,使得小猫无论往哪走都逃不出去。而我们就要把棋子都用在这个包围圈上,不在其它地方浪费棋子(因为本来步数就很有限)。经过一些理论分析,可以证明,这个包围圈是越大越好的(证明略)。一个比较容易想到的地方是,这个包围圈上有更多初始障碍物,肯定就越好(可以证明,如果一个初始障碍物也没有,小猫是必胜的)。于是我们的策略就是,在下棋之前,先根据初始障碍物,在脑海中想象一个包围圈,这个包围圈尽量大,尽量包含更多初始障碍物。
以下图为例,白棋围出来的包围圈是一种解法。黑线画出来的包围圈是最优解法,充分利用了棋盘和初始障碍物。
这个包围圈是一个多边形。需要注意的是,在脑海中构想这个多边形的时候,一定不要出现锐角(在图上画一画就知道了,如果是锐角的话,把顶点去掉仍然是一个包围圈)。一般来说,包围圈需要包含至少3个初始障碍物,才能围住小猫(这个3是理论和经验结合,得出的一个粗略结果)。
总结
这是一个很好玩的游戏。我第一次玩这个游戏的时候,连输了好几把都没找到方法。玩这个游戏,需要一定的大局观。在掌握方法之前,小猫很容易就逃出去了。但是在掌握方法之后,可以大大提高胜率。这一篇文章比较偏应用,关于这个游戏更多的理论研究,可以看我的另一篇文章(点这里)。