void SetupTable(string playerName) { // Mescolo le tile perché sono state passate al gioco lato client e devono essere nuovamente randomizzate for (var k = 0; k < 3; k++) { TilesBag = TilesBag.OrderBy(q => Guid.NewGuid()).ToList(); } // Creo gli espositori Expositors = new List <Expositor>(); var numbers = 2 * Players.Count + 1; for (var i = 0; i < numbers; i++) { var tiles = TilesBag.Take(4).ToList(); if (tiles.Count < 4) { // Metto la riserva nel sacchetto e lo rimescolo TilesBag = CommonReserve.ToList(); for (var k = 0; k < 3; k++) { TilesBag = TilesBag.OrderBy(q => Guid.NewGuid()).ToList(); } // Svuoto la riserva CommonReserve = new List <Tile>(); // Completo le tile da inserire nell'espositore var tilesToTake = 4 - tiles.Count; tiles.AddRange(TilesBag.Take(tilesToTake)); TilesBag.RemoveRange(0, tilesToTake); } else { TilesBag.RemoveRange(0, 4); } Expositors.Add(new Expositor(i + 1) { Tiles = tiles }); } // Solo la tile primo giocatore al centro CenterTable = new List <Tile> { new Tile(TileType.Player1) }; // Imposto l'ordine di gioco Players = Players .SkipWhile(q => !q.IsFirstPlayer) .Union(Players.TakeWhile(q => !q.IsFirstPlayer)) .ToList(); }
void TurnDone(Player player) { // Se ci sono ancora espositori con tile o tile a centro tavola if (Expositors.Any(e => e.Tiles.Any()) || CenterTable.Any()) { var nextPlayer = Players.Skip(Players.IndexOf(player) + 1).FirstOrDefault(); if (nextPlayer == null) { nextPlayer = Players.FirstOrDefault(); } // Next Player nextPlayer.IsMyTurn = true; } // Se non ci sono più tile da prendere... else { // Tutti i giocatori fanno lo score di fine round Players.ForEach(p => CommonReserve.AddRange(p.UpdateBoard())); // Se almeno un giocatore ha completato una riga if (Players.Any(p => p.HasCompletedARow())) { // Punti di fine partita Players.ForEach(p => p.EndGameVictoryPoints()); Ended = DateTime.Now; } // Se si può ancora giocare... else { var firstPlayer = Players.First(p => p.IsFirstPlayer); firstPlayer.IsMyTurn = true; SetupTable(firstPlayer.Name); RoundNo++; } } }