您的位置:首页 > 其它

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

2013-12-17 15:18 183 查看
假设棋盘是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);

}


运行结果:



 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