コード例 #1
0
        public bool SetAdditionalWeddingPlayer(TablePlayer[] players, int stitchWinnerId)
        {
            var additionPlayer = players.Count(player => player.PlayerId == stitchWinnerId && player.GameVariant != GamesVariants.Wedding) == 1;

            if (GameVariant == GamesVariants.Wedding &&
                additionPlayer &&
                AdditionalWeddingPlayerId < 0)
            {
                if (WeddingWithFirstColorCast && StitchCounter < 2)
                {
                    var leftOfGiverPlayer = players.FirstOrDefault((player) => GetLeftOfGiversPosition() == player.PlayerPosition);
                    if (leftOfGiverPlayer != null && CardPointsUtil.IsColorPlayed(this, leftOfGiverPlayer.GetPlayedCard()))
                    {
                        AdditionalWeddingPlayerId = stitchWinnerId;
                        return(true);
                    }
                }
                else if (!WeddingWithFirstColorCast)
                {
                    AdditionalWeddingPlayerId = stitchWinnerId;
                    return(true);
                }
                else
                {
                    GameVariant = GamesVariants.Solo;
                }
            }
            return(false);
        }
コード例 #2
0
        public bool SetGameVariant(int playerId, GamesVariants variant)
        {
            if (variant == GamesVariants.None)
            {
                return(false);
            }

            var tablePlayer = GettablePlayerOfId(playerId);

            if (tablePlayer != null && tablePlayer.GameVariant == GamesVariants.None)
            {
                // change the variant of the player
                tablePlayer.GameVariant = variant;
                tablePlayer.NextTurn    = true;
                _context.TablePlayer.Update(tablePlayer);
                _context.SaveChanges();

                // check if all players has set game variant and set the table variant with status
                var tablePlayers          = GetPlayersOfTable(tablePlayer.TableId);
                var playerSetVariantCount = tablePlayers.Count((player) => player.GameVariant != GamesVariants.None);

                if (playerSetVariantCount == 4)
                {
                    PlayTable table = GetTableById(tablePlayer.TableId);

                    table.GameVariant = CardPointsUtil.WhichVariantIsPlayed(tablePlayers);
                    if (table.GameVariant == GamesVariants.Normal)
                    {
                        table.SilentForPlayer = CardPointsUtil.SilentPlayer(tablePlayers);
                    }

                    table.Status = PlayStatus.Run;
                    _context.Update(table);
                    _context.SaveChanges();
                }
                OnTableChanged(tablePlayer.TableId);
                return(true);
            }
            return(false);
        }
コード例 #3
0
        public void NextTurn(int playerId)
        {
            var nextTurnCountA = _context.TablePlayer.Count(tp => tp.NextTurn);
            var tablePlayer    = GettablePlayerOfId(playerId);

            // if a player set his next step, do nothing.
            if (tablePlayer != null && tablePlayer.NextTurn == false)
            {
                var nextStepValueSet = tablePlayer.NextTurn;
                tablePlayer.NextTurn = true;
                _context.TablePlayer.Update(tablePlayer);
                _context.SaveChanges();

                var tableId        = tablePlayer.TableId;
                var nextTurnCountB = _context.TablePlayer.Count(tp => tp.NextTurn);
                if (nextTurnCountA == nextTurnCountB || nextTurnCountB <= 1)
                {
                    nextTurnCountB = _context.TablePlayer.Count(tp => tp.NextTurn);
                }
                // only if all players have set the next step and this player's next step was not set, then the next step can be executed.
                if (nextTurnCountB >= 4 && nextStepValueSet == false)
                {
                    var newRound = _context.PlayTables.Count((pt) => pt.Id == tablePlayer.TableId && pt.Status == PlayStatus.WinnersTime) == 1;

                    if (newRound)
                    {
                        // after seen all the winner state setup a new round
                        StartNewRound(tableId);
                    }
                    else
                    {
                        var tablePlayers     = GetPlayersOfTable(tablePlayer.TableId);
                        var playedRoundCards = tablePlayers.Select((tp) => new PlayCard(tp)).ToArray();
                        var table            = _context.PlayTables.FirstOrDefault(pt => pt.Id == tablePlayer.TableId);

                        table.SetLastCardSet(playedRoundCards.Select((prc) => prc.Card).ToArray());
                        int stitchWinnerId = CardPointsUtil.WhoWinCardRound(playedRoundCards, table, tablePlayers);
                        // var stitchWinner = tablePlayers.FirstOrDefault((tp) => tp.PlayerId == stitchWinnerId);
                        table.SetAdditionalWeddingPlayer(tablePlayers, stitchWinnerId);

                        foreach (var player in tablePlayers)
                        {
                            player.ClearForNextTurn();
                            if (player.PlayerId == stitchWinnerId)
                            {
                                player.RoundsPoints        += CardPointsUtil.CardPoints(playedRoundCards);
                                table.CurrentPlayerPosition = player.PlayerPosition;
                            }
                        }
                        _context.TablePlayer.UpdateRange(tablePlayers);

                        table.StitchCounter++;
                        // if the round is over
                        if (table.StitchCounter >= 12 || (!table.WithNiner && table.StitchCounter >= 10) || tablePlayers.All((player) => player.AnyCards()))
                        {
                            TableUtil.SetWinners(tablePlayers, table);
                            table.Status = PlayStatus.WinnersTime;
                            _context.TablePlayer.UpdateRange(tablePlayers);
                        }
                        else
                        {
                            table.Status = PlayStatus.Run;
                        }

                        _context.PlayTables.Update(table);
                        _context.SaveChanges();
                        OnTableChanged(table.Id);
                    }
                }
                else
                {
                    OnTableChanged(tableId);
                }
            }
        }