SgPointSet SpUtil::GetRelevantMoves(GoBoard& bd, SgBlackWhite toPlay, bool useFilter) { SgPointSet legal; for (SgSetIterator it(bd.AllEmpty()); it; ++it) if (bd.IsLegal(*it)) legal.Include(*it); if (! useFilter) return legal; GoSafetySolver safetySolver(bd); SgBWSet safe; safetySolver.FindSafePoints(&safe); SgBlackWhite opp = SgOppBW(toPlay); SgPointSet moves; const GoRules& rules = bd.Rules(); const bool captureDead = rules.CaptureDead(); //const bool japaneseScoring = rules.JapaneseScoring(); for (SgSetIterator it(legal); it; ++it) { SgPoint p = *it; const bool isSafe = safe[toPlay].Contains(p); const bool isSafeOpp = safe[opp].Contains(p); const bool hasOppNeighbors = bd.HasNeighbors(p, opp); if ( (! isSafe && ! isSafeOpp) || (isSafe && captureDead && hasOppNeighbors) // || (isSafeOpp && ! japaneseScoring) ) moves.Include(p); } return moves; }
GoPlayer::GoPlayer(const GoBoard& bd) : GoBoardSynchronizer(bd), m_currentNode(0), m_bd(bd.Size(), GoSetup(), bd.Rules()), m_variant(0) { SetSubscriber(m_bd); ClearSearchTraces(); }
void GoBoardHistory::SetFromBoard(const GoBoard& bd) { m_boardSize = bd.Size(); m_rules = bd.Rules(); m_setup = bd.Setup(); m_moves.Clear(); for (int i = 0; i < bd.MoveNumber(); ++i) m_moves.PushBack(bd.Move(i)); m_toPlay = bd.ToPlay(); }