Java中國象棋博弈程式探秘[4]——產生有效著法

來源:互聯網
上載者:User
產生有效著法

轉載請保留作者資訊:

作者: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裡看一下,那樣比較清晰 : )

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.