package eveluation;import constdata.ConstData;import java.awt.Point;public class Eveluation...{ // 存放棋子基本价值的数组 protected int m_baseValue[] = new int[15] ; // 存放棋子灵活价值的数组 protected int m_flexValue[] = new int[15]; // 存放每一位置被威胁的信息 protected int m_attackPos[][] = new int[10][9]; // 存放每一位置被保护的信息 protected int m_guardPos[][] = new int[10][9]; // 存放每一位置上的棋子灵活分数 protected int m_flexPos[][] = new int[10][9]; // 存放每一位置上棋子的总价值 protected int m_chessValue[][] = new int[10][9]; // 记录一棋子的相关位置个数 protected int m_posCount; protected Point m_relatePos[] = new Point[20];// //红兵过河的各个位置上分数的分布 protected final int REDP[][] = ...{ ...{0, 0, 0, 0, 0, 0, 0, 0, 0}, ...{90,90,110,120,120,120,110,90,90}, ...{90,90,110,120,120,120,110,90,90}, ...{70,90,110,110,110,110,110,90,70}, ...{70,70,70, 70, 70, 70, 70,70,70}, ...{0, 0, 0, 0, 0, 0, 0, 0, 0}, ...{0, 0, 0, 0, 0, 0, 0, 0, 0}, ...{0, 0, 0, 0, 0, 0, 0, 0, 0}, ...{0, 0, 0, 0, 0, 0, 0, 0, 0}, ...{0, 0, 0, 0, 0, 0, 0, 0, 0}, }; //黑兵过河各个位置上的分数分布 protected final int BLACKP[][] = ...{ ...{0, 0, 0, 0, 0, 0, 0, 0, 0}, ...{0, 0, 0, 0, 0, 0, 0, 0, 0}, ...{0, 0, 0, 0, 0, 0, 0, 0, 0}, ...{0, 0, 0, 0, 0, 0, 0, 0, 0}, ...{0, 0, 0, 0, 0, 0, 0, 0, 0}, ...{70,70,70, 70, 70,70, 70,70, 70}, ...{70,90,110,110,110,110,110,90,70}, ...{90,90,110,120,120,120,110,90,90}, ...{90,90,110,120,120,120,110,90,90}, ...{0, 0, 0, 0, 0, 0, 0, 0, 0}, }; public Eveluation() ...{ for(int i = 0; i < 20; i++) m_relatePos[i] = new Point(); m_baseValue[ConstData.B_KING] = ConstData.BASEVALUE_KING; m_baseValue[ConstData.B_CAR] = ConstData.BASEVALUE_CAR; m_baseValue[ConstData.B_HORSE]= ConstData.BASEVALUE_HORSE; m_baseValue[ConstData.B_ELEPHANT] = ConstData.BASEVALUE_ELEPHANT ; m_baseValue[ConstData.B_BISHOP] = ConstData.BASEVALUE_BISHOP ; m_baseValue[ConstData.B_CANON] = ConstData.BASEVALUE_CANON ; m_baseValue[ConstData.B_PAWN] = ConstData.BASEVALUE_PAWN ; m_baseValue[ConstData.R_KING] = ConstData.BASEVALUE_KING ; m_baseValue[ConstData.R_CAR] = ConstData.BASEVALUE_CAR ; m_baseValue[ConstData.R_HORSE] = ConstData.BASEVALUE_HORSE ; m_baseValue[ConstData.R_ELEPHANT] = ConstData.BASEVALUE_ELEPHANT; m_baseValue[ConstData.R_BISHOP] = ConstData.BASEVALUE_BISHOP ; m_baseValue[ConstData.R_PAWN] = ConstData.BASEVALUE_PAWN ; m_baseValue[ConstData.R_CANON] = ConstData.BASEVALUE_CANON ; m_flexValue[ConstData.B_KING] = ConstData.FLEXIBLE_KING; m_flexValue[ConstData.B_CAR] = ConstData.FLEXIBLE_CAR ; m_flexValue[ConstData.B_HORSE] = ConstData.FLEXIBLE_HORSE ; m_flexValue[ConstData.B_ELEPHANT] = ConstData.FLEXIBLE_ELEPHANT ; m_flexValue[ConstData.B_BISHOP] = ConstData.FLEXIBLE_BISHOP ; m_flexValue[ConstData.B_CANON] = ConstData.FLEXIBLE_CANON ; m_flexValue[ConstData.B_PAWN] = ConstData.FLEXIBLE_PAWN ; m_flexValue[ConstData.R_KING] = ConstData.FLEXIBLE_KING ; m_flexValue[ConstData.R_CAR] = ConstData.FLEXIBLE_CAR ; m_flexValue[ConstData.R_HORSE] = ConstData.FLEXIBLE_HORSE ; m_flexValue[ConstData.R_ELEPHANT] = ConstData.FLEXIBLE_ELEPHANT ; m_flexValue[ConstData.R_BISHOP] = ConstData.FLEXIBLE_BISHOP ; m_flexValue[ConstData.R_CANON] = ConstData.FLEXIBLE_CANON ; m_flexValue[ConstData.R_PAWN] = ConstData.FLEXIBLE_PAWN ; } //估值函数,对传入的棋盘打分,isRed表明轮到谁走棋 public int eveluation(byte position[][], boolean isRed) ...{ int i, j , k; byte chessType, targetType; for(i = 0; i < 10; i++) for(j = 0; j < 9; j++) ...{ m_chessValue[i][j] = 0; m_attackPos[i][j] = 0; m_guardPos[i][j] = 0; m_flexPos[i][j] = 0; } for(i = 0; i < 10; ++i) for(j = 0; j < 9; ++j) ...{ if(ConstData.NOCHESS != position[i][j])//有棋在 ...{ chessType = position[i][j]; getRelatePiece(position, j, i);//获得相关信息 for(k = 0; k < m_posCount; ++k) ...{ targetType = position[m_relatePos[k].y][m_relatePos[k].x]; if(targetType == ConstData.NOCHESS)//灵活性增加 ...{ m_flexPos[i][j]++; } else ...{ if(ConstData.isSameSide(chessType, targetType))//保护自己方的棋子 ...{ m_guardPos[m_relatePos[k].y][m_relatePos[k].x]++; } else//威胁 ...{ m_attackPos[m_relatePos[k].y][m_relatePos[k].x]++; m_flexPos[i][j]++; switch(targetType) ...{ case ConstData.R_KING ://是红将受威胁 if(!isRed) return 18888;//并且没有轮到红方走 break; case ConstData.B_KING ://黑王受威胁 if(isRed) return 18888;//轮到红方走 break; default: m_attackPos[m_relatePos[k].y][m_relatePos[k].x] += (30 + (m_baseValue[targetType] - m_baseValue[chessType])/10)/10; break; } } } } } } //统计估值分数 for(i = 0; i < 10; i++) for(j = 0; j < 9; ++j) ...{ if(position[i][j] != ConstData.NOCHESS) ...{ chessType = position[i][j]; m_chessValue[i][j]++; m_chessValue[i][j] += m_flexValue[chessType] * m_flexPos[i][j]; m_chessValue[i][j] += getBingValue(position, j, i ); } } int halfValue; //统计关于受威胁或保护的信息估值 for(i = 0; i < 10; ++i) for(j = 0; j < 9; ++j) ...{ if(position[i][j] != ConstData.NOCHESS) ...{ chessType = position[i][j]; halfValue = m_baseValue[chessType]/16; m_chessValue[i][j] += m_baseValue[chessType]; if(ConstData.isRed(chessType))//该位置是红棋 ...{ if(m_attackPos[i][j] != 0)//威胁 ...{ if(isRed)//轮到红方走 ...{ if(chessType == ConstData.R_KING) //受威胁的是将 ...{ m_chessValue[i][j] -= 20; } else //受威胁的是其他棋子 ...{ m_chessValue[i][j] -= halfValue * 2; if(m_guardPos[i][j] > 0) //有自己的棋子保护 m_chessValue[i][j] += halfValue; } } else //轮到黑方走 ...{ if(chessType == ConstData.R_KING) return 18888; m_chessValue[i][j] -= halfValue*10; if(m_guardPos[i][j] > 0) m_chessValue[i][j] += halfValue*9; } m_chessValue[i][j] -= m_attackPos[i][j]; } else ...{//没有棋威胁该位置 if(m_guardPos[i][j] > 0) m_chessValue[i][j] += 5; } } else ...{//该位置是黑棋 if(m_attackPos[i][j] > 0) ...{ if(!isRed)//轮到黑方走棋 ...{ if(chessType == ConstData.B_KING)//黑将受到威胁 ...{ m_chessValue[i][j] -= 20; } else//受威胁的是其他棋子 ...{ m_chessValue[i][j] -= halfValue * 2; if(m_guardPos[i][j] > 0)//该位置受到保护 m_chessValue[i][j] += halfValue; } } else ...{//轮到红方下棋 if(chessType == ConstData.B_KING) return 18888; m_chessValue[i][j] -= halfValue * 10; if(m_guardPos[i][j] > 0)//该位置有棋保护 m_chessValue[i][j] += halfValue*9; } m_chessValue[i][j] -= m_attackPos[i][j]; } else ...{//该位置没有被威胁 if(m_guardPos[i][j] > 0)//该位置受到保护 m_chessValue[i][j] += 5; } } } } int redValue = 0; int blackValue = 0; //统计红黑方的总评分 for(i = 0; i < 10; ++i) ...{ for(j = 0; j < 9; ++j) ...{ chessType = position[i][j]; if(chessType != ConstData.NOCHESS) ...{ if(ConstData.isRed(chessType)) ...{ redValue += m_chessValue[i][j]; } else blackValue += m_chessValue[i][j]; } } } if(isRed) return (redValue - blackValue); else return (blackValue - redValue); } //将一个位置加入相关队列 protected void addPoint(int x, int y) ...{ m_relatePos[m_posCount].x = x; m_relatePos[m_posCount].y = y; m_posCount++; } //判断位置(fx,fy)是否能够到达(tx, ty); protected boolean canTouch(byte position[][], int fx, int fy, int tx, int ty) ...{ int i; byte moveID, targetID; if(fx == tx && fy == ty) return false; moveID = position[fy][fx]; targetID = position[ty][tx]; switch(moveID) ...{ //要走的棋是黑方王 case ConstData.B_KING : //目标棋是红方王 if(targetID == ConstData.R_KING) ...{ //不再一条直线上 if(fx != tx) return false; //看中间是否有棋挡着 for(i = fy + 1; i < ty; i++) if(ConstData.NOCHESS != position[i][fx]) return false; } //目标棋是其他子 else ...{ //要在九宫之内走棋 if(ty > 2 || tx < 3 || tx > 5) return false; //每步只能走一个格子 if(Math.abs(tx - fx) + Math.abs(ty - fy) != 1) return false; } break; //同上 case ConstData.R_KING : if(targetID == ConstData.B_KING) ...{ if(fx != tx) return false; for(i = fy - 1; i > ty; --i) if(ConstData.NOCHESS != position[i][fx]) return false; } else ...{ if(ty < 7 || tx < 3|| tx > 5) return false; if(Math.abs(tx - fx) + Math.abs(ty - fy) != 1) return false; } break; case ConstData.B_BISHOP : //士要在九宫之内 if(ty > 2 || tx < 3 || tx > 5) return false; //是走斜线 if(Math.abs(tx - fx) != 1 || Math.abs(ty - fy)!= 1) return false; break; case ConstData.R_BISHOP : // 士要在九宫之内 if(ty < 7 || tx < 3 || tx > 5) return false; // 是走斜线 if(Math.abs(tx - fx) != 1 || Math.abs(ty - fy) != 1) return false; break; case ConstData.B_ELEPHANT : if(ty > 4) return false;//相不能过河 if(Math.abs(tx - fx) != 2 || Math.abs(ty - fy) != 2) return false;//象走田 if(ConstData.NOCHESS != position[(ty+fy)/2][(tx+fx)/2]) return false;//象眼不能有棋在 break; case ConstData.R_ELEPHANT : if(ty < 5) return false; if(Math.abs(tx - fx) != 2 || Math.abs(ty - fy) != 2) return false; if(ConstData.NOCHESS != position[(ty+fy)/2][(tx+fx)/2]) return false; break; case ConstData.B_PAWN : if(ty < fy ) return false;//兵不能倒退走 if(fy < 5 && tx != fx) return false;//没有过河不能横着走 if(Math.abs(tx - fx) + Math.abs(ty - fy) != 1) return false;//判断时候是走一步 break; case ConstData.R_PAWN : if(ty > fy) return false; if(fy > 4 && tx != fx) return false; if(Math.abs(tx - fx) + Math.abs(ty - fy) != 1) return false; break; case ConstData.B_CAR : case ConstData.R_CAR : if(tx != fx && ty != fy) return false;//车是走直线 if(tx == fx) ...{ //纵向走 for(i = Math.min(ty, fy)+1; i < Math.max(ty, fy); ++i) if(ConstData.NOCHESS != position[i][tx])//判断中间是否有棋挡着 return false; } else ...{ for(i = Math.min(tx, fx)+1; i < Math.max(tx, fx); ++i) if(ConstData.NOCHESS != position[fy][i]) return false; } break; case ConstData.B_HORSE : case ConstData.R_HORSE : if(tx == fx || ty == fy) return false; if(Math.abs(tx - fx) + Math.abs(ty - fy) != 3) return false; if(Math.abs(tx - fx) == 2) ...{ //判断是有有棋在绊马脚 if(ConstData.NOCHESS != position[fy][(tx+fx)/2]) return false; } else ...{ //判断是有有棋在绊马脚 if(ConstData.NOCHESS != position[(ty+fy)/2][fx]) return false; } break; case ConstData.R_CANON : case ConstData.B_CANON : if(tx != fx && ty != fy) return false ;//炮走直线 if(ConstData.NOCHESS == position[ty][tx]) ...{ if(tx == fx) ...{ for(i = Math.min(ty, fy)+1; i < Math.max(ty, fy); ++i) if(ConstData.NOCHESS != position[i][fx]) return false; } else ...{ for(i = Math.min(tx, fx)+1; i < Math.max(tx, fx); ++i) if(ConstData.NOCHESS != position[fy][i]) return false; } } else ...{ int count = 0; if(tx == fx) ...{ for(i = Math.min(ty, fy)+1; i < Math.max(ty, fy); ++i) if(ConstData.NOCHESS != position[i][fx])count++; if(1 != count) return false; } else ...{ for(i = Math.min(tx, fx)+1; i < Math.max(tx, fx); ++i) if(ConstData.NOCHESS != position[fy][i]) count++; if(1 != count) return false; } } break; default: return false; } return true; } //列举与制定位置相关的棋子 protected int getRelatePiece(byte position[][], int j, int i) ...{ m_posCount = 0; byte chessID ; boolean flag; int x, y; chessID = position[i][j]; switch(chessID) ...{ case ConstData.R_KING : case ConstData.B_KING : for(y = 0; y < 3 ; ++y) for(x = 3; x < 6; ++x) if(canTouch(position,j, i, x, y)) addPoint(x, y); for(y = 7; y < 10; ++y) for(x = 3; x < 6; ++x) if(canTouch(position, j, i, x, y)) addPoint(x, y); break; case ConstData.R_BISHOP : for(y = 7; y < 10; ++y) for(x = 3; x < 6; ++x) if(canTouch(position, j, i, x, y)) addPoint(x,y); break; case ConstData.B_BISHOP : for(y = 0; y < 3; ++y) for(x = 3; x < 6 ; ++x) if(canTouch(position, j, i, x, y)) addPoint(x, y); break; case ConstData.R_ELEPHANT : case ConstData.B_ELEPHANT : x = j + 2; y = i + 2; if(y < 10 && x < 9 && canTouch(position, j, i, x, y)) addPoint(x, y); x = j + 2; y = i - 2; if(x < 9 && y >= 0 && canTouch(position, j, i, x, y)) addPoint(x, y); x = j - 2; y = i + 2; if(x >= 0 && y < 10 && canTouch(position, j, i, x, y)) addPoint(x, y); x = j - 2; y = i - 2; if(x >= 0 && y >= 0 && canTouch(position ,j, i, x, y)) addPoint(x, y); break; case ConstData.R_HORSE : case ConstData.B_HORSE : x = j + 2; y = i + 1; if(x < 9 && y < 10 && canTouch(position ,j, i, x, y)) addPoint(x, y); x = j + 2; y = i - 1; if(x < 9 && y >= 0 && canTouch(position ,j, i, x, y)) addPoint(x, y); x = j + 1; y = i + 2; if(x < 9 && y < 10 && canTouch(position ,j, i, x, y)) addPoint(x, y); x = j + 1; y = i - 2; if(x < 9 && y >= 0 && canTouch(position ,j, i, x, y)) addPoint(x, y); x = j - 1; y = i + 2; if(x >= 0 && y < 10 && canTouch(position ,j, i, x, y)) addPoint(x, y); x = j - 1; y = i - 2; if(x >= 0 && y >= 0 && canTouch(position ,j, i, x, y)) addPoint(x, y); x = j - 2; y = i + 1; if(x >= 0 && y < 10 && canTouch(position ,j, i, x, y)) addPoint(x, y); x = j - 2; y = i - 1; if(x >= 0 && y >= 0 && canTouch(position ,j, i, x, y)) addPoint(x, y); break; case ConstData.R_CAR : case ConstData.B_CAR : x = j + 1; y = i; while(x < 9) ...{ if(ConstData.NOCHESS == position[y][x]) addPoint(x, y); else ...{ addPoint(x, y); break; } ++x; } x = j - 1; y = i; while(x >= 0) ...{ if(ConstData.NOCHESS == position[y][x]) addPoint(x, y); else ...{ addPoint(x, y); break; } --x; } x = j; y = i + 1; while(y < 10) ...{ if(ConstData.NOCHESS == position[y][x]) addPoint(x, y); else ...{ addPoint(x, y); break; } ++y; } x = j; y = i - 1; while(y >= 0) ...{ if(ConstData.NOCHESS == position[y][x]) addPoint(x, y); else ...{ addPoint(x, y); break; } --y; } break; case ConstData.R_PAWN : y = i - 1; x = j; if(y >= 0) addPoint(x, y); if(i < 5) ...{ y = i; x = j + 1; if(x < 9) addPoint(x, y); x = j - 1; if(x >= 0) addPoint(x, y); } break; case ConstData.B_PAWN : y = i + 1; x = j; if(y < 10)addPoint(x, y); if(i > 4) ...{ y = i; x = j + 1; if(x < 9) addPoint(x, y); x = j - 1; if(x >= 0) addPoint(x, y); } break; case ConstData.R_CANON : case ConstData.B_CANON : flag = false; x = j + 1; y = i; while(x < 9) ...{ if(ConstData.NOCHESS == position[y][x]) ...{ if(!flag)addPoint(x, y); } else ...{ if(!flag) flag = true; else ...{ addPoint(x, y); break; } } ++x; } flag = false; x = j - 1; y = i; while(x >= 0) ...{ if(ConstData.NOCHESS == position[y][x]) ...{ if(!flag) addPoint(x, y); } else ...{ if(!flag) flag = true; else ...{ addPoint(x, y); break; } } x--; } flag = false; x = j; y = i + 1; while(y < 10) ...{ if(ConstData.NOCHESS == position[y][x]) ...{ if(!flag) addPoint(x, y); } else ...{ if(!flag)flag = true; else ...{ addPoint(x, y); break; } } ++y; } flag = false; x = j; y = i - 1; while(y >= 0) ...{ if(ConstData.NOCHESS == position[y][x]) ...{ if(!flag) addPoint(x, y); } else ...{ if(!flag) flag = true; else ...{ addPoint(x, y); break; } } --y; } }//end switch(); return m_posCount; } protected int getBingValue(byte position[][], int x, int y) ...{ if(position[y][x] == ConstData.R_PAWN) return REDP[y][x]; if(position[y][x] == ConstData.B_PAWN) return BLACKP[y][x]; return 0; } }