У меня есть карточная игра, которую я разрабатываю, и в этой игре у вас может быть до 4 стопок хранилища. это работает так: в конце своего хода вы кладете карту в указанную стопку хранилища:

namespace Shikana.Game.Logic.Players.StoragePiles
{
    public enum Piles
    {
        PileA = 1,
        PileB = 2,
        PileC = 3,
        PileD = 4
    }
}

Моя цель - без использования базы данных (включая SQLite) отслеживать порядок карт в каждой стопке хранилища для игрока на протяжении всей игры (от начала до конца). Класс игрока или, по крайней мере, детали, о которых вам нужно позаботиться при ответе на этот вопрос, указаны ниже:

namespace Shikana.Game.Logic.Players
{
    public class Player
    {
        public void playersHand(List<Card> cards)
        {
            this.Hand = cards;
        }

       /// ...

        public void storeCard(Card card, Piles pile)
        {
            Storage cardPile = new Storage(card, pile);

            List<Storage> storage = new List<Storage>();
            storage.Add(cardPile);
            this.StoragePiles = storage;
        }

        public List<Card> Hand { get; private set; }

        public List<Storage> StoragePiles { get; private set; }
    }
}

Здесь мы просто сохраняем карту в список с помощью метода storeCard(), который берет объект Card и Pile из перечисления Piles:

namespace Shikana.Game.Logic.Players.StoragePiles
{
    public class Storage
    {
        public Storage(Card card, Piles pile)
        {
            this.Card = card;
            this.Pile = pile;
        }

        public bool validatePile(Piles pile)
        {
            return Enum.IsDefined(typeof(Piles), pile);
        }


        public Card Card { get; private set; }

        public Piles Pile { get; private set; }
    }
}

С учетом всего сказанного конечным результатом хранения нескольких карт будет:

<(Card, PileA), (Card, PileB), (Card, PileC), ...>

Мне нужно переписать класс Storage, чтобы добавить его в список или создать указанный список карт для определенной стопки, в которой игрок хочет сохранить карту, когда он заканчивает свой ход. Игрок может иметь ТОЛЬКО 4 стопки хранения и может хранить ТОЛЬКО одну карту за ход.

Список должен быть заказан там, где карта, помещенная в хранилище, в конце указанного хода находится внизу. Игрок должен играть снизу вверх из этого списка карт для указанной стопки.

Вопрос в том:

Как мне переписать класс хранения, чтобы хранить карты для определенной стопки и иметь возможность обновлять указанную стопку, когда игрок решает завершить свой ход, вставив карту в стопку?

Все, о чем я думаю, возвращает меня к созданию баз данных, включая объекты игроков, объекты игровой стопки и связи с картами. Но опять же, я не хочу, чтобы НИЧЕГО было связано с базой данных, и у меня должна быть возможность каким-то образом сохранять эту информацию в объекте игрока.

c#
0
TheWebs 17 Фев 2018 в 21:42

1 ответ

Лучший ответ

Если вы используете коллекции Stack для хранения каждой стопки, вы можете немного упростить код.

Во-первых, переопределите значения перечисления, чтобы они служили индексами:

public enum Piles
{
  PileA, // initial value is zero
  PileB,
  PileC,
  PileD,
}

Затем определите свой класс хранилища, чтобы использовать только один экземпляр для каждого игрока:

public class Storage
{
  private List<Stack<Card>> _piles;

  public void Add(Card card, Piles pile)
  {
    int idx = (int)pile;
    _piles[idx].Push(card);
  }

  public Storage()
  {
    _piles = new List<Stack<Card>>();
    _piles.Add(new Stack<Card>());
    _piles.Add(new Stack<Card>());
    _piles.Add(new Stack<Card>());
    _piles.Add(new Stack<Card>());
  }
}

Каждая стопка представляет собой экземпляр Stack, который поддерживает порядок LIFO карт при их добавлении и удалении. Каждая стопка хранится в содержащем списке, поэтому к ней можно получить доступ по индексу.

public class Player
{
  public void playersHand(List<Card> cards)
  {
    this.Hand = cards;
  }

  /// ...

  public void storeCard(Card card, Piles pile)
  {
    this.StoragePiles.Add(card, pile);
  }

  public List<Card> Hand
  {
    get; private set;
  }

  public Storage StoragePiles
  {
    get; private set;
  }
}

Таким образом, все, что вам нужно сделать, это указать экземпляру хранилища, в какую стопку вы хотите поместить карту, и он поместит ее в нужную стопку.

Обратите внимание, что это НЕ отслеживает общий порядок воспроизведения ВСЕХ карт, только для каждой отдельной стопки.

2
Mark Benningfield 17 Фев 2018 в 22:32