假设棋盘是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.点击列序方法产生的方法之一:
在上文中,平局列序的产生的方法已经叙述完毕。规律较为明显,但是如何利用这个列序呢?
想了很多途径,最后想到一个比较傻瓜化的方法。
可以将点击一列的坐标点这个过程抽象为一个统一的方法。我只要传递列序号进去,不就可以实现按照列序号点击坐标进而产生平局了吗?
主要代码:
///
/// 根据初始坐标点和列数连续点击一列的坐标
///
/// 初始落子点的x坐标
/// 初始落子点的y坐标
/// x轴方向增量
/// y轴方向增量
/// 棋盘阶数
/// 落子的列数序列,从1开始
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
测试一下:
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);
}
运行结果: