示例#1
0
        private void FillPlayedCards(CurrentGameDataViewModel model, List <CardPlayed> cardsPlayed, PlayerPosition playerPosition)
        {
            foreach (var cardPlayed in cardsPlayed)
            {
                var  onScreenPosition = playerPosition.GetOnScreenPosition(cardPlayed.PlayerPosition);
                Card card             = CardsManager.GetCardFromString(cardPlayed.CardString);
                switch (onScreenPosition)
                {
                case PlayerPosition.Up:
                    model.UpCard = card.ImgPath;
                    break;

                case PlayerPosition.Left:
                    model.LeftCard = card.ImgPath;
                    break;

                case PlayerPosition.Right:
                    model.RightCard = card.ImgPath;
                    break;

                case PlayerPosition.Down:
                    model.DownCard = card.ImgPath;
                    break;
                }
            }
        }
示例#2
0
        private PlayerPosition GetWiningCallPosition(Round round)
        {
            Call call = null;

            var orderedCalls = round.Calls.OrderByDescending(c => c.Type);
            var firstCall    = orderedCalls.FirstOrDefault();

            if (firstCall.Type == CallType.EightInARow || firstCall.Type == CallType.FourJacks || firstCall.Type == CallType.FourNines)
            {
                call = firstCall;
            }

            if (firstCall.Type == CallType.FourOfAKind)
            {
                call = orderedCalls
                       .ThenBy(c => Array.IndexOf(CustomSorting.FourOfAKindSortOrder, CardsManager.GetCardFromString(c.HighestCard).Value))
                       .FirstOrDefault();
            }

            if (firstCall.Type == CallType.SevenInARow || firstCall.Type == CallType.SixInARow || firstCall.Type == CallType.FiveInARow || firstCall.Type == CallType.FourInARow || firstCall.Type == CallType.ThreeInARow)
            {
                var maxValue = round.Calls.Select(c => c.Value).Max();
                call = orderedCalls
                       .Where(c => c.Value == maxValue)
                       .OrderByDescending(c => CardsManager.GetCardFromString(c.HighestCard).Value)
                       .ThenBy(c => Array.IndexOf(CustomSorting.GetPositionSortingOrderForCalls(round.FirstPlayerToPlay), c.PlayerPosition))
                       .FirstOrDefault();
            }

            return(call.PlayerPosition);
        }
示例#3
0
        public async Task <Result> MakeACall(List <string> cardStrings, int roundId, int userId, bool isCall)
        {
            var            result              = Result.Success();
            int            highestCallValue    = 0;
            PlayerPosition?winningCallPosition = null;
            Round          round = await _gameRepository.GetRoundById(roundId);

            Player player = await _playerRepository.GetPlayerByUserIdAsync(userId);

            if (isCall)
            {
                if (cardStrings.Count > 2)
                {
                    List <Card> cards               = cardStrings.Select(cs => CardsManager.GetCardFromString(cs)).ToList();
                    List <Call> foundCalls          = new List <Call>();
                    List <Card> fourOfAKindRemained = new List <Card>();
                    List <Card> sequenceRemained    = new List <Card>();
                    FindFourOfAKindCalls(cards, player.PlayerPosition.Value, ref foundCalls, ref fourOfAKindRemained);
                    FindSequenceCalls(cards, player.PlayerPosition.Value, ref foundCalls, ref sequenceRemained);
                    if (!DoListsHaveMatchingCard(fourOfAKindRemained, sequenceRemained))
                    {
                        round.Calls.AddRange(foundCalls);
                        highestCallValue = foundCalls.OrderByDescending(c => c.Value).FirstOrDefault().Value;
                    }
                    else
                    {
                        return(Result.Fail(new string[] { "Nevažeće zvanje" }));
                    }
                }
                else
                {
                    return(Result.Fail(new string[] { "Nevažeće zvanje" }));
                }
            }

            round.CurrentPlayerToPlay = round.CurrentPlayerToPlay.GetNextPosition();
            if (round.CurrentPlayerToPlay == round.FirstPlayerToPlay)
            {
                round.RoundPhase = round.RoundPhase.GetNextPhase();
                if (round.Calls.Count > 0)
                {
                    winningCallPosition = GetWiningCallPosition(round);
                    await ResolveCalls(round, winningCallPosition.Value);
                }
            }
            result.Values = GetResultObjForCall(round, highestCallValue, winningCallPosition);

            if (await _gameRepository.SaveAsync())
            {
                return(result);
            }

            return(Result.Fail(new string[] { "Dogodila se greška" }));
        }
