Ejemplo n.º 1
0
        public bool AddPile(Pile pile)
        {
            bool succeded       = false;
            int  oldPilesAmount = Piles.Count();

            Piles.Add(pile);
            if (Piles.Count() == oldPilesAmount + 1)
            {
                succeded = true;
            }

            return(succeded);
        }
Ejemplo n.º 2
0
        private void SetPilesToGameStartState()
        {
            //Create and shuffle deck
            CreateDeck();
            Piles[0].ShufflePile();

            //Create discard pile
            Pile discardPile = new Pile(Visibility.VisibleToAll, PileType.Discard, Accessability.AccessableToAll, 55, 55, null, null, MaxPileNo++);

            AddPile(discardPile);

            //Create hand for each player
            lock (MaxPileNoLock) {
                foreach (Player player in Players.Values)
                {
                    Pile newPile = new Pile(Visibility.VisibleToOwner, PileType.Hand, Accessability.AccessableToOwner, 0, 0, player, null, MaxPileNo++);
                    AddPile(newPile);
                }
            }
        }
Ejemplo n.º 3
0
        public void CreateDeck()
        {
            List <Card> deck = new List <Card>();

            foreach (Suit suit in Enum.GetValues(typeof(Suit)))
            {
                foreach (Value value in Enum.GetValues(typeof(Value)))
                {
                    deck.Add(new Card(value, suit, Visibility.VisibleToNoOne, 1, null));
                }
                ;
            }
            ;
            Pile pile = null;

            lock (MaxPileNoLock) {
                pile = new Pile(Visibility.VisibleToNoOne, PileType.Deck, Accessability.AccessableToAll, 50, 50, null, deck, MaxPileNo++);
            }
            AddPile(pile);
        }
Ejemplo n.º 4
0
        private bool validateMove(Pile sourcePile, Pile targetPile, MoveCardModel moveToValidate)
        {
            bool sourcePileVersionIsValid = moveToValidate.SourcePileVersionNo == sourcePile.VersionNo;
            bool targetPileVersionIsValid = moveToValidate.TargetPileVersionNo == targetPile.VersionNo;

            bool sourceIndexIsValid = moveToValidate.SourceIndex >= 0 && moveToValidate.SourceIndex <= sourcePile.Cards.Count() - 1;
            bool targetIndexIsValid;

            if (targetPile != sourcePile)
            {
                targetIndexIsValid = moveToValidate.TargetIndex >= 0 && moveToValidate.TargetIndex <= targetPile.Cards.Count();
            }
            else   //Source and Target pile are the same
            {
                targetIndexIsValid = moveToValidate.TargetIndex >= 0 && moveToValidate.TargetIndex <= targetPile.Cards.Count() - 1;
            }

#if BREAK_MOVE
            return(true);
#else
            return(sourcePileVersionIsValid && targetPileVersionIsValid && sourceIndexIsValid && targetIndexIsValid);
#endif
        }
Ejemplo n.º 5
0
        public bool MoveCard(MoveCardModel moveCardModel)
        {
            bool result = false;

            Pile sourcePile = Piles.Find(pile => pile.PileNo == moveCardModel.SourcePileNo);
            Pile targetPile = Piles.Find(pile => pile.PileNo == moveCardModel.TargetPileNo);

            try {
                if (Monitor.TryEnter(sourcePile))
                {
#if DELAY_MOVE
                    if (Monitor.TryEnter(ConcurrencyIssueLock))
                    {
                        Debug.WriteLine("Paused with move " + moveCardModel.ToString());
                        Thread.Sleep(5000);
                        Debug.WriteLine("Continueing paused move...");
                        Monitor.Exit(ConcurrencyIssueLock);
                    }
#endif
#if BREAK_MOVE
                }
                else
                {
                    Debug.WriteLine("Skipping pause for move " + moveCardModel.ToString());
                }
                { //To match closing bracket
#endif
                    if (targetPile != sourcePile)
                    {
                        if (Monitor.TryEnter(targetPile) && validateMove(sourcePile, targetPile, moveCardModel))
                        {
                            Card cardToMove = sourcePile.RemoveCard(moveCardModel.SourceIndex);
                            targetPile.AddCard(moveCardModel.TargetIndex, cardToMove);
                            sourcePile.VersionNo++;
                            targetPile.VersionNo++;
                            moveCardModel.SourcePileVersionNo = sourcePile.VersionNo;
                            moveCardModel.TargetPileVersionNo = targetPile.VersionNo;
                            result = true;
#if BREAK_MOVE
                            Debug.WriteLine("Made move " + moveCardModel.ToString());
#endif
                        }
                    }
                    else   //Source and Target pile are the same

                    {
                        if (validateMove(sourcePile, targetPile, moveCardModel))
                        {
                            Card cardToMove = sourcePile.RemoveCard(moveCardModel.SourceIndex);
                            sourcePile.AddCard(moveCardModel.TargetIndex, cardToMove);
                            sourcePile.VersionNo++;
                            moveCardModel.SourcePileVersionNo = sourcePile.VersionNo;
                            moveCardModel.TargetPileVersionNo = sourcePile.VersionNo;
                            result = true;
#if BREAK_MOVE
                            Debug.WriteLine("Made move " + moveCardModel.ToString());
#endif
                        }
                    }
                }
            }
            catch (Exception e) {
#if BREAK_MOVE
                Debug.WriteLine("Excepiton during move " + moveCardModel.ToString());
#endif
                Debug.WriteLine(e.Message);
            }
            finally {
                if (Monitor.IsEntered(sourcePile))
                {
                    Monitor.Exit(sourcePile);
                }

                if (Monitor.IsEntered(targetPile))
                {
                    Monitor.Exit(targetPile);
                }
            }

            return(result);
        }
Ejemplo n.º 6
0
        public bool RemovePile(Pile oldPile)
        {
            bool succeded = Piles.Remove(oldPile);

            return(succeded);
        }