象棋人工智能算法的C++实现(二)

论坛 期权论坛 期权     
程序人生   2019-6-10 03:02   2240   0
点击上方“程序人生”,选择“置顶公众号”
第一时间关注程序猿(媛)身边的故事



作者
De掉所有bug
已获原作者授权,如需转载,请联系原作者。


前言:在看完上一期《象棋人工智能算法的C++实现(一)》后,是不是对这个项目感到有点小兴奋呢?但是我首先要声明的是,这并不是最前沿的人工智能,所用的算法或许不是最快速的,只是闲的没事做着玩的一个小项目。欢迎各位攻城狮、各位行业大牛的讨论、批评与指正。

有了上一期的铺垫,本期就可以实现诸如马走日、象走田等各种棋子的走棋算法了。为了方便后期人工智能算法的实现,我们写一个总的canMove函数,在这个总的canMove函数里调用各种类型棋子的canMove函数来判断各种棋子选择的路径能不能走得通。

总的canMove函数的源代码:
  1. 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
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:240
帖子:48
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP