点击上方“程序人生”,选择“置顶公众号”
第一时间关注程序猿(媛)身边的故事
作者
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.士的走棋算法
士的走棋规则:只能在米字格(大本营)内行走,且一次只能沿着对角线斜着走一步。
上canMoveSHI函数的源代码:
[code]bool Board::canMoveSHI(int moveid,int row,int col,int killid){ if(_s[moveid]._red) { //判断红方士的纵向行走是否超出米字格范围 if(row>2) return false; } else { //判断黑方士的纵向行走是否超出米字格范围 if(row=3&&_s[moveid]._row=5&&_s[moveid]._row4) return false; } else { if(row |
|