예제 #1
0
        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);
            }
        }
예제 #2
0
        public CardPack LastCards(int count)
        {
            CardPack copy = this.Copy();

            copy.cards = cards.GetRange(cards.Count - count, count);
            return(copy);
        }
예제 #3
0
        public CardPack FirstCards(int count)
        {
            CardPack cp = this.Copy();

            if (count <= Count)
            {
                cp.cards = cards.GetRange(0, count);
            }
            return(cp);
        }
예제 #4
0
 /// <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);
 }
예제 #5
0
        public bool AddCards(CardPack cp)
        {
            if (cp == null)
            {
                return(false);
            }

            if (!CanAccept(cp))
            {
                return(false);
            }

            cards.AddRange(cp.cards);
            return(true);
        }
예제 #6
0
        /// <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++;
        }
예제 #7
0
 /// <summary>
 /// Определяет может ли данная стопка карт принять другую. Для задания правил.
 /// </summary>
 /// <returns><c>true</c>, если может принять, <c>false</c> иначе.</returns>
 /// <param name="cp">Стопка для принятия.</param>
 abstract public bool CanAccept(CardPack cp);
예제 #8
0
 public VisibleCardPack(CardPack p, Point pt)
 {
     pack  = p;
     point = pt;
 }
예제 #9
0
 public override bool CanAccept(CardPack cp)
 {
     return(true);
 }
예제 #10
0
 public override bool CanAccept(CardPack cp)
 {
     return(canAccept(cp));
 }
예제 #11
0
 public String CardPackId(CardPack cp)
 {
     return(cardPackTable.FirstOrDefault(i => i.Value == cp).Key);
 }