zoukankan      html  css  js  c++  java
  • Java中国象棋博弈程序探秘[4]——生成有效着法

    生成有效着法

    转载请保留作者信息:

    作者: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里看一下,那样比较清晰 : )

  • 相关阅读:
    vue element-ui配置第三方图标库
    HTTP协议:状态码
    HTTP协议:无状态
    CDN:基础知识
    【转载】浅析机器视觉中的照明系统(该如何打光)
    nginx 端口转发
    Gitlab 备份 | 恢复 | 卸载 | 迁移 | 版本升级
    微信小程序支付服务端.net core实现,简单直接
    生产级gitlab备份
    背锅之旅:前任对我的爱-只备份不删除导致的磁盘爆满
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6470219.html
Copyright © 2011-2022 走看看