public class Evaluation{ static long coef[]={3,3,3,3,3,3}; public Evaluation(){ } public long getMobility1(board b,int color){ long ret=0; //numarul de patrate libere de pe tabla care au "cel putin" o piesa //de culoare "color" vecina for (int i=1;i<=8;i++) for (int j=1;j<=8;j++) if (b.getElementAt(i,j)==0){ boolean gata=false; for (int dx=-1;dx<=1;dx++){ for (int dy=-1;dy<=1;dy++) if ((dx==0)&&(dy==0)){ }else{ if (!this.offLimits(i+dx,j+dy)){ if (b.getElementAt(i+dx,j+dy)==color){ ret++;gata=true;break; } } } if (gata) break; } } return ret; } public boolean offLimits(int row,int column){ return ((row<1)||(row>8)||(column<1)||(column>8)); } public long getMobility2(board b,int color){ //numarul de patrate libere care inconjoara toate patratele //de culoare "color" din partea centrala 7x7 din board long ret=0; for (int i=2;i<=7;i++) for (int j=2;j<=7;j++) if (b.getElementAt(i,j)==color) for (int dx=-1;dx<=1;dx++) for (int dy=-1;dy<=1;dy++) if ((dx==0)&&(dy==0)){ }else{ if (!this.offLimits(i+dx,j+dy)){ if (b.getElementAt(i+dx,j+dy)==0) ret++; } } return ret; } public long getMobility3(board b,int color){ //numarul de patrate libere care inconjoara toate patratele //de culoare "color" de pe toata tabla long ret=0; for (int i=1;i<=8;i++) for (int j=1;j<=8;j++) if (b.getElementAt(i,j)==color) for (int dx=-1;dx<=1;dx++) for (int dy=-1;dy<=1;dy++) if ((dx==0)&&(dy==0)){ }else{ if (!this.offLimits(i+dx,j+dy)){ if (b.getElementAt(i+dx,j+dy)==0) ret++; } } return ret; } public long getMobility4(board b,int color){ long ret=0; //numarul de piese de tip "color" care au cel putin un //patratel liber in jurul lor for (int i=1;i<=8;i++) for (int j=1;j<=8;j++) if (b.getElementAt(i,j)==color){ boolean gata=false; for (int dx=-1;dx<=1;dx++){ for (int dy=-1;dy<=1;dy++) if ((dx==0)&&(dy==0)){ }else{ if (!this.offLimits(i+dx,j+dy)){ if (b.getElementAt(i+dx,j+dy)==0){ ret++;gata=true;break; } } } if (gata) break; } } return ret; } public long getMobility5(board b,int color){ //numarulde piese de tip "color" care inconjoara piese de acelasi tip long ret=0; for (int i=1;i<=8;i++) for (int j=1;j<=8;j++) if (b.getElementAt(i,j)==color) for (int dx=-1;dx<=1;dx++) for (int dy=-1;dy<=1;dy++) if ((dx==0)&&(dy==0)){ }else{ if (!this.offLimits(i+dx,j+dy)){ if (b.getElementAt(i+dx,j+dy)==color) ret++; } } return ret; } public long getMobility6(board b,int color){ //numarul de piese de tip "color" care au cel putin un vecin de acelasi tip long ret=0; for (int i=1;i<=8;i++) for (int j=1;j<=8;j++) if (b.getElementAt(i,j)==color) for (int dx=-1;dx<=1;dx++){ boolean gata=false; for (int dy=-1;dy<=1;dy++) if ((dx==0)&&(dy==0)){ }else{ if (!this.offLimits(i+dx,j+dy)){ if (b.getElementAt(i+dx,j+dy)==color) ret++;gata=true;break; } } if (gata) break; } return ret; } public long evaluate_position(board b,int color,int depth,int level){ if (level==0){ //calc joaca prost return b.howManybyColor(3-color); } // System.out.println("Evaluating board:"+b.toString()); // System.out.println("For color:"+color+" at depth:"+depth); // try{int jkl=System.in.read();}catch (Exception ex){} int oposite=3-color; long ret=0; //mobilitate 1 long my=getMobility1(b,color); long op=getMobility1(b,oposite); //System.out.println("Mobility 1:my="+my+" si op="+op); ret+=coef[0]*(op-my); //end mobilitate 1 //mobilitate 2 my=getMobility2(b,color); op=getMobility2(b,oposite); //System.out.println("Mobility 2:my="+my+" si op="+op); ret+=coef[1]*(op-my); if (level==3) return ret; //end mobilitate 2 //mobilitate 3 my=getMobility3(b,color); op=getMobility3(b,oposite); //System.out.println("Mobility 3:my="+my+" si op="+op); ret+=coef[2]*(op-my); //end mobilitate 3 //mobilitate 4 my=getMobility4(b,color); op=getMobility4(b,oposite); ret+=coef[3]*(op-my); //System.out.println("Mobility 4:my="+my+" si op="+op); //end mobilitate 4 //mobilitate 5 my=getMobility5(b,color); op=getMobility5(b,oposite); ret+=coef[4]*(op-my); //System.out.println("Mobility 5:my="+my+" si op="+op); //end mobilitate 5 //mobilitate 6 my=getMobility6(b,color); op=getMobility6(b,oposite); ret+=coef[5]*(op-my); //System.out.println("Mobility 6:my="+my+" si op="+op); //end mobilitate 6 if (b.getElementAt(1,1)==oposite) ret-=100; else if (b.getElementAt(1,1)==color) ret+=100; if (b.getElementAt(1,8)==oposite) ret-=100; else if (b.getElementAt(1,8)==color) ret+=100; if (b.getElementAt(8,1)==oposite) ret-=100; else if (b.getElementAt(8,1)==color) ret+=100; if (b.getElementAt(8,8)==oposite) ret-=100; else if (b.getElementAt(8,8)==color) ret+=100; if (b.howMany()>=60){ if (b.howManybyColor(color)>b.howManybyColor(oposite)) ret+=500; } if (b.howManybyColor(color)==0) ret-=1000;//evitam situatia de a ramane fara piese pe tabla return ret; } }