docs: def play(network):
      """Plays out a self-play match, returning a MCTSPlayer object containing:
          - the final position
          - the n x 362 tensor of floats representing the mcts search probabilities
          - the n-ary tensor of floats representing the original value-net estimate
            where n is the number of moves in the game
      """
      readouts = FLAGS.num_readouts  # defined in strategies.py
      # Disable resign in 5% of games
      if random.random() < FLAGS.resign_disable_pct:
          resign_threshold = -1.0
      else:
          resign_threshold = None
  
      player = MCTSPlayer(network, resign_threshold=resign_threshold)
  
      player.initialize_game()
  
      # Must run this once at the start to expand the root node.
      first_node = player.root.select_leaf()
      prob, val = network.run(first_node.position)
      first_node.incorporate_results(prob, val, first_node)
  
      while True:
          start = time.time()
          player.root.inject_noise()
          current_readouts = player.root.N
          # we want to do "X additional readouts", rather than "up to X readouts".
          while player.root.N < current_readouts + readouts:
              player.tree_search()
  
          if FLAGS.verbose >= 3:
              print(player.root.position)
              print(player.root.describe())
  
          if player.should_resign():
              player.set_result(-1 * player.root.position.to_play,
                                was_resign=True)
              break
          move = player.pick_move()
          player.play_move(move)
          if player.root.is_done():
              player.set_result(player.root.position.result(), was_resign=False)
              break
  
          if (FLAGS.verbose >= 2) or (FLAGS.verbose >= 1 and player.root.position.n % 10 == 9):
              print("Q: {:.5f}".format(player.root.Q))
              dur = time.time() - start
              print("%d: %d readouts, %.3f s/100. (%.2f sec)" % (
                  player.root.position.n, readouts, dur / readouts * 100.0, dur), flush=True)
          if FLAGS.verbose >= 3:
              print("Played >>",
                    coords.to_gtp(coords.from_flat(player.root.fmove)))
  
      if FLAGS.verbose >= 2:
          utils.dbg("%s: %.3f" % (player.result_string, player.root.Q))
          utils.dbg(player.root.position, player.root.position.score())
  
      return player