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

生成有效着法

转载请保留作者信息:

作者:88250

MSN & Gmail & QQ:DL88250@gmail.com

着法生成就是要产生所有有效的着法,让电脑棋手在这些着法中选择最好的着法,最后走出这一着。要生成所有着法只能用穷举了。中国象棋大约每一步可以有45个着法选择。下面是代码:

/**

* 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 <= 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));

}

}

}

//

break;

}

}

}

}

// alpha-beta or its variations are all move-ordering related!

Collections.sort(ret);

return ret.isEmpty() ? null : ret;

}

可以把代码贴到带Javadoc查看的IDE里看一下,那样比较清晰 : )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值