生成有效着法
转载请保留作者信息:
作者:88250
Blog:http:/blog.csdn.net/DL88250
MSN & Gmail & QQ:DL88250@gmail.com
着法生成就是要产生所有有效的着法,让电脑棋手在这些着法中选择最好的着法,最后走出这一着。要生成所有着法只能用穷举了。中国象棋大约每一步可以有45个着法选择。下面是代码:
/**
* Generates all valid motions.
* @return all valid motion list, if no motion could be generated,
* returns <code>null</code>
* @see cn.edu.ynu.sei.chinesechess.common.Motion
*/
@SuppressWarnings("unchecked")
final public List<Motion> generatePossibleMoves() {
List<Motion> ret = new ArrayList<Motion>();
for (int x = 0; x < 9; x++) {
for (int y = 0; y < 10; y++) {
int chessman = chessboard[x][y];
if (chessman != 0) {
if (!isRedGo && isRed(chessman)) {
continue;
}
if (isRedGo && !isRed(chessman)) {
continue;
}
switch (chessman) {
case 7:
//<editor-fold defaultstate="collapsed" desc="Hong Jiang">
if (isValidMove(x, y, x, y + 1)) {
ret.add(new Motion(chessman, x, y, x, y + 1, 0));
}
if (isValidMove(x, y, x, y - 1)) {
ret.add(new Motion(chessman, x, y, x, y - 1, 0));
}
if (isValidMove(x, y, x - 1, y)) {
ret.add(new Motion(chessman, x, y, x - 1, y, 0));
}
if (isValidMove(x, y, x + 1, y)) {
ret.add(new Motion(chessman, x, y, x + 1, y, 0));
}
for (int oppJiangY = 7; oppJiangY < 10; oppJiangY++) {
if (isValidMove(x, y, x, oppJiangY)) {
ret.add(new Motion(chessman, x, y, x, oppJiangY, 0));
}
}
//</editor-fold>
break;
case 14:
//<editor-fold defaultstate="collapsed" desc="Hei Jiang">
if (isValidMove(x, y, x, y + 1)) {
ret.add(new Motion(chessman, x, y, x, y + 1, 0));
}
if (isValidMove(x, y, x, y - 1)) {
ret.add(new Motion(chessman, x, y, x, y - 1, 0));
}
if (isValidMove(x, y, x - 1, y)) {
ret.add(new Motion(chessman, x, y, x - 1, y, 0));
}
if (isValidMove(x, y, x + 1, y)) {
ret.add(new Motion(chessman, x, y, x + 1, y, 0));
}
for (int oppJiangY = 0; oppJiangY < 3; oppJiangY++) {
if (isValidMove(x, y, x, oppJiangY)) {
ret.add(new Motion(chessman, x, y, x, oppJiangY, 04));
}
}
//</editor-fold>
break;
case 6:
case 13:
//<editor-fold defaultstate="collapsed" desc="Shi">
if (isValidMove(x, y, x - 1, y + 1)) {
ret.add(new Motion(chessman, x, y, x - 1, y + 1, 1));
}
if (isValidMove(x, y, x - 1, y - 1)) {
ret.add(new Motion(chessman, x, y, x - 1, y - 1, 1));
}
if (isValidMove(x, y, x + 1, y + 1)) {
ret.add(new Motion(chessman, x, y, x + 1, y + 1, 1));
}
if (isValidMove(x, y, x + 1, y - 1)) {
ret.add(new Motion(chessman, x, y, x + 1, y - 1, 1));
}
//</editor-fold>
break;
case 5:
case 12:
//<editor-fold defaultstate="collapsed" desc="Xiang">
if (isValidMove(x, y, x - 2, y + 2)) {
ret.add(new Motion(chessman, x, y, x - 2, y + 2, 1));
}
if (isValidMove(x, y, x - 2, y - 2)) {
ret.add(new Motion(chessman, x, y, x - 2, y - 2, 1));
}
if (isValidMove(x, y, x + 2, y + 2)) {
ret.add(new Motion(chessman, x, y, x + 2, y + 2, 1));
}
if (isValidMove(x, y, x + 2, y - 2)) {
ret.add(new Motion(chessman, x, y, x + 2, y - 2, 1));
}
//</editor-fold>
break;
case 2:
case 9:
//<editor-fold defaultstate="collapsed" desc="Ma">
if (isValidMove(x, y, x - 1, y + 2)) {
ret.add(new Motion(chessman, x, y, x - 1, y + 2, 3));
}
if (isValidMove(x, y, x - 1, y - 2)) {
ret.add(new Motion(chessman, x, y, x - 1, y - 2, 3));
}
if (isValidMove(x, y, x - 2, y + 1)) {
ret.add(new Motion(chessman, x, y, x - 2, y + 1, 3));
}
if (isValidMove(x, y, x - 2, y - 1)) {
ret.add(new Motion(chessman, x, y, x - 2, y - 1, 3));
}
if (isValidMove(x, y, x + 1, y + 2)) {
ret.add(new Motion(chessman, x, y, x + 1, y + 2, 3));
}
if (isValidMove(x, y, x + 1, y - 2)) {
ret.add(new Motion(chessman, x, y, x + 1, y - 2, 3));
}
if (isValidMove(x, y, x + 2, y + 1)) {
ret.add(new Motion(chessman, x, y, x + 2, y + 1, 3));
}
if (isValidMove(x, y, x + 2, y - 1)) {
ret.add(new Motion(chessman, x, y, x + 2, y - 1, 3));
}
//</editor-fold>
break;
case 1:
case 8:
//<editor-fold defaultstate="collapsed" desc="Che">
// up
for (int i = y + 1; i < 10; i++) {
if (isValidMove(x, y, x, i)) {
ret.add(new Motion(chessman, x, y, x, i, -4));
} else {
// one chessman block its ways
break;
}
}
// down
for (int i = y - 1; i > -1; i--) {
if (isValidMove(x, y, x, i)) {
ret.add(new Motion(chessman, x, y, x, i, -4));
} else {
// one chessman block its ways
break;
}
}
// left
for (int j = x - 1; j > -1; j--) {
if (isValidMove(x, y, j, y)) {
ret.add(new Motion(chessman, x, y, j, y, -4));
} else {
// one chessman block its ways
break;
}
}
// right
for (int j = x + 1; j < 9; j++) {
if (isValidMove(x, y, j, y)) {
ret.add(new Motion(chessman, x, y, j, y, -4));
} else {
// one chessman block its ways
break;
}
}
//</editor-fold>
break;
case 3:
case 10:
//<editor-fold defaultstate="collapsed" desc="Pao">
// up
for (int i = y + 1; i < 10; i++) {
if (isValidMove(x, y, x, i)) {
ret.add(new Motion(chessman, x, y, x, i, 3));
}
}
// down
for (int i = y - 1; i > -1; i--) {
if (isValidMove(x, y, x, i)) {
ret.add(new Motion(chessman, x, y, x, i, 3));
}
}
// left
for (int j = x - 1; j > -1; j--) {
if (isValidMove(x, y, j, y)) {
ret.add(new Motion(chessman, x, y, j, y, 3));
}
}
// right
for (int j = x + 1; j < 9; j++) {
if (isValidMove(x, y, j, y)) {
ret.add(new Motion(chessman, x, y, j, y, 3));
}
}
//</editor-fold>
break;
case 4:
case 11:
//<editor-fold defaultstate="collapsed" desc="Bing">
if (isRed(chessman)) {
if (isValidMove(x, y, x, y + 1)) {
// I can see one point at my front
ret.add(new Motion(chessman, x, y, x, y + 1, 2));
}
if (y >= 5) {
// passed the "He Jie", I can see the point at
// my left and right
if (isValidMove(x, y, x - 1, y)) {
ret.add(new Motion(chessman, x, y, x - 1, y, 2));
}
if (isValidMove(x, y, x + 1, y)) {
ret.add(new Motion(chessman, x, y, x + 1, y, 2));
}
}
} else {
if (isValidMove(x, y, x, y - 1)) {
// I can see one point at my front
ret.add(new Motion(chessman, x, y, x, y - 1, 2));
}
if (y <= 4) {
// passed the "He Jie", I can see the point at
// my left and right
if (isValidMove(x, y, x - 1, y)) {
ret.add(new Motion(chessman, x, y, x - 1, y, 2));
}
if (isValidMove(x, y, x + 1, y)) {
ret.add(new Motion(chessman, x, y, x + 1, y, 2));
}
}
}
//</editor-fold>
break;
}
}
}
}
// alpha-beta or its variations are all move-ordering related!
Collections.sort(ret);
return ret.isEmpty() ? null : ret;
}
可以把代码贴到带Javadoc查看的IDE里看一下,那样比较清晰 : )