Java中国象棋博弈程序探秘之生成有效着法
百度广告
着法生成就是要产生所有有效的着法,让电脑棋手在这些着法中选择最好的着法,最后走出这一着。要生成所有着法只能用穷举了。中国象棋大约每一步可以有45个着法选择。下面是代码
view plaincopy to clipboardprint?
/**
* Generates all valid motions.
* @return all valid motion list, if no motion could be generated,
* returns null
* @see cn.edu.ynu.sei.chinesechess.common.Motion
*/
@SuppressWarnings("unchecked")
final public List generatePossibleMoves() {
List ret = new ArrayList();
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:
//
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));
}
}
//
break;
case 14:
//
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));
}
}
//
break;
case 6:
case 13:
//
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));
}
//
break;
case 5:
case 12:
//
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));
}
//
break;
case 2:
case 9:
//
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));
}
//
break;
case 1:
case 8:
//
// 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;
}
}
//
break;
case 3:
case 10:
//
// 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));
}
}
//
break;
case 4:
case 11:
//
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
编辑推荐:
温馨提示:因考试政策、内容不断变化与调整,长理培训网站提供的以上信息仅供参考,如有异议,请考生以权威部门公布的内容为准! (责任编辑:长理培训)
-
国家电网30270试题
-
湖南中烟7463试题
-
湖南统招专升本不连网,流畅做题
-
长沙理工大学考研培训4532试题
已有 22658 名学员学习以下课程通过考试
精品课程
更多- 电网书籍
- 财会书籍
- 其它工学书籍
- 电气拼团课程
- 财会拼团课程
- 其它工学拼团
-
- 长理培训微信公众号
- 每日推送精彩考试资讯
长按二维码识别
微信搜索“ 长理培训”
-
- 加入QQ群一起来考国网!
- QQ群号:223940140
点击进入
长理培训客户端 资讯,试题,视频一手掌握
去 App Store 免费下载 iOS 客户端
点击加载更多评论>>