namespace Memory.Logic { public class Game(IScoreHandler scoreHandler, string player, int deckSize) { public const int MAXPOINTS = 100; public const int MINPOINTS = 10; public const int MAXTIME = 10000; public const int STARTSCORE = 100; public int DeckSize { get; } = deckSize; public int GridSize { get; } = GetGridSize(deckSize).Rows; public List Cards { get; } = CreateDeck(deckSize); public IScoreHandler ScoreHandler { get; } = scoreHandler; public long StartTime { get; } = DateTimeOffset.Now.ToUnixTimeMilliseconds(); public int Attempts { get; set; } = 0; public Score Scoring { get; } = new(player, 0); public void CalculateScore(long endTime) { Scoring.Points = (int)(Math.Pow(DeckSize * 2, 2) / ((endTime - StartTime) / 1000.0 * Attempts) * 1000.0); } public static Deck GetGridSize(int deckSize) { for (int i = (int)Math.Sqrt(deckSize * 2); i > 0; i--) { if (deckSize * 2 % i == 0) { return new(i, deckSize * 2 / i); } } return new(1, deckSize * 2); } public static List CreateDeck(int pairs) { List cards = []; for (int i = 1; i < pairs + 1; i++) { cards.Add(new(i)); cards.Add(new(i)); } Random random = new(); return [..cards.OrderBy(card => random.Next())]; } public Card? GetChoice1() { return Cards.FirstOrDefault(card => card.IsChoice1); } public Card? GetChoice2() { return Cards.FirstOrDefault(card => card.IsChoice2); } public bool IsFinished() { return Cards.All(card => card.Completed); } public void ClickCard(Card card) { Card? choice1 = GetChoice1(); Card? choice2 = GetChoice2(); if (!card.Completed) { if ((choice1 == null && choice2 == null) || (choice1 != null && choice2 != null)) { if (choice1 != null) { choice1.IsChoice1 = false; } if (choice2 != null) { choice2.IsChoice2 = false; } card.IsChoice1 = true; } else if (choice1 != null && choice2 == null && choice1 != card) { card.IsChoice2 = true; Attempts++; if (choice1.Matches(card)) { choice1.Completed = true; card.Completed = true; if (IsFinished()) { CalculateScore(DateTimeOffset.Now.ToUnixTimeMilliseconds()); ScoreHandler.WriteScore(Scoring); } } } } } } }