示例#4
0
        private void ResolveTurn(Round round, Game game, bool isLastTurn)
        {
            var cardsPlayed       = round.CardsPlayed.Where(cp => cp.RoundPhase == round.RoundPhase).ToList();
            var sum               = cardsPlayed.Sum(cp => cp.Value);
            var cards             = cardsPlayed.Select(cp => CardsManager.GetCardFromString(cp.CardString)).ToList();
            var strongestCard     = GetStrongestCardInTurn(cards, round.CurrentTrump.Value);
            var winningPosition   = round.CardsPlayed.Where(cp => strongestCard.ToString() == cp.CardString).FirstOrDefault().PlayerPosition;
            var playerThatWonTurn = game.PlayerGames.Where(pg => pg.Player.PlayerPosition == winningPosition).Select(pg => pg.Player).FirstOrDefault();

            SetPointValuesInTurn(round, playerThatWonTurn.Team.Value, sum, isLastTurn);
            round.CurrentPlayerToPlay = winningPosition;
        }
示例#5
0
        public async Task <List <List <string> > > GetListOfCardUrlsForCall(int roundId, int playerPosition, bool isPartner)
        {
            List <List <string> > urls = new List <List <string> >();
            var position = isPartner ? ((PlayerPosition)playerPosition).GetTeammatePosition() : (PlayerPosition)playerPosition;
            var round    = await _gameRepository.GetRoundById(roundId);

            List <Call> calls = round.Calls.Where(c => c.PlayerPosition == position).ToList();

            foreach (var call in calls)
            {
                Card card = CardsManager.GetCardFromString(call.HighestCard);
                urls.Add(FindCallCardUrlsFromHighestCard(card, call.Type));
            }

            return(urls);
        }
示例#6
0
        public async Task <Result> PlayACard(string playedCardString, int roundId, int userId, PlayerPosition position, List <string> cardsInHandStrings, bool belaCalled)
        {
            Round round = await _gameRepository.GetRoundById(roundId);

            Player player = await _playerRepository.GetPlayerByUserIdAsync(userId);

            var cardsPlayed = round.CardsPlayed.Where(cp => cp.RoundPhase == round.RoundPhase)
                              .OrderBy(cp => cp.DateCreated)
                              .Select(cp => CardsManager.GetCardFromString(cp.CardString))
                              .ToList();

            var cardsInHand = CardsManager.GetCardListFromHandString(string.Join(",", cardsInHandStrings));
            var playedCard  = CardsManager.GetCardFromString(playedCardString);
            var validCards  = ValidCardsHelper.GetValidCardsForPlay(cardsInHand, round.CurrentTrump.Value, cardsPlayed);

            if (validCards.Contains(playedCard))
            {
                var result = Result.Success();
                round.CardsPlayed.Add(new CardPlayed(round.RoundPhase, position, playedCard, round.CurrentTrump.Value));
                cardsInHand.Remove(playedCard);
                cardsInHand = cardsInHand.OrderCards();
                player.Hand = string.Join(",", cardsInHand);
                Game game       = null;
                var  roundAlert = "";
                var  isLastTurn = false;
                var  isGameOver = false;

                if (belaCalled)
                {
                    if (player.Team.Value == Team.FirstTeam)
                    {
                        round.FirstTeamCalls      += 20;
                        round.FirstTeamRoundTotal += 20;
                    }

                    if (player.Team.Value == Team.SecondTeam)
                    {
                        round.SecondTeamCalls      += 20;
                        round.SecondTeamRoundTotal += 20;
                    }
                }

                if (round.CardsPlayed.Where(cp => cp.RoundPhase == round.RoundPhase).ToList().Count == 4)
                {
                    isLastTurn = round.RoundPhase == RoundPhase.EighthCard;

                    game = await _gameRepository.GetGameWithPlayersById(round.GameId);

                    ResolveTurn(round, game, isLastTurn);

                    if (isLastTurn)
                    {
                        round.CurrentPlayerToPlay = round.FirstPlayerToPlay.GetNextPosition();
                        roundAlert = await ResolveRound(round, game);

                        if (IsGameOver(game))
                        {
                            isGameOver = true;
                            await SetGameOverDataAsync(game);
                        }
                        else
                        {
                            AddNextRound(game, round);
                            var players = game.PlayerGames.Select(pg => pg.Player).ToList();
                            FillPlayersHands(players);
                        }
                    }
                    else
                    {
                        round.RoundPhase = round.RoundPhase.GetNextPhase();
                    }
                }
                else
                {
                    round.CurrentPlayerToPlay = round.CurrentPlayerToPlay.GetNextPosition();
                }

                if (await _gameRepository.SaveAsync())
                {
                    var currentRoundId = round.Id;
                    var currentPhase   = round.RoundPhase;
                    if (isLastTurn)
                    {
                        var newRound = game.Rounds.OrderByDescending(r => r.Id).FirstOrDefault();
                        currentRoundId = newRound.Id;
                        currentPhase   = newRound.RoundPhase;
                    }
                    result.Values = GetResultObjForCardPlayed(round, position, playedCard, roundAlert, currentRoundId, currentPhase, isLastTurn, isGameOver, belaCalled);
                    return(result);
                }

                return(Result.Fail(new string[] { "Dogodila se greška" }));
            }

            return(Result.Fail(new string[] { "Nevažeća karta" }));
        }