Untitled

mail@pastecode.io avatar
unknown
plain_text
6 months ago
2.2 kB
1
Indexable
Never
class PlayerDataStorage : IPlayerDataStorage
{
    private static PlayerDataStorage instance;
    private static readonly object lockObject = new object();

    private readonly string filePath;

    private PlayerDataStorage(string path)
    {
        filePath = path;
    }

    public static PlayerDataStorage Instance
    {
        get
        {
            lock (lockObject)
            {
                if (instance == null)
                {
                    instance = new PlayerDataStorage("result.txt");
                }
                return instance;
            }
        }
    }

    public void Write(string name, int guesses)
    {
        lock (lockObject)
        {
            using (StreamWriter output = new StreamWriter(filePath, append: true))
            {
                output.WriteLine(name + "#&#" + guesses);
            }
        }
    }

    public void ShowTopList()
    {
        lock (lockObject)
        {
            using (StreamReader input = new StreamReader(filePath))
            {
                List<IPlayerData> results = new List<IPlayerData>();
                string line;
                while ((line = input.ReadLine()) != null)
                {
                    string[] nameAndScore = line.Split(new string[] { "#&#" }, StringSplitOptions.None);
                    string name = nameAndScore[0];
                    int guesses = Convert.ToInt32(nameAndScore[1]);
                    IPlayerData pd = new PlayerData(name, guesses);
                    int pos = results.IndexOf(pd);
                    if (pos < 0)
                    {
                        results.Add(pd);
                    }
                    else
                    {
                        results[pos].Update(guesses);
                    }
                }
                results.Sort((p1, p2) => p1.Average().CompareTo(p2.Average()));
                Console.WriteLine("Player   Games  Average");
                foreach (IPlayerData p in results)
                {
                    Console.WriteLine(string.Format("{0,-9}{1,5:D}{2,9:F2}", p.Name, p.NGames, p.Average()));
                }
            }
        }
    }
}