bool Board::canMoveJiang(int moveid, int killid, int row, int col) { // 可直接吃对方将 if (killid != -1 && _s[killid]._type == Stone::JIANG) { return canMoveChe(moveid, killid, row, col); } GetRowCol(row1, col1, moveid); int r = relation(row1, col1, row, col); if (r != 1 || r != 10) { return false; } if (col < 3 || col > 5) { return false; } if (isBottomSide(moveid)) { if (row < 7) { return false; } } else { if (row > 2) { return false; } } return true; }
bool SceneGame::canMove(int moveid, int row, int col, int killid) { Chess* s =_c->at(moveid); switch (s->_type) { case Chess::CHE: return canMoveChe(moveid, row, col); case Chess::MA: return canMoveMa(moveid, row, col); case Chess::PAO: // 炮有两种走法,走直线(吃) 和 跳子(不吃) return canMovePao(moveid, row, col, killid); case Chess::BING: return canMoveBing(moveid, row, col); case Chess::JIANG: return canMoveJiang(moveid, row, col, killid); case Chess::SHI: return canMoveShi(moveid, row, col); case Chess::XIANG: return canMoveXiang(moveid, row, col); break; } return false; }
bool SceneGame::canMoveJiang(int moveid, int row, int col, int killid) { Chess *s = _c->at(moveid); //将照面 if (killid != -1) { Chess *kill = _c->at(killid); if (kill->_type == Chess::JIANG) { return canMoveChe(moveid, row, col); } } int dRow = abs(s->_row - row); int dCol = abs(s->_col - col); int d = dRow * 10 + dCol; if (d != 1 && d != 10 && d != 11) return false; if (col < 3 || col > 5) return false; #if IS_NET if (s->_red) #endif { if (row < 0 || row > 2) return false; if (d == 11) { bool crossline = (s->_col == 3 && (s->_row == 0 || s->_row == 2)) || ((s->_col == 5) && (s->_row == 0 || s->_row == 2)) || (s->_col == 4 && s->_row == 1); if (!crossline) { return false; } } } #if IS_NET else { if (row < 7 || row > 9) return false; if (d == 11) { bool crossline = (s->_col == 3 && (s->_row == 7 || s->_row == 9)) || ((s->_col == 5) && (s->_row == 7 || s->_row == 9)) || (s->_col == 4 && s->_row == 8); if (!crossline) { return false; } } } #endif return true; }
bool Board::canMove(int moveid, int killid, int row, int col) { // 如果moveid和killid颜色相同,则不能移动,还需要换选择 if (_s[moveid]._red == _s[killid]._red) { _selectid = killid; update(); return false; } switch (_s[moveid]._type) { case Stone::JIANG: return canMoveJiang(moveid, killid, row, col); case Stone::SHI: return canMoveShi(moveid, killid, row, col); case Stone::XIANG: return canMoveXiang(moveid, killid, row, col); case Stone::CHE: return canMoveChe(moveid, killid, row, col); case Stone::MA: return canMoveMa(moveid, killid, row, col); case Stone::PAO: return canMovePao(moveid, killid, row, col); case Stone::BING: return canMoveBing(moveid, killid, row, col); } return true; }