Files
MauMau-Server/Mau/Game.cs
2023-03-21 12:25:14 +01:00

114 lines
3.1 KiB
C#

using System.Net.WebSockets;
using System.Text.Json;
namespace MauMau_Server.Mau;
public class Game
{
public readonly Deck Deck = new();
public Card CurrentCard;
public List<Player> 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 handleAction(string playerId, ActionDTO action)
{
var player = GetPlayer(playerId);
if (CurrentPlayer != player) return;
switch (action.Action)
{
case "PLAYCARD":
{
var card = JsonSerializer.Deserialize<CardDTO>(action.Data).ToCard();
PlayCard(player, card);
break;
}
case "DRAW":
DrawCard(player);
break;
}
}
private void PlayCard(Player player, Card card)
{
var hand = player.Hand;
if (!IsCardInHand(hand, card) || !IsCardPlayable(CurrentCard, card)) return;
Deck.AddCardToUsedDeck(card);
hand.Remove(GetSameCardFromHand(hand, card));
CurrentCard = card;
CurrentPlayer = GetNextPlayer();
}
private void DrawCard(Player player)
{
player.Hand.Add(Deck.DrawCard());
CurrentPlayer = GetNextPlayer();
}
private 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<Card> 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<Card> 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;
}
}