public void Draw(SpriteBatch spriteBatch, Point offset) { CardPack toDraw = pack.FirstCards(pack.Count - InvisibleCards); if (toDraw.Count == 0) { spriteBatch.Draw(CardResources.Instance.Blank, GetFirstCardRectangle(), Color.White); return; } if (pack.displayMode == CardPack.DisplayMode.Full) { Rectangle cardRect = GetFirstCardRectangle(); for (int i = 0; i < toDraw.Count; i++) { Rectangle rect = new Rectangle( cardRect.X + offset.X, cardRect.Y + offset.Y + CARD_IMPOSE_HEIGHT * i, cardRect.Width, cardRect.Height ); Texture2D texture = CardResources.Instance.CardTextureByNum(toDraw[i]); spriteBatch.Draw(texture, OffsetRectangle(rect, offset), Color.White); } } else if (pack.displayMode == CardPack.DisplayMode.OnlyLast) { Texture2D texture = CardResources.Instance.CardTextureByNum(toDraw[toDraw.Count - 1]); spriteBatch.Draw(texture, OffsetRectangle(GetRectangle(), offset), Color.White); } else if (pack.displayMode == CardPack.DisplayMode.Hidden) { spriteBatch.Draw(CardResources.Instance.Cover, OffsetRectangle(GetRectangle(), offset), Color.White); } }
public CardPack LastCards(int count) { CardPack copy = this.Copy(); copy.cards = cards.GetRange(cards.Count - count, count); return(copy); }
public CardPack FirstCards(int count) { CardPack cp = this.Copy(); if (count <= Count) { cp.cards = cards.GetRange(0, count); } return(cp); }
/// <summary> /// Совершает перемещение карт с одной колоды на другую. /// Желательно проводить все операции с колодами через этот метод. /// </summary> /// <returns><c>true</c>, перемещение возможно и совершено, <c>false</c> в ином случае.</returns> /// <param name="from">С какой колоды.</param> /// <param name="to">На какую.</param> /// <param name="count">Количество карт.</param> public bool ConfirmMove(CardPack from, CardPack to, int count) { if (!disabledMoves.Contains(Tuple.Create(from, to)) && from.CanGive(count) && to.CanAccept(from.LastCards(count))) { to.AddCards(from.LastCards(count)); from.RemoveLastCards(count); OnMoveConfirmed(from, to, count); movesHistory.Add(Tuple.Create(from, to, count)); return(true); } return(false); }
public bool AddCards(CardPack cp) { if (cp == null) { return(false); } if (!CanAccept(cp)) { return(false); } cards.AddRange(cp.cards); return(true); }
/// <summary> /// Вызывается всякий раз, когда совершено успешное перемещение. /// </summary> /// <param name="from">С какой стопки.</param> /// <param name="to">На какую.</param> /// <param name="count">Сколько карт.</param> private void OnMoveConfirmed(CardPack from, CardPack to, int count) { // Перемещена карты с открытой колоды. if (from == cardPackTable["openedClosed"]) { // Перемещаем на открытую колоду одну карту с закрытой. ConfirmMove(cardPackTable["closed"], cardPackTable["openedClosed"], 1); } // Перемещение с игрового поля. // В случае, если карт не осталось в игровом поле - блокировать перемещение на нее // с открытой колоды if (CardPackId(from).StartsWith("game", StringComparison.OrdinalIgnoreCase) && from.Count == 0) { foreach (KeyValuePair <String, CardPack> kv in cardPackTable) { if (kv.Key != "secret" && !kv.Key.StartsWith("game", StringComparison.Ordinal)) { disabledMoves.Add(Tuple.Create(kv.Value, from)); } } } // Разрешаем добавление карт на игровое поле с открытой колоды. if (CardPackId(to).StartsWith("game", StringComparison.Ordinal)) { disabledMoves.RemoveWhere(i => i.Item2 == to); } // Проверяем выиграл ли игрок, при перемещении на базовую колоду. if (CardPackId(to).StartsWith("base", StringComparison.Ordinal)) { CheckIfWin(); } steps++; }
/// <summary> /// Определяет может ли данная стопка карт принять другую. Для задания правил. /// </summary> /// <returns><c>true</c>, если может принять, <c>false</c> иначе.</returns> /// <param name="cp">Стопка для принятия.</param> abstract public bool CanAccept(CardPack cp);
public VisibleCardPack(CardPack p, Point pt) { pack = p; point = pt; }
public override bool CanAccept(CardPack cp) { return(true); }
public override bool CanAccept(CardPack cp) { return(canAccept(cp)); }
public String CardPackId(CardPack cp) { return(cardPackTable.FirstOrDefault(i => i.Value == cp).Key); }