AI算法:
有一个值全为零的 15*15 的二维数组 wightarray 来存储所有所有AI能下的位置的权值。
另有一个 15*15 的二维数组 indexarray 来存储每次遍历时所记录的标志位。(数组wightarray的位置镜
像数组)
?
public class AI{
******************
******************
public void wight(){
进行棋子状态的判定操作,将数组wightarray里的元素赋上应有的值。详细见下文。
}
public void draw(){
获取数组wightarray里值最大的元素的行数和列数,将棋子画在与此行数和列数相对应的
棋盘位置上。
}
}
?
?
(1)权值的分配:(有一个自己的棋子就加两分,若某一端有对方的棋就减去一分。
1连:2分,死1连:1分
2连:4分,死2连:3分
3连:6分,死3连:5分
4连:8分,死4连:7分
(2)每下一个棋子,就从所下的位置往四周遍历,并将能下的位置在数组indexarray里标志。遍历结束后再
? ? 将相应的权值赋予与标志位置相对应的数组wightarray中的元素。
? ? 如果所标志的位置已经有值,就把相应的权值与此元素的值相加,将相加所得的和作为权值赋予此位置
? ? 所对应的数组中的元素。
?
(3)在进行棋子状态的判定时:
设定权值的初始值为2.
依次遍历所下棋子的左,右,上,下,左上,左下,右上,右下方向。
1.如果某个方向上有相同的棋子就继续这个方向上的遍历,遇上一个相同颜色的棋,就将权值加2。
2.如果遇上一个对方的棋子,就结束此方向上的遍历,并将权值减1,然后进行相反方向上的遍历。
3.如果遇上一个空白位置,标志这个空白位置,然后检测空白位置的下一个位置上是否还有相同颜
色的棋子,若是有相同颜色的棋子就在循环上面的操作。
4.如果空白位置的下一个位置上没有相同颜色的棋子,就进行下一个方向上的遍历。
5.直至遍历完所有的8个方向。
6.将所有的具有标志的位置,在数组wightarray中获取相对应的元素并进行赋予权值的操作。
?
(4)下棋的操作:
? ? 调用draw()方法。
?
(5)何时执行此算法:
只创建一次AI对象。
每次玩家下完棋,调用AI对象的wight()方法和draw()方法。
AI画上白棋后,再调用一次AI对象的wight()方法。
原文:http://lx-asymmetric.iteye.com/blog/2236514