Java中国象棋博弈程序探秘[4]——生成有效着法

来源:互联网 发布:vx网络上什么意思 编辑:程序博客网 时间:2024/05/01 09:24

生成有效着法

转载请保留作者信息:

作者:88250

Bloghttp:/blog.csdn.net/DL88250

MSN & Gmail & QQDL88250@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里看一下,那样比较清晰 : )

原创粉丝点击