1. 定义一种数据结构:x,y分别表示当前场上的点所对应的横坐标和纵坐标
注意:不用系统提供的x,y值的类型为
AI算法抽象为一个类:KWOmni(oppoType从用户的角度考虑落子的位置。AI的角度考虑落子的位置。p点开始向左右或者上下遍历在指定情况下能否形成KWOmni初始化好之后,就可以从AI的角度进行思考。startX,startY对hPoint(横向vPoint(竖向rPoint(右下lPoint(左下num连珠的起始点。<span style=";color: rgb(68, 68, 68);font-family: "&font-size: 11px">checkPoint检查该点是否为可用点:如果该点的x,y值大于等于0且小于kBoardSize,则该点在棋盘上。可用则寻找:初始化一个solution(假设有一个点满足条件),从0开始遍历,横向寻找:horizonal(x+ii,y不变),如果x值小于棋盘宽度(判断趋势:是满足num连珠的趋势的话,count++。如果在一段长度的相同类型的点之后找到一个空点(落子点),则认为该点可能为一个solution。)如果找到了我们希望的连珠个数,则返回:如果count大于等于当前连珠个数,并且该点为可用点的话,则返回该点。否则以递归的方式向后一个点进行遍历:getNextPoint(传进来一个pp,如果pp.x+1<kBoardSize,即pp+1下一个点还在同一行的话,result.x=pp.x+1;result.y=pp.y;否则的话寻找下一行:result.x=0;result.y=pp.y+1;)纵向寻找与横向思路一样,只不过x不变,y+ii。右下寻找:x+ii;y+ii。左下寻找:x-ii;y+ii。
如果num=5,找到一个可用五子连珠点,表示胜利。否则继续遍历:看一下这个点是否可用并且判断是否满足stepEmergent这个条件(从pp点进行寻找之后,这个check,我们找到这个点的值,和这个点左右两点的值,不断进行遍历:这个点左右两个点分别满足在棋盘上且满足当前xType的话,则再次进行向左向右遍历,知道最后左侧的值减去右侧的值大于等于需要寻找这个趋势的五子连珠,并且左右点都为空的话,就返回true,即表示这个点左边和右边能够满足需要寻找的这个条件,如果这两个条件有一个不满足,则继续使用循环向四个方向进行寻找。如果跳出了循环的话,要看一看是这两个条件的哪一个跳出了循环。如果条件满足才跳出循环的话(在连珠的两侧找到了空点),返回这个点。否则返回一个不可用的点。)
整体思路:myType(判断AI这个点是否能形成五连珠,即进攻)-->oppoType(判断用户能否形成这个点,即防守)-->myType(判断能否形成四连珠)-->oppoType(判断用户能否形成四连珠)-->3-->2-->sad