遍历点击五子棋棋盘的所有落子点

假设棋盘是13X13 布局

                                                       图1


我想一次性点击所有的坐标点,用来测试落子点(有效点击范围)的功能是否正常。

最直接的想法是这样:

var xInit=22;//棋盘左上角第一个落子点的x坐标
var yInit=116;//棋盘左上角第一个落子点y坐标
var xInc=35;//落子点坐标之间的横向最短间隔
var yInc=35;//落子点坐标之间的纵向最短间隔
var tempx;
var tempy;
for(i=0;i<13;i++){
for(j=0;j<13;i++){
tempx=xInit+i*xTnc;
tempy=yInit+j*yTnc;
NGLogger.Info("点击坐标("+tempx+","+tempy+")");
// device0.GUICOMMON_TouchScreen(tempx,tempy);
	}
}

但是这样问题会很明显。,当点击到第五列第一个点的时候,游戏成功。无法继续进行点击操作...

                                                图2

这种点击的方式肯定会有问题,想到的另一种方式:

                                      图3

按照 区域 1、2、3、4、5 以及箭头方向去落子,平局情形会必现。

不过这种点击方式实现起来有点困难,不知道大家有没有更好的方法?

------------------------------------------------------------------------------------------------

---------------------------------------平局产生方法扩展---------------------------------

------------------------------------------------------------------------------------------------

 研究了一下发现:只要按照一定的落子列序,以一定的周期去落子就很容易构造平局的情况。

相应的扩展周期为2*1、2*2、2*3、2*5

2*1的情况:图1的情况 很明显这种方法不行

2*5的情况:那不就是五子棋了么 排除

2*2的情况:

                                          图4

实验证明是可行的。

落子列序为:

1,3,2,4

5,7,6,8

9,11,10,12

13

周期:4

2*3的情况:

                                            图5

实验证明是依旧可行的。

落子列序为:

1,4,2,5,3,6

7,10,8,11,9,12

13

周期:6

 

根据不完全归纳产生的结果,可以粗略推算出如下规律:

1.这种五子棋平局法可以延伸到 N 阶(N为奇数并且不小于5)的情形都适用。

2.周期是 2*I (I=2,3,4)。

3.点击列序方法产生的方法之一:

  • A:initRow++,initRow+T/2   // intiRow 初始列 每次递增1,T为周期数

  • B:if(initRow%(T/2))==0 {initRow=initRow+T/2+1 }//如果已经产生至少一个周期数的序列,改变 intiRow 的值

  • C:if(initRow==GoBangMultiplicity) {print("最后一个列序号产生")}//GoBangMultiplicity是五子棋棋盘的阶数 

    依照 B 、C 的约束, 按照 A 的方式依次产生成对列序号 直到产生最后一列的序号。

------------------------------------------------------------------------------------------------

---------------------------------------JS 实现平局-----------------------------------------

------------------------------------------------------------------------------------------------

在上文中,平局列序的产生的方法已经叙述完毕。规律较为明显,但是如何利用这个列序呢?

想了很多途径,最后想到一个比较傻瓜化的方法。

可以将点击一列的坐标点这个过程抽象为一个统一的方法。我只要传递列序号进去,不就可以实现按照列序号点击坐标进而产生平局了吗?

主要代码:

/// <summary>
/// 根据初始坐标点和列数连续点击一列的坐标
/// </summary>
/// <param name="initx">初始落子点的x坐标</param>
/// <param name="inity">初始落子点的y坐标</param>
/// <param name="xInc">x轴方向增量</param>
/// <param name="yInc">y轴方向增量</param>
/// <param name="width">棋盘阶数</param>
/// <param name="rownums">落子的列数序列,从1开始</param>
function  TouchScreenByRowNumber(initx,inity,xInc,yInc,width,rownums){
    
    var xInit=initx;//棋盘第一点的x坐标
    var yInit=inity;//棋盘第一点的y坐标
    var tempx;//临时存放x坐标值
    var tempy;//临时存放y坐标值
    
    //拒绝无效的棋盘值
    if(width%2==0||width<5){
        NGLogger.Info("无效的棋盘长度")
            return;
    }
    //拒绝无效的点击序列
    if(typeof(rownums) =    = "object")
    {
        if(rownums.length==0||rownums.length>width)
        {
            NGLogger.Info("无效的点击序列");
            return;
        }
    }
    
    for(i=0;i<rownums.length;i++)//偏移列序号
    {
        for(j=0;j<width;j++)//点击一列的坐标
        {
            tempx=initx+(rownums[i]-1)*xInc;//x坐标随初始列数不同而变化
            tempy=inity+j*yInc;//偏移y坐标
            NGLogger.Info("点击坐标("+tempx+","+tempy+")");
            //device0.GUICOMMON_TouchScreen(tempx,tempy);
        }
    }
}


测试一下:

function AppMain()
{
     var arrays=new Array("1","3","2","4","5","7","6","8","9","11","10","12","13");// 13X13 的棋盘
    TouchScreenByRowNumber(22,116,35,35,13,arrays);
    
}

运行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值