public bool AddPile(Pile pile) { bool succeded = false; int oldPilesAmount = Piles.Count(); Piles.Add(pile); if (Piles.Count() == oldPilesAmount + 1) { succeded = true; } return(succeded); }
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); } } }
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); }
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 }
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); }
public bool RemovePile(Pile oldPile) { bool succeded = Piles.Remove(oldPile); return(succeded); }