Example #1
0
        /// <summary>
        /// Новая игра.
        /// </summary>
        public void NewGame()
        {
            Clear();
            MovesManager.NewGame();
            ScoreManager.InitNewGame();
            Deck        deck  = new Deck104();
            List <Card> cards = deck.Cast <Card>().ToList();

            // Добавляем карты в таблицы.
            int addCardsCount = 9;

            for (int i = 0; i < Tableaus - 1; i++)
            {
                Util.Move(cards, _tableau[i].GetList(), addCardsCount);
                addCardsCount--;
            }
            // Переворачиваем верхние карты.
            for (int i = 0; i < Tableaus - 1; i++)
            {
                _tableau[i].GetTopCard().SetFaceUp();
            }

            // Добавляем оставшиеся 67 карт в запас.
            _stock.AddCards(cards);
        }
Example #2
0
        /// <summary>
        /// Отмена последнего действия.
        /// </summary>
        public void Undo()
        {
            Move move = MovesManager.Undo();

            switch (move.Type)
            {
            case MoveType.ToFoundation:
                // Перекладываем карты обратно из стопки.
                ScoreManager.DecreaseScore(move.Cards.Count);
                // Удаляем карты из таблицы.
                foreach (var card in move.Cards)
                {
                    move.ToFoundation.GetList().Remove(card);
                }
                if (move.FaceUp)
                {
                    move.FromTableau.FaceDownTopCard();
                }
                move.FromTableau.AddCardsBySystem(move.Cards);
                break;

            case MoveType.ToTableau:
                // Перекладываем в исходную таблицу.
                // Удаляем карты из таблицы.
                foreach (var card in move.Cards)
                {
                    move.ToTableau.GetList().Remove(card);
                }
                if (move.FaceUp)
                {
                    move.FromTableau.FaceDownTopCard();
                }
                move.FromTableau.AddCardsBySystem(move.Cards);
                break;

            case MoveType.FromStock:
                // Отмена раздачи карт из запаса.
                var copy = new List <Card>(move.Cards);
                foreach (var card in copy)
                {
                    for (int i = 0; i < Tableaus; i++)
                    {
                        _tableau[i].GetList().Remove(card);
                    }
                    card.SetFaceDown();
                }
                Util.Move(copy, _stock.GetList(), move.Cards.Count);
                break;
            }
        }
Example #3
0
        /// <summary>
        /// Перезапустить игру.
        /// </summary>
        /// <param name="clearMoves">очищать ли историю ходов и очки</param>
        public void RestartGame(bool clearMoves = true)
        {
            if (!clearMoves)
            {
                ScoreManager.FreezeScore();
            }

            while (MovesManager.GetMoveIndex() > 0)
            {
                Undo();
            }
            if (clearMoves)
            {
                MovesManager.NewGame();
                ScoreManager.InitNewGame();
            }
        }
Example #4
0
        /// <summary>
        /// Перемещение карт между таблицами.
        /// </summary>
        /// <param name="cards">список перемещаемых карт</param>
        /// <param name="from">из какой таблицы перемещаем</param>
        /// <param name="to">в какую таблицу</param>
        /// <param name="saveToHistory">отметить ход в истории изменений</param>
        public void MoveCards(List <Card> cards, Tableau from, Tableau to, bool saveToHistory = true)
        {
            // Удаляем карты из таблицы.
            foreach (var card in cards)
            {
                from.GetList().Remove(card);
            }

            if (saveToHistory)
            {
                bool faceUp = (from.GetTopCard() == null) ? false : from.GetTopCard().IsFaceDown;
                MovesManager.Move(new List <Card>(cards), from, to, faceUp);
            }

            from.FaceUpTopCard();
            to.AddCards(cards);
        }
Example #5
0
        /// <summary>
        /// Повтор отменённого действия.
        /// </summary>
        public void Redo()
        {
            Move move = MovesManager.Redo();

            switch (move.Type)
            {
            case MoveType.ToFoundation:
                MoveCards(move.Cards, move.FromTableau, move.ToFoundation, false);
                break;

            case MoveType.ToTableau:
                MoveCards(move.Cards, move.FromTableau, move.ToTableau, false);
                break;

            case MoveType.FromStock:
                HandOutFromStock(false);
                break;
            }
        }
Example #6
0
        /// <summary>
        /// Раздача карт из запаса.
        /// </summary>
        public void HandOutFromStock(bool saveToHistory = true)
        {
            var cards = new List <Card>();

            Util.Move(_stock.GetList(), cards, Tableaus);
            if (saveToHistory)
            {
                MovesManager.HandOut(new List <Card>(cards));
            }
            // Раскрываем карты.
            foreach (var card in cards)
            {
                card.SetFaceUp();
            }
            // Переносим в таблицы.
            for (int i = 0; i < Tableaus; i++)
            {
                if (cards.Count == 0)
                {
                    return;
                }
                Util.Move(cards, _tableau[i].GetList(), 1);
            }
        }