from math import sqrt
from random import randint
from typing import List, Tuple


def introduction() -> None:
    print(
        """The object of this game is to find 4 mugwumps
hidden on a 10*10 grid.  Homebase is position 0,0.
Any guess you make must be two numbers with each
number between 0 and 9 inclusive.  First number
is distance to right of homebase, and second number
is the distance above homebase."""
    )

    print(
        """You get 10 tries.  After each try, I will tell
you how far you are from each mugwump."""
    )


def generate_mugwumps(n: int = 4) -> List[List[int]]:
    mugwumps = []
    for _ in range(n):
        current = [randint(0, 9), randint(0, 9)]
        mugwumps.append(current)
    return mugwumps


def reveal_mugwumps(mugwumps: List[List[int]]) -> None:
    print("Sorry, that's 10 tries.  Here's where they're hiding.")
    for idx, mugwump in enumerate(mugwumps, 1):
        if mugwump[0] != -1:
            print(f"Mugwump {idx} is at {mugwump[0]},{mugwump[1]}")


def calculate_distance(guess: Tuple[int, int], mugwump: List[int]) -> float:
    d = sqrt(((mugwump[0] - guess[0]) ** 2) + ((mugwump[1] - guess[1]) ** 2))
    return d


def play_again() -> None:
    print("THAT WAS FUN! LET'S PLAY AGAIN.......")
    choice = input("Press Enter to play again, any other key then Enter to quit.")
    if choice == "":
        print("Four more mugwumps are now in hiding.")
    else:
        exit()


def play_round() -> None:
    mugwumps = generate_mugwumps()
    turns = 1
    score = 0
    while turns <= 10 and score != 4:
        m = -1
        while m == -1:
            try:
                m, n = map(int, input(f"Turn {turns} - what is your guess? ").split())
            except ValueError:
                m = -1
        for idx, mugwump in enumerate(mugwumps):
            if m == mugwump[0] and n == mugwump[1]:
                print(f"You found mugwump {idx + 1}")
                mugwumps[idx][0] = -1
                score += 1
            if mugwump[0] == -1:
                continue
            print(
                f"You are {calculate_distance((m, n), mugwump):.1f} units from mugwump {idx + 1}"
            )
        turns += 1
    if score == 4:
        print(f"Well done! You got them all in {turns} turns.")
    else:
        reveal_mugwumps(mugwumps)


if __name__ == "__main__":
    introduction()
    while True:
        play_round()
        play_again()
