圈小猫游戏

前言

我之前写过一篇关于圈小猫游戏的文章,写了一半没有写完,但已经大致把我的容错值理论表达出来了。感觉由于个人学术能力不足,还是没有把这个游戏讲清楚,或者说文章太过于理论化了,难以真正应用在游戏里面。这篇文章希望通过一些简单的表达,讲清楚圈小猫游戏的具体获胜方法。

圈小猫游戏介绍

圈小猫游戏介绍
如图所示,在一个11*11的接近正方形的棋盘上,每个格子按照六边形规则排列(即每个内部的格子都与六个格子相邻)。最中间是小猫的初始位置,它想逃出棋盘。而我们不想让它逃出棋盘,所以要利用手中的棋子和初始障碍物(深色格子)围住它。执棋者先手,小猫后手。
这个游戏可以一人扮演小猫,一人下棋,两个人玩。也可以电脑扮演小猫,跟电脑玩。下面是我用matlab写的游戏代码:

axis([1 22 1 11])
hold on
p=zeros(22,11);
for ii=1:11
    if (mod(ii,2)==1) 
        for j=1:2:21 
            plot(j,ii,'c.')
        end
        else
        for j=2:2:22
            plot(j,ii,'c.')
        end
    end
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);
    end
    p(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);
    end
    plot(a,b,'k*');
    p(a,b)=1;
    c=0;
    t0=0;
    if (t>6) 
        t=t-6;
    end
    if (t<4)
        t=1;
    elseif (t==4) t=2;
    elseif (t==5) t=3;
    elseif (t==6) t=4;
    end
    while (c==0)
        t0=t0+1;
        if (t>6) 
            t=t-6;
        end
        if (t0>12) 
            break;
        end
        if (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;
            end
        elseif (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;
            end
        elseif (t==6|t==0)
            x=x-2;
            if (p(x,y)==1)
                x=x+2;
            else 
                c=1;
                p(x,y)=2;
            end
        elseif (t==3)
            x=x+2;
            if (p(x,y)==1)
                x=x-2;
            else 
                c=1;
                p(x,y)=2;
            end
        elseif (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;
            end
        elseif (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;
            end
        end
        if (c==0) 
            t=t+1;
        end
    end
    if (t0>=12)
        break;
    end
    h.Color='c';
    h=plot(x,y,'r*');
    x0=x;
    y0=y;
end
if (t0>=12) 
    s="恭喜你,成功了"
else s="很抱歉,你失败了"
end



代码复制到matlab里面,用实时编辑器运行就能玩了。红点表示小猫的位置,黑点表示初始障碍物,蓝点表示可以设置障碍物的位置。用鼠标点击蓝点表示下一步棋。游戏界面如下:
在这里插入图片描述
关于小猫的行走逻辑,我只是按照我个人的理解进行了模拟,可能并不是最优的走法。为了降低代码复杂度,判定获胜的标准为小猫一步也走不了了,所以即使有时候肉眼可见地把小猫围住了,仍然需要继续走。

圈小猫游戏策略分析

很多人在初次看到这个游戏的时候,往往会在离小猫很近的地方去围堵。其实这样做很不好,因为这个棋盘的特殊性,小猫可以有非常多选择,所以离太近,小猫很容易逃出去。玩这个游戏,要有大局观。可以发现,要围住小猫,就要形成一个很大的包围圈,使得小猫无论往哪走都逃不出去。而我们就要把棋子都用在这个包围圈上,不在其它地方浪费棋子(因为本来步数就很有限)。经过一些理论分析,可以证明,这个包围圈是越大越好的(证明略)。一个比较容易想到的地方是,这个包围圈上有更多初始障碍物,肯定就越好(可以证明,如果一个初始障碍物也没有,小猫是必胜的)。于是我们的策略就是,在下棋之前,先根据初始障碍物,在脑海中想象一个包围圈,这个包围圈尽量大,尽量包含更多初始障碍物。
以下图为例,白棋围出来的包围圈是一种解法。黑线画出来的包围圈是最优解法,充分利用了棋盘和初始障碍物。
最优策略
这个包围圈是一个多边形。需要注意的是,在脑海中构想这个多边形的时候,一定不要出现锐角(在图上画一画就知道了,如果是锐角的话,把顶点去掉仍然是一个包围圈)。一般来说,包围圈需要包含至少3个初始障碍物,才能围住小猫(这个3是理论和经验结合,得出的一个粗略结果)。

总结

这是一个很好玩的游戏。我第一次玩这个游戏的时候,连输了好几把都没找到方法。玩这个游戏,需要一定的大局观。在掌握方法之前,小猫很容易就逃出去了。但是在掌握方法之后,可以大大提高胜率。这一篇文章比较偏应用,关于这个游戏更多的理论研究,可以看我的另一篇文章(点这里)。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值