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

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

生成有效着法

转载请保留作者信息:

作者:88250

Blog:http:/blog.csdn.net/DL88250

MSN & Gmail & QQ:[email protected]

着法生成就是要产生所有有效的着法,让电脑棋手在这些着法中选择最好的着法,最后走出这一着。要生成所有着法只能用穷举了。中国象棋大约每一步可以有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里看一下,那样比较清晰 : )

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/2088797.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-07-22
下一篇 2022-07-22

发表评论

登录后才能评论

评论列表(0条)

保存