code: def play_move(self, c):
          
          if not self.two_player_mode:
              self.searches_pi.append(self.root.children_as_pi(
                  self.root.position.n < self.temp_threshold))
          self.comments.append(self.root.describe())
          try:
              self.root = self.root.maybe_add_child(coords.to_flat(c))
          except go.IllegalMove:
              dbg("Illegal move")
              if not self.two_player_mode:
                  self.searches_pi.pop()
              self.comments.pop()
              raise
  
          self.position = self.root.position  # for showboard
          del self.root.parent.children
          return True
docs: Notable side effects:
            - finalizes the probability distribution according to
            this roots visit counts into the class' running tally, `searches_pi`
            - Makes the node associated with this move the root, for future
              `inject_noise` calls.