When an opponent draws a bird from the tray, this information should be included in the representation of the opponent's hand.
It can't be known that the card is in the player's hand, as they can discard it at any time after drawing.
This could be a history of drawn cards that grows as they draw, i.e. frozenset({bird0: (int, int), bird1, ..., bird_n})
To reconstruct a plausible hand for simulation, a hand of known size, e.g. 4 would be constructed from cards not yet seen in the deck and cards known to be drawn from the tray by drawing at random from the pool of unseen discarded cards and cards seen to be drawn from the tray.
This isn't required to get MCTS working, and so should be a later enhancement.
When an opponent draws a bird from the tray, this information should be included in the representation of the opponent's hand.
frozenset({bird0: (int, int), bird1, ..., bird_n})
This isn't required to get MCTS working, and so should be a later enhancement.