canvas.drawLine(line.xStart, line.yStart, line.xStop, line.yStop, paint); }
}
4.4.2分析规则
判断各个四个方向的棋子:
在某个方向(八个中的一个)可下多少棋子,这个方法是第一分析中的核心方法
private void countPoint(List
//在某个方向上是否还能下到满五个棋子
private int maxCountOnThisDirection(Point point,List
int x=point.getX(),y=point.getY(); switch (direction) { //横向 case HENG:
while (!enemyPoints.contains(point.setX(point.getX()-1)) && point.getX()>=0
}
if(myPoints.contains(pointToNext(point,direction,forward))){ }
fr.count ++;
if(myPoints.contains(pointToNext(point,direction,forward))){ }
fr.aliveState=HALF_ALIVE;
fr.count ++;
if(myPoints.contains(pointToNext(point,direction,forward))){
fr.count ++;
if(myPoints.contains(pointToNext(point,direction,forward))){
fr.count ++;
}else if(enemyPoints.contains(point) || }
fr.aliveState=HALF_ALIVE;
isOutSideOfWall(point,direction)){
}else if(enemyPoints.contains(point) || }
fr.aliveState=HALF_ALIVE;
fr.aliveState=HALF_ALIVE;
isOutSideOfWall(point,direction)){
}else if(enemyPoints.contains(point) || isOutSideOfWall(point,direction)){
}else if(enemyPoints.contains(point) || isOutSideOfWall(point,direction)){
direction,int count){
&& count<6) {
count ++;
- 21 -
}
point.setX(x);
while (!enemyPoints.contains(point.setX(point.getX()+1)) &&
point.getX() } point.setY(y); while (!enemyPoints.contains(point.setY(point.getY()+1)) && } break; count ++; count ++; } break; count ++; //纵向 case ZHONG: while (!enemyPoints.contains(point.setY(point.getY()-1)) && point.getY()>=0) point.getY() //正斜向 / case ZHENG_XIE: while (!enemyPoints.contains(point.setX(point.getX()-1).setY(point.getY()+1)) && point.getX()>=0 && point.getY() } point.setX(x).setY(y); while count ++; (!enemyPoints.contains(point.setX(point.getX()+1).setY(point.getY()-1)) && point.getX() } break; count ++; //反斜 / case FAN_XIE: while (!enemyPoints.contains(point.setX(point.getX()-1).setY(point.getY()-1)) && point.getX()>=0 && point.getY()>=0) { } point.setX(x).setY(y); while count ++; (!enemyPoints.contains(point.setX(point.getX()+1).setY(point.getY()+1)) && point.getX() count ++; - 22 - } } } break; return count; 4.4.3胜负判断 实际上,是根据当前最后一个落子的情况来判断胜负的。实际上需要从四个位置判 断,以该子为出发点的水平,竖直和两条分别为 45度角和135度角的线,目的是看在这四个方向是否最后落子的一方构成连续五个的棋子,如果是的话,就表示该盘棋局已经分出胜负。 4.4.4算法实现描述 开始分析,扫描所有空白点,形成第一次分析结果: private Point doFirstAnalysis(List int size = allFreePoints.size(); Point computerPoint = null; Point humanPoint = null; int x,y; FirstAnalysisResult firstAnalysisResult; for (int i = 0; i < size; i++) { computerPoint = allFreePoints.get(i); //先把X、Y坐标记下来,因为在分析过程中会改变原来的对象 x = computerPoint.getX(); y = computerPoint.getY(); if(x if(x==debugx && y==debugy){ } //尝试在此位置上下一个棋子,并分析在“横向”这个方向上我方可形成的状态,如活4,活3,半活4, System.out.println(\continue; y>currentRange.yStop){ // // // 活2等所有状态 firstAnalysisResult = tryAndCountResult(comuters,humans, computerPoint, computerPoint.setX(x).setY(y);//回复点位的原值,以供下次分析 if(firstAnalysisResult!=null){//无返回结果此方向上不可能达到五个棋子, if(firstAnalysisResult.count==5)//等于5表示在此点上下棋子即可连成5个,胜利了, HENG); 不再往下进行分析 - 23 - } return computerPoint; //记录第一次分析结果 addToFirstAnalysisResult(firstAnalysisResult,computerFirstResults); 第二次分析,分析第一次形成的结果,第一次分析结果会把一步棋在四个方向上可形成的结果生成最多四个FirstAnalysisResult对象(敌我各四) //这里要把这四个对象组合成一个SencondAnalysisResult对象, private Point doComputerSencondAnalysis(Map List for (Point p : firstResults.keySet()) { sr = new SencondAnalysisResult(p); list = firstResults.get(p); for (FirstAnalysisResult result : list) { if(result.count==4){ if(result.aliveState==ALIVE){//经过前面的过滤,双方都排除了绝杀棋,有活4就 return result.point;//如果有绝杀,第一轮已返回,在此轮活4已经是好的棋子, firstResults,List 下这一步了,再下一步就赢了 直接返回,不再往下分析 }else{ } if(result.aliveState==ALIVE){ } sr.alive2++; if(sr.alive2==1){ } computer2Alives.add(sr); computerDouble2Alives.add(sr); }else{ sr.alive3++; if(sr.alive3==1){ } sr.halfAlive3++; computer3HalfAlives.add(sr); computer3Alives.add(sr); computerDouble3Alives.add(sr); }else{ sr.halfAlive4 ++; computer4HalfAlives.add(sr); }else if(result.count==3){ }else{ }else{//半活2在第一阶段已被排除,不再处理 - 24 -
相关推荐: