知识大全 Java中国象棋博弈程序探秘之生成有效着法
Posted 知
篇首语:缥帙各舒散,前后互相逾。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java中国象棋博弈程序探秘之生成有效着法相关的知识,希望对你有一定的参考价值。
Java中国象棋博弈程序探秘之生成有效着法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
着法生成就是要产生所有有效的着法 让电脑棋手在这些着法中选择最好的着法 最后走出这一著 要生成所有着法只能用穷举了 中国象棋大约每一步可以有 个着法选择 下面是代码
view plaincopy to clipboardprint? <PRE class=java name= code > /**
* Generates all valid motions
* @return all valid motion list if no motion could be generated
* returns <code>null</code>
* @see cn edu ynu mon Motion
*/
@SuppressWarnings( unchecked )
final public List<Motion> generatePossibleMoves()
List<Motion> ret = new ArrayList<Motion>();
for (int x = ; x < ; x++)
for (int y = ; y < ; y++)
int chessman = chessboard[x][y];
if (chessman != )
if (!isRedGo && isRed(chessman))
continue;
if (isRedGo && !isRed(chessman))
continue;
switch (chessman)
case :
//<editor fold defaultstate= collapsed desc= Hong Jiang >
if (isValidMove(x y x y + ))
ret add(new Motion(chessman x y x y + ));
if (isValidMove(x y x y ))
ret add(new Motion(chessman x y x y ));
if (isValidMove(x y x y))
ret add(new Motion(chessman x y x y ));
if (isValidMove(x y x + y))
ret add(new Motion(chessman x y x + y ));
for (int oppJiangY = ; oppJiangY < ; oppJiangY++)
if (isValidMove(x y x oppJiangY))
ret add(new Motion(chessman x y x oppJiangY ));
//</editor fold>
break;
case :
//<editor fold defaultstate= collapsed desc= Hei Jiang >
if (isValidMove(x y x y + ))
ret add(new Motion(chessman x y x y + ));
if (isValidMove(x y x y ))
ret add(new Motion(chessman x y x y ));
if (isValidMove(x y x y))
ret add(new Motion(chessman x y x y ));
if (isValidMove(x y x + y))
ret add(new Motion(chessman x y x + y ));
for (int oppJiangY = ; oppJiangY < ; oppJiangY++)
if (isValidMove(x y x oppJiangY))
ret add(new Motion(chessman x y x oppJiangY ));
//</editor fold>
break;
case :
case :
//<editor fold defaultstate= collapsed desc= Shi >
if (isValidMove(x y x y + ))
ret add(new Motion(chessman x y x y + ));
if (isValidMove(x y x y ))
ret add(new Motion(chessman x y x y ));
if (isValidMove(x y x + y + ))
ret add(new Motion(chessman x y x + y + ));
if (isValidMove(x y x + y ))
ret add(new Motion(chessman x y x + y ));
//</editor fold>
break;
case :
case :
//<editor fold defaultstate= collapsed desc= Xiang >
if (isValidMove(x y x y + ))
ret add(new Motion(chessman x y x y + ));
if (isValidMove(x y x y ))
ret add(new Motion(chessman x y x y ));
if (isValidMove(x y x + y + ))
ret add(new Motion(chessman x y x + y + ));
if (isValidMove(x y x + y ))
ret add(new Motion(chessman x y x + y ));
//</editor fold>
break;
case :
case :
//<editor fold defaultstate= collapsed desc= Ma >
if (isValidMove(x y x y + ))
ret add(new Motion(chessman x y x y + ));
if (isValidMove(x y x y ))
ret add(new Motion(chessman x y x y ));
if (isValidMove(x y x y + ))
ret add(new Motion(chessman x y x y + ));
if (isValidMove(x y x y ))
ret add(new Motion(chessman x y x y ));
if (isValidMove(x y x + y + ))
ret add(new Motion(chessman x y x + y + ));
if (isValidMove(x y x + y ))
ret add(new Motion(chessman x y x + y ));
if (isValidMove(x y x + y + ))
ret add(new Motion(chessman x y x + y + ));
if (isValidMove(x y x + y ))
ret add(new Motion(chessman x y x + y ));
//</editor fold>
break;
case :
case :
//<editor fold defaultstate= collapsed desc= Che >
// up
for (int i = y + ; i < ; i++)
if (isValidMove(x y x i))
ret add(new Motion(chessman x y x i ));
else
// one chessman block its ways
break;
// down
for (int i = y ; i > ; i )
if (isValidMove(x y x i))
ret add(new Motion(chessman x y x i ));
else
// one chessman block its ways
break;
// left
for (int j = x ; j > ; j )
if (isValidMove(x y j y))
ret add(new Motion(chessman x y j y ));
else
// one chessman block its ways
break;
// right
for (int j = x + ; j < ; j++)
if (isValidMove(x y j y))
ret add(new Motion(chessman x y j y ));
else
// one chessman block its ways
break;
//</editor fold>
break;
case :
case :
//<editor fold defaultstate= collapsed desc= Pao >
// up
for (int i = y + ; i < ; i++)
if (isValidMove(x y x i))
ret add(new Motion(chessman x y x i ));
// down
for (int i = y ; i > ; i )
if (isValidMove(x y x i))
ret add(new Motion(chessman x y x i ));
// left
for (int j = x ; j > ; j )
if (isValidMove(x y j y))
ret add(new Motion(chessman x y j y ));
// right
for (int j = x + ; j < ; j++)
if (isValidMove(x y j y))
ret add(new Motion(chessman x y j y ));
//</editor fold>
break;
case :
case :
//<editor fold defaultstate= collapsed desc= Bing >
if (isRed(chessman))
if (isValidMove(x y x y + ))
// I can see one point at my front
ret add(new Motion(chessman x y x y + ));
if (y >= )
// passed the He Jie I can see the point at
// my left and right
if (isValidMove(x y x y))
ret add(new Motion(chessman x y x y ));
if (isValidMove(x y x + y))
ret add(new Motion(chessman x y x + y ));
else
if (isValidMove(x y x y ))
// I can see one point at my front
ret add(new Motion(chessman x y x y ));
if (y <= )
// passed the He Jie I can see the point at
// my left and right
if (isValidMove(x y x y))
ret add(new Motion(chessman x y x y ));
if (isValidMove(x y x + y))
ret add(new Motion(chessman x y x + y ));
//</editor fold>
break;
// alpha beta or its variations are all move ordering related!
Collections sort(ret);
return ret isEmpty() ? null : ret;
</PRE> 转载请保留作者信息
作者
Blog
cha138/Article/program/Java/hx/201311/25876相关参考