Java中国象棋博弈程序探秘[4]——生成有效着法
来源:互联网 发布:vx网络上什么意思 编辑:程序博客网 时间:2024/05/01 09:24
生成有效着法
转载请保留作者信息:
作者: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里看一下,那样比较清晰 : )
- Java中国象棋博弈程序探秘[4]——生成有效着法
- Java中国象棋博弈程序探秘[3]——着法合法性判断
- Java中国象棋博弈程序探秘[5]——搜索算法
- Java中国象棋博弈程序探秘[1]——博弈程序开发概述
- Java中国象棋博弈程序探秘[2]——棋盘的表示
- Java中国象棋博弈程序探秘[6]——游戏与界面
- 中国象棋的人机博弈程序
- 中国象棋的人机博弈程序
- 中国象棋博弈程序研究与实现
- Java实践(十二)——中国象棋
- 中国象棋软件-引擎实现(三)着法生成
- Android新技术——探秘微信小程序
- 中国象棋程序
- 中国象棋博弈α-β算法
- elf 文件格式探秘——程序运行背后的故事
- Qt creator 生成的GUI程序运作机理探秘
- JAVA中用程序绘制国际象棋与中国象棋棋盘
- java学习—探秘Java中的String、StringBuilder以及StringBuffer
- Fedora一些基本的命令及技巧汇总
- Asp.net 备份、还原Ms SQLServer及压缩Access数据库
- 股票心得 1
- Asp.net(C#)对文件操作的方法(读取,删除,批量拷贝,删除...)
- TPL + Json + PHP = ?
- Java中国象棋博弈程序探秘[4]——生成有效着法
- Eclipse与tomcat6实现远程调试
- 就要搜 万能搜索
- Java中国象棋博弈程序探秘[5]——搜索算法
- 怎么来培养自己的OO思想
- MTIR网站多线程实时重载技术
- 序列化和反序列化
- ASP.NET2.0中给GridView动态添加模板列并自动绑定数据
- 报org.apache.jasper.servlet.JspServlet类找不到的问题