bool ProofUtil::ShrinkProof(bitset_t& proof, const StoneBoard& board, 
                            HexColor loser, const ICEngine& ice)
{
    StoneBoard brd(board.Width(), board.Height());
    PatternState pastate(brd);
    Groups groups;

    // Give loser all cells outside proof
    bitset_t cells_outside_proof = (~proof & brd.Const().GetCells());
    brd.AddColor(loser, cells_outside_proof);

    // Give winner only his stones inside proof; 
    HexColor winner = !loser;
    brd.AddColor(winner, board.GetPlayed(winner) & proof);
    pastate.Update();
    GroupBuilder::Build(brd, groups);

    // Compute fillin and remove captured cells from the proof
    InferiorCells inf;
    ice.ComputeFillin(loser, groups, pastate, inf, 
                      HexColorSetUtil::Only(loser));
    HexAssert(inf.Captured(winner).none());

    bitset_t filled = inf.Dead() | inf.Captured(loser);
    bitset_t shrunk_proof = proof - filled;
    bool shrunkTheProof = shrunk_proof.count() < proof.count();
    proof = shrunk_proof;
    return shrunkTheProof;
}
void GroupBuilder::Build(const StoneBoard& brd, Groups& groups)
{
    bitset_t visited;
    groups.m_brd = const_cast<StoneBoard*>(&brd);
    groups.m_groups.clear();
    groups.m_group_index.resize(FIRST_INVALID);
    for (BoardIterator p(brd.Const().EdgesAndInterior()); p; ++p)
    {
        if (visited.test(*p))
            continue;
        bitset_t nbs, members;
        HexColor color = brd.GetColor(*p);
        Flow(brd, *p, color, members, nbs);
        HexAssert((visited & members).none());
        visited |= members;
        for (BitsetIterator m(members); m; ++m)
            groups.m_group_index[*m] = groups.m_groups.size();
        groups.m_groups.push_back(Group(&groups, color, *p, members, nbs));
    }
    for (std::size_t i = 0; i < groups.m_groups.size(); ++i)
    {
        Group& g = groups.m_groups[i];
        g.m_nbs = groups.CaptainizeBitset(g.m_nbs);
        for (BitsetIterator p(g.m_nbs); p; ++p)
            g.m_nbs_index.push_back(groups.m_group_index[*p]);
    }
}
bool GameUtil::SequenceFromPosition(const Game& game, const StoneBoard& pos, 
                                    MoveSequence& seq)
{
    if (game.Board().Const() != pos.Const())
        return false;
    StoneBoard cur(pos);
    cur.StartNewGame();
    if (cur == pos)
    {
        seq = game.History();
        return true;
    }
    const MoveSequence& history = game.History();
    for (MoveSequence::const_iterator it = history.begin(); 
         it != history.end(); ++it)
    {    
        const Move& move = *it;
        cur.PlayMove(move.Color(), move.Point());
        if (cur == pos)
        {
            LogInfo() << "Position matched!\n";
            seq.assign(++it, history.end());
            return true;
        }
    }
    return false;
}
/** Selects random move among the empty cells on the board. */
HexPoint MoHexPlayoutPolicy::GenerateRandomMove(const StoneBoard& brd)
{
    HexPoint ret = INVALID_POINT;
    while (true) 
    {
	BenzeneAssert(!m_moves.empty());
        ret = m_moves.back();
        m_moves.pop_back();
        if (brd.IsEmpty(ret))
            break;
    }
    return ret;
}
HexPoint MoHexPlayoutPolicy::GenerateResponseMove(HexColor toPlay, 
                                                  HexPoint lastMove,
                                                  const StoneBoard& brd)
{
    std::size_t num = m_response[toPlay][lastMove].size();
    if (num > m_shared->Config().responseThreshold)
    {
        HexPoint move = m_response[toPlay][lastMove][m_random.Int(num)];
        if (brd.IsEmpty(move))
            return move;
    }
    return INVALID_POINT;
}
void MoHexPlayoutPolicy::InitializeForPlayout(const StoneBoard& brd)
{
    m_weights[0].Clear();
    m_weights[1].Clear();
    for (BitsetIterator it(brd.GetEmpty()); it; ++it)
    {
        m_weights[0][*it] = 
            m_globalPatterns.GammaFromKeysBoth(m_board.Keys(*it), BLACK);
        m_weights[1][*it] = 
            m_globalPatterns.GammaFromKeysBoth(m_board.Keys(*it), WHITE);
    }
    m_weights[0].Build();
    m_weights[1].Build();
}
Exemplo n.º 7
0
void YSgUtil::SetPositionInNode(SgNode* node, const StoneBoard& brd, 
                                  HexColor color)
{
    int height = brd.Height();
    SgVector<SgPoint> blist = YSgUtil::BitsetToSgVector(brd.GetBlack() 
                                       & brd.Const().GetCells(), height);
    SgVector<SgPoint> wlist = YSgUtil::BitsetToSgVector(brd.GetWhite()
                                       & brd.Const().GetCells(), height);
    SgVector<SgPoint> elist = YSgUtil::BitsetToSgVector(brd.GetEmpty()
                                       & brd.Const().GetCells(), height);
    SgPropPlayer* pprop = new SgPropPlayer(SG_PROP_PLAYER);
    SgPropAddStone* bprop = new SgPropAddStone(SG_PROP_ADD_BLACK);
    SgPropAddStone* wprop = new SgPropAddStone(SG_PROP_ADD_WHITE);
    SgPropAddStone* eprop = new SgPropAddStone(SG_PROP_ADD_EMPTY);
    pprop->SetValue(YSgUtil::HexColorToSgColor(color));    
    bprop->SetValue(blist);
    wprop->SetValue(wlist);
    eprop->SetValue(elist);
    node->Add(pprop);
    node->Add(bprop);
    node->Add(wprop);
    node->Add(eprop);
}
void MoHexPlayoutPolicy::InitializeForPlayout(const StoneBoard& brd)
{
    BitsetUtil::BitsetToVector(brd.GetEmpty(), m_moves);
    ShuffleVector(m_moves, m_random);
}
inline HexUctStoneData::HexUctStoneData(const StoneBoard& brd)
    : black(brd.GetBlack()),
      white(brd.GetWhite()),
      played(brd.GetPlayed())
{
}
inline void HexState::UndoMove(HexPoint move)
{
    m_brd.UndoMove(move);
    FlipColorToPlay();
}
inline void HexState::PlayMove(HexPoint move)
{
    m_brd.PlayMove(m_toPlay, move);
    FlipColorToPlay();
}
inline SgHashCode HexState::Hash() const
{
    return m_brd.Hash(m_toPlay);
}
inline HexState::HexState(unsigned size)
    : m_brd(size),
      m_toPlay(m_brd.WhoseTurn())
{
}