using YatzyLibrary; namespace YatzyGame.Components { public class GameController { YatzyCheckers yatzyCheckers = new YatzyCheckers(); private Dictionary Players = new Dictionary(); public bool gameStarted = false; public int rerolls = 0; public Dictionary Dices = new Dictionary(); public List selectedDices = new List(); public Player currentPlayer; public string gameID; public bool onlineMultiplayer = false; public string joinCode = string.Empty; public GameController(string gameID, bool onlineMultiplayer, string joinCode) { this.gameID = gameID; this.onlineMultiplayer = onlineMultiplayer; this.joinCode = joinCode; } public void AddPlayer(string name) { Players.Add(name, new Player(name)); } public void AddPlayer(string name, string playerID, bool owner = false) { Players.Add(name, new Player(name, playerID, owner)); } public void RemovePlayer(string name) { Players.Remove(name); } public Player GetPlayer(string name) { return Players.FirstOrDefault(x => x.Key.Equals(name)).Value; } public List GetPlayers() { return Players.Select(x => x.Value).ToList(); } public Dictionary GetPlayerScores(string name) { return GetPlayer(name).scores; } public void SetOrUpdatePlayerScore(string name, ScoreLine type, int value) { var playerScores = GetPlayerScores(name); if (!playerScores.ContainsKey(type)) { playerScores.Add(type, value); } else { playerScores[type] = value; } } public void startGame() { this.gameStarted = true; StartTurn(GetPlayers().FirstOrDefault()); } public void stopGame() { this.gameStarted = false; // Players.Clear(); } public List ThrowMany(List dices) { var retval = new List(); foreach (var dice in dices) { retval.Add(dice.Throw()); } return retval; } public void StartTurn(Player player) { CheckForBonusesAndUpdateTopSum(); this.rerolls = 2; this.selectedDices.Clear(); Dices.Clear(); for (int i = 0; i < 5; i++) { Dices.Add(i, new Dice(6).Throw()); } currentPlayer = player; } public void SelectDice(int key) { if (selectedDices.Contains(key)) { selectedDices.Remove(key); } else { selectedDices.Add(key); } } public void RerollSelected() { if (rerolls <= 0) return; foreach (var key in selectedDices) { Dices[key] = new Dice(6).Throw(); } rerolls--; selectedDices.Clear(); } public void InsertPoint(string type, List dices) { var result = 0; switch (type) { case "one": result = yatzyCheckers.SingleThingy(dices, 1).value; break; case "two": result = yatzyCheckers.SingleThingy(dices, 2).value; break; case "three": result = yatzyCheckers.SingleThingy(dices, 3).value; break; case "four": result = yatzyCheckers.SingleThingy(dices, 4).value; break; case "five": result = yatzyCheckers.SingleThingy(dices, 5).value; break; case "six": result = yatzyCheckers.SingleThingy(dices, 6).value; break; case "sum": case "bonus": break; case "one_pair": result = yatzyCheckers.PairChecker(dices, 1).value; break; case "two_pair": result = yatzyCheckers.PairChecker(dices, 2).value; break; case "three_matching": result = yatzyCheckers.SameNumberChecker(dices, 3).value; break; case "four_matching": result = yatzyCheckers.SameNumberChecker(dices, 4).value; break; case "little_straight": result = yatzyCheckers.StraightChecker(dices, "small").value; break; case "large_straight": result = yatzyCheckers.StraightChecker(dices, "large").value; break; case "house": result = yatzyCheckers.FullHouse(dices).value; break; case "chance": result = yatzyCheckers.Chance(dices).value; break; case "yatzy": result = yatzyCheckers.Yatzy(dices).value; break; default: break; } var enu = (ScoreLine)Enum.Parse(typeof(ScoreLine), type); SetOrUpdatePlayerScore(currentPlayer.name, enu, result); NextTurn(); } public void NextTurn() { var nextUser = GetNextKey(Players, currentPlayer.name); var nextPlayer = Players.Where(x => x.Key.Equals(nextUser)).First().Value; StartTurn(nextPlayer); } static TKey GetNextKey(Dictionary dict, TKey currentKey) { var keys = dict.Keys.ToList(); int index = keys.IndexOf(currentKey); if (index == -1) throw new ArgumentException("Key not found in dictionary."); int nextIndex = (index + 1) % keys.Count; // Wrap around return keys[nextIndex]; } public void CheckForBonusesAndUpdateTopSum() { var scoresToGet = new[] { ScoreLine.one, ScoreLine.two, ScoreLine.three, ScoreLine.four, ScoreLine.four, ScoreLine.five, ScoreLine.six }; foreach (var player in Players) { if (player.Value.scores.Where(x => scoresToGet.Contains(x.Key)).Select(x => x.Value).Sum() >= 63) { SetOrUpdatePlayerScore(player.Key, ScoreLine.bonus, 50); } else if (scoresToGet.All(req => player.Value.scores.ContainsKey(req))) { SetOrUpdatePlayerScore(player.Key, ScoreLine.bonus, 0); } SetOrUpdatePlayerScore(player.Key, ScoreLine.top_sum, player.Value.scores.Where(x => scoresToGet.Contains(x.Key)).Select(x => x.Value).Sum()); } } public static string TypeLabel(ScoreLine scoreLine) { return scoreLine switch { ScoreLine.one => "Ones", ScoreLine.two => "Twos", ScoreLine.three => "Threes", ScoreLine.four => "Fours", ScoreLine.five => "Fives", ScoreLine.six => "Sixes", ScoreLine.top_sum => "Top Sum", ScoreLine.bonus => "Bonus", ScoreLine.one_pair => "One Pair", ScoreLine.two_pair => "Two Pair", ScoreLine.three_matching => "Three of a Kind", ScoreLine.four_matching => "Four of a Kind", ScoreLine.little_straight => "Small Straight", ScoreLine.large_straight => "Large Straight", ScoreLine.house => "Full House", ScoreLine.chance => "Chance", ScoreLine.yatzy => "Yatzy", _ => "Unknown" }; } public Player GetPlayerById(string id) { return Players.Where(x => x.Value.playerId.Equals(id)).First().Value; } } public class Player { public Player(string name) { this.name = name; this.scores = new Dictionary(); } public Player(string name, string playerID, bool owner) { this.name = name; this.scores = new Dictionary(); this.playerId = playerID; this.Owner = owner; } public string name { get; set; } public Dictionary scores { get; set; } public string playerId { get; set; } public bool Owner { get; set; } } public enum ScoreLine { one, two, three, four, five, six, top_sum, bonus, one_pair, two_pair, three_matching, four_matching, little_straight, large_straight, house, chance, yatzy } }