in csrc/HanabiServer.cc [591:640]
void Server::pleaseGiveValueHint(int to, Value value)
{
assert(0 <= activePlayer_ && activePlayer_ < hands_.size());
assert(players_.size() == hands_.size());
HANABI_SERVER_ASSERT(movesFromActivePlayer_ < 1, "bot attempted to move twice");
HANABI_SERVER_ASSERT(movesFromActivePlayer_ == 0, "called pleaseGiveValueHint() from the wrong observer");
HANABI_SERVER_ASSERT(0 <= to && to < hands_.size(), "invalid player index");
HANABI_SERVER_ASSERT(1 <= value && value <= 5, "invalid value");
HANABI_SERVER_ASSERT(hintStonesRemaining_ != 0, "no hint stones remaining");
HANABI_SERVER_ASSERT(to != activePlayer_, "cannot give hint to oneself");
CardIndices card_indices;
for (int i=0; i < hands_[to].size(); ++i) {
if (hands_[to][i].value == value) {
card_indices.add(i);
}
}
#ifndef HANABI_ALLOW_EMPTY_HINTS
HANABI_SERVER_ASSERT(!card_indices.empty(), "hint must include at least one card");
#endif
if (log_) {
const bool singular = (card_indices.size() == 1);
(*log_) << "Player " << activePlayer_
<< " told player " << to
<< " that ";
if (card_indices.empty()) {
(*log_) << "none of his cards were ";
} else if (card_indices.size() == hands_[to].size()) {
(*log_) << "his whole hand was ";
} else {
(*log_) << "his " << nth(card_indices, hands_[to].size())
<< (singular ? " card was " : " cards were ");
}
(*log_) << value
<< (singular ? ".\n" : "s.\n");
}
/* Notify all the players of the given hint. */
movesFromActivePlayer_ = -1;
int oldObservingPlayer = observingPlayer_;
for (int i=0; i < players_.size(); ++i) {
observingPlayer_ = i;
players_[i]->pleaseObserveValueHint(*this, activePlayer_, to, value, card_indices);
}
observingPlayer_ = oldObservingPlayer;
hintStonesRemaining_ -= 1;
movesFromActivePlayer_ = 1;
}