private static PatienceField Move(PatienceField field, CardStack from, CardStack to) { if (from == null || to == null) { Console.WriteLine("Invalid move: unknown stack"); return(field); } var cardToMove = from.GetMovableCards().FirstOrDefault(c => to.CanAccept(c, from)); if (cardToMove == null) { Console.WriteLine("Invalid move: none of the cards on from can enter destination"); return(field); } return(field.Move(cardToMove, from, to)); }
public PatienceField Move(Card toMove, CardStack from, CardStack to) { var newto = to.Accept(toMove, from); var newfrom = from.Remove(toMove); var newstock = Replace(Stock, from, newfrom); var newplaystacks = PlayStacks; var newfinishstacks = FinishStacks; if (from is PlayStack) newplaystacks = newplaystacks.Select(ps => Replace(ps, from, newfrom)); else if (from is FinishStack) newfinishstacks = newfinishstacks.Select(ps => Replace(ps, from, newfrom)); if (to is PlayStack) newplaystacks = newplaystacks.Select(ps => Replace(ps, to, newto)); else if (to is FinishStack) newfinishstacks = newfinishstacks.Select(ps => Replace(ps, to, newto)); return new PatienceField(newstock, newplaystacks, newfinishstacks); }
protected override CardStack DoAccept(Card c, CardStack from) { return(new FinishStack(this, c)); }
protected abstract CardStack DoAccept(Card c, CardStack from);
public abstract bool CanAccept(Card c, CardStack from);
public override bool CanAccept(Card c, CardStack from) { return(false); }
protected override CardStack DoAccept(Card c, CardStack from) { // Cards cannot return to stock throw new InvalidOperationException(); }