点击上方“程序人生”,选择“置顶公众号”
第一时间关注程序猿(媛)身边的故事
作者
De掉所有bug
已获原作者授权,如需转载,请联系原作者。
前言:在看完上一期象棋人工智能算法的C++实现(一)后,是不是对这个项目感到有点小兴奋呢?但是我首先要声明的是,这并不是最前沿的人工智能,所用的算法或许不是最快速的,只是闲的没事做着玩的一个小项目。欢迎各位攻城狮、各位行业大牛的讨论、批评与指正。
有了上一期的铺垫,本期就可以实现诸如马走日、象走田等各种棋子的走棋算法了。为了方便后期人工智能算法的实现,我们写一个总的canMove函数,在这个总的canMove函数里调用各种类型棋子的canMove函数来判断各种棋子选择的路径能不能走得通。
总的canMove函数的源代码:
bool Board::canMove(int moveid, int killid, int row, int col)
{
if(killid==-1||!sameColor(moveid,killid))
{
switch(_s[moveid]._type)
{
case Stone::JIANG:
return canMoveJIANG(moveid,row,col,killid);
break;
case Stone::SHI:
return canMoveSHI(moveid,row,col,killid);
break;
case Stone::XIANG:
return canMoveXIANG(moveid,row,col,killid);
break;
case Stone::CHE:
return canMoveCHE(moveid,row,col,killid);
break;
case Stone::MA:
return canMoveMA(moveid,row,col,killid);
break;
case Stone::PAO:
return canMovePAO(moveid,row,col,killid);
break;
case Stone::BING:
return canMoveBING(moveid,row,col,killid);
break;
default: break;
}
}
//move的棋子和kill的棋子是相同颜色的
if(sameColor(moveid,killid))
{
/*换选择*/
_selectid=killid;
update();
return false;
}
return true;
}
本期博客主要介绍相对简单的士、兵、相、马的走棋算法。
1.士的走棋算法
士的走棋规则:只能在米字格(大本营)内行走,且一次只能沿着对角线斜着走一步。