diff --git a/Controllers/RoomController.cs b/Controllers/RoomController.cs index f9c281b..ea63f33 100644 --- a/Controllers/RoomController.cs +++ b/Controllers/RoomController.cs @@ -1,4 +1,5 @@ -using MauMau_Server.Websockets; +using System.Text.Json; +using MauMau_Server.Websockets; using Microsoft.AspNetCore.Mvc; namespace MauMau_Server.Controllers; @@ -49,7 +50,7 @@ public class RoomController : ControllerBase public IActionResult Post() { var id = _roomManager.CreateRoom(); - return Ok(id); + return Ok(JsonSerializer.Serialize(id)); } [HttpDelete] diff --git a/Mau/Game.cs b/Mau/Game.cs index 2cbf515..35e2231 100644 --- a/Mau/Game.cs +++ b/Mau/Game.cs @@ -33,7 +33,7 @@ public class Game Players.Remove(player); } - public void handleAction(string playerId, ActionDTO action) + public void HandleAction(string playerId, ActionDTO action) { var player = GetPlayer(playerId); if (CurrentPlayer != player) return; @@ -49,7 +49,6 @@ public class Game DrawCard(player); break; } - } private void PlayCard(Player player, Card card) @@ -59,7 +58,46 @@ public class Game Deck.AddCardToUsedDeck(card); hand.Remove(GetSameCardFromHand(hand, card)); CurrentCard = card; - CurrentPlayer = GetNextPlayer(); + HandleNextPlayer(card); + } + + private void HandleNextPlayer(Card card) + { + switch (card.CardValue) + { + case CardValue.TWO: + { + var nextPlayer = GetNextPlayer(); + var cardsToDraw = Deck.DrawCards(2); + foreach (var drawnCard in cardsToDraw) + { + nextPlayer.Hand.Add(drawnCard); + } + CurrentPlayer = GetNextPlayer(2); + break; + } + case CardValue.SEVEN: + case CardValue.KING: + break; + case CardValue.EIGHT: + CurrentPlayer = GetNextPlayer(2); + break; + case CardValue.ACE: + TurnDirection *= -1; + CurrentPlayer = GetNextPlayer(); + break; + case CardValue.THREE: + case CardValue.FOUR: + case CardValue.FIVE: + case CardValue.SIX: + case CardValue.NINE: + case CardValue.TEN: + case CardValue.JACK: + case CardValue.QUEEN: + default: + CurrentPlayer = GetNextPlayer(); + break; + } } private void DrawCard(Player player) @@ -68,15 +106,19 @@ public class Game CurrentPlayer = GetNextPlayer(); } - private Player GetNextPlayer() + private Player GetNextPlayer(int numberOfPlayers = 1) { var index = Players.IndexOf(CurrentPlayer); - index += TurnDirection; - if (index >= Players.Count) index = 0; - if (index < 0) index = Players.Count - 1; + for (var i = 0; i < numberOfPlayers; i++) + { + 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)); diff --git a/Websockets/Room.cs b/Websockets/Room.cs index 513fb7e..6705cd2 100644 --- a/Websockets/Room.cs +++ b/Websockets/Room.cs @@ -25,7 +25,7 @@ public class Room { var slicedBuffer = buffer[0..result.Count]; var action = JsonSerializer.Deserialize(slicedBuffer); - _game.handleAction(socketId, action); + _game.HandleAction(socketId, action); BroadcastGameState(); buffer = EmptyBuffer(); result = await ReceiveAsync(socket, buffer); @@ -58,7 +58,7 @@ public class Room _connections.Remove(socketId); } - private async Task ReceiveAsync(WebSocket webSocket, byte[] buffer) + private static async Task ReceiveAsync(WebSocket webSocket, byte[] buffer) { var arraySegment = new ArraySegment(buffer); var result = await webSocket.ReceiveAsync(arraySegment, CancellationToken.None); @@ -83,7 +83,7 @@ public class Room } } - private void SendAsync(WebSocket socket, string message) + private static void SendAsync(WebSocket socket, string message) { var bytes = Encoding.Default.GetBytes(message); var arraySegment = new ArraySegment(bytes); @@ -94,4 +94,9 @@ public class Room { return new byte[4096]; } + + public bool IsEmpty() + { + return _connections.Count == 0; + } } \ No newline at end of file diff --git a/Websockets/RoomManager.cs b/Websockets/RoomManager.cs index 280a9c7..fd14d28 100644 --- a/Websockets/RoomManager.cs +++ b/Websockets/RoomManager.cs @@ -34,7 +34,10 @@ public class RoomManager : IRoomManager public void RemoveAllRooms() { - Rooms.Clear(); + foreach (var room in Rooms.Where(room => room.Value.IsEmpty())) + { + Rooms.Remove(room.Key); + } } }