遍历点击五子棋棋盘的所有落子点
2013-12-17 15:18
183 查看
假设棋盘是13X13 布局
图1
我想一次性点击所有的坐标点,用来测试落子点(有效点击范围)的功能是否正常。
最直接的想法是这样:
但是这样问题会很明显。,当点击到第五列第一个点的时候,游戏成功。无法继续进行点击操作...
图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 的方式依次产生成对列序号 直到产生最后一列的序号。
在上文中,平局列序的产生的方法已经叙述完毕。规律较为明显,但是如何利用这个列序呢?
想了很多途径,最后想到一个比较傻瓜化的方法。
可以将点击一列的坐标点这个过程抽象为一个统一的方法。我只要传递列序号进去,不就可以实现按照列序号点击坐标进而产生平局了吗?
主要代码:
测试一下:
运行结果:
图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); }
运行结果:
相关文章推荐
- 利用 SHDocVw::IShellWindowsPtr m_spSHWinds 遍历所有IE浏览器,得到里面的所有元素 还有一个是查找IE窗口里的submit按钮,模拟点击
- 点击按钮,表格隔行变色:偶数行为黄色背景,奇数行为默认颜色。通过table的getElementsByTagName取得所有的tr,依次遍历,如果是偶数就…………。
- [原]点击按钮,表格隔行变色:偶数行为黄色背景,奇数行为默认颜色。通过table的getElementsByTagName取得所有的tr,依次遍历,如果是偶数就…………。
- 写一个方法进行各种属性的更新,而不要每个界面设置改变都改变一个属性。就是点击应用或确定按钮时调用这个更新属性的方法,遍历所有(控制对象属性的)界面控件的状态(值),进行属性修改和刷新。
- 递归遍历 SD 卡目录下的所有音乐文件,并点击条目后进入相应的播放界面
- 遍历一个文件夹下的所有文件和子文件夹(新浪)
- Python-遍历目标文件夹下所有文件
- 马踏棋盘递归所有解
- ios PhotoKit遍历所有照片
- 递归遍历某文件夹下所有文件的算法
- 遍历输出所有子视图(View)
- 读取Assets所存在的所有文件(遍历每一个文件夹),并存入sdcard里面
- 树形节点的所有子节点的遍历
- php遍历所有文件
- BAT遍历所有文件夹及其子文件夹
- 如何使用perl遍历一个目录下的所有文件
- linux C语言遍历文件夹所有文件
- Java 遍历两个MAC地址之间的所有MAC
- PHP遍历文件夹及子文件夹所有文件
- 遍历object中所有key