void Board::removeStone( Pos const& p ) { int idx = p.toIndex(); char data = getData( idx ); assert( data != eEmpty ); mData[ idx ] = eEmpty; for( int dir = 0 ; dir < NumDir ; ++dir ) { int idxCon = calcConIndex( idx , dir ); char dataCon = mData[ idxCon ]; if ( dataCon == EDGE_MARK || dataCon == eEmpty ) continue; if ( dataCon & VISITED_MARK ) continue; if ( dataCon != data ) { addRootLife( getLinkRoot( idxCon ) , 1 ); } else { relink( idxCon ); } } for( int dir = 0 ; dir < NumDir ; ++dir ) { int idxCon = calcConIndex( idx , dir ); if ( mData[ idxCon ] & VISITED_MARK ) removeVisitedMark_R( idxCon ); } }
int Board::fillStone( Pos const& p , DataType color ) { mColorR = color; assert( color != eEmpty ); int idx = p.toIndex(); return fillStone_R( idx ); }
bool Game::play( Pos const & pos ) { if ( mBoard.getData( pos ) != Board::eEmpty ) return false; mBoard.putStone( pos , mNextPlayColor ); unsigned bitDir = 0; int numCapture = captureStone( pos , bitDir ); if ( numCapture == 0 ) { if ( mBoard.getLife( pos ) == 0 ) { mBoard.removeStone( pos ); return false; } } else if ( numCapture == 1 ) { if ( pos.toIndex() == mIdxKoPos ) { Pos cPos = getFristConPos( pos , bitDir ); mBoard.fillStone( cPos , mNextPlayColor == Board::eBlack ? Board::eWhite : Board::eBlack ); mBoard.removeStone( pos ); return false; } } StepInfo info; info.bitCaptureDir = bitDir; info.idxPlay = pos.toIndex(); info.idxKO = mIdxKoPos; mStepVec.push_back( info ); if ( numCapture == 1 ) { Pos cPos = getFristConPos( pos , bitDir ); mIdxKoPos = cPos.toIndex(); } else { mIdxKoPos = -1; } ++mCurHand; if ( mNextPlayColor == Board::eBlack ) { mNumWhiteRemoved += numCapture; mNextPlayColor = Board::eWhite; } else { mNumBlackRemoved += numCapture; mNextPlayColor = Board::eBlack; } return true; }
int Board::captureStone( Pos const& p ) { mColorR = getData( p ); assert( mColorR != eEmpty ); return captureStone_R( p.toIndex() ); }