转载请保留作者信息:
作者: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里看一下,那样比较清晰 : )
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)