using System.Net.WebSockets; namespace MauMau_Server.Mau; public class Game { public readonly Deck Deck = new(); public Card CurrentCard; public List Players = new(); public Player CurrentPlayer; public int TurnDirection = 1; public Game() { CurrentCard = Deck.DrawCard(); Deck.AddCardToUsedDeck(CurrentCard); } public void AddPlayerToGame(string playerId, WebSocket socket) { var player = new Player("Koetje " + playerId.Split('-')[0], playerId, socket) { Hand = Deck.DrawCards(8) }; Players.Add(player); if (Players.Count == 1) CurrentPlayer = player; } public void RemovePlayer(string playerId) { var player = GetPlayer(playerId); Players.Remove(player); } public void PlayCard(string playerId, Card card) { var player = GetPlayer(playerId); if (CurrentPlayer != player) return; var hand = player.Hand; if (!IsCardInHand(hand, card) || !IsCardPlayable(CurrentCard, card)) return; Deck.AddCardToUsedDeck(card); hand.Remove(GetSameCardFromHand(hand, card)); CurrentCard = card; CurrentPlayer = GetNextPlayer(); } public Player GetNextPlayer() { var index = Players.IndexOf(CurrentPlayer); index += TurnDirection; if (index >= Players.Count) index = 0; if (index < 0) index = Players.Count - 1; return Players[index]; } public Player GetPlayer(string playerId) { return Players.FirstOrDefault(p => p.IsMe(playerId)); } private static Card GetSameCardFromHand(IEnumerable hand, Card card) { return hand.FirstOrDefault(handCard => IsSameCard(handCard, card)); } private static bool IsCardPlayable(Card currentCard, Card playedCard) { return IsSameCardType(currentCard, playedCard) || IsSameCardValue(currentCard, playedCard); } private static bool IsCardInHand(IEnumerable hand, Card card) { return hand.Any(handCard => IsSameCard(handCard, card)); } private static bool IsSameCard(Card card1, Card card2) { return IsSameCardType(card1, card2) && IsSameCardValue(card1, card2); } private static bool IsSameCardType(Card card1, Card card2) { return card1.CardType == card2.CardType; } private static bool IsSameCardValue(Card card1, Card card2) { return card1.CardValue == card2.CardValue; } }