예제 #1
0
        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();
        }
예제 #2
0
        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++;
                }
            }
        }