Лучшая структура данных для хранения элементов, элементы которых могут быть впоследствии распределены среди заинтересованных сторон? - PullRequest
0 голосов
/ 09 марта 2012

Я пытаюсь разработать карточную игру UNO, и теперь я достигаю точки, где мне нужна структура данных, которая может вместить всю колоду, а затем я могу взять ее и распределить по нескольким местам (игроки , колода сброса и колода розыгрыша). Код будет примерно таким:

public class UnoGame
{
    public UnoGame()
    {
        SomeDataStructure<Card> unoDeck = generateUnoCards();
        List<Cards> player1 = unoDeck.get(7);
        List<Cards> player2 = unoDeck.get(7);
        List<Cards> discardPile = unoDeck.get(1);
        List<Cards> drawPile = unoDeck.getRest();
    }

    private static SomeDataStructure<Card> generateUnoCards()
    {
        SomeDataStructure<Card> cards = new SomeDataStructure<Card>(108);
        // Here we can create the proper cards and add them to the data structre
        Collections.shuffle(cards);
        return cards;
    }
}

Итак, есть ли в Java встроенная структура данных, которая соответствует моим требованиям? Или я должен реализовать свою собственную структуру данных?

Ответы [ 2 ]

1 голос
/ 09 марта 2012

Не совсем понятно, зачем вам что-то особенное. Я бы смоделировал его в соответствии с реальной игрой: стек для всех карт (используя LinkedList<T> в качестве реализации стека), который вы затем снимаете с карт, чтобы получить руку, и который также используется для получить карты позже. Я бы моделировал каждого игрока с отдельным классом, хотя ... даже если изначально он просто содержит List<Card> или что-то подобное.

List<Player> players = new ArrayList<Player>();
LinkedList<Card> deck = createDeck(); // This should shuffle too
for (int i = 0; i < playerCount; i++) {
    Player player = new Player();
    players.add(player);
    for (int j = 0; j < 7; j++) {
        player.addCard(deck.removeLast());
    }
}
LinkedList<Card> discards = new LinkedList<Card>();

В любой момент, если вы думаете о том, что произойдет в физической игре, это должно быть достаточно просто.

0 голосов
/ 09 марта 2012

Вы можете использовать ArrayList из ArrayList или HashMap

ArrayList:

ArrayList<ArrayList<Card>> decks = generateUnoCards();
ArrayList<Card> player1 = decks.get(0);
...

HashMap:

HashMap<String, ArrayList<Card>> decks = new HashMap<String, ArrayList<Card>>();
decks.put("player1", new ArrayList<Card>);
...
decks.put("drawPile", getRest(decks));
...
ArrayList<Card> drawPile = decks.get("drawPile");

Когда сеанс заканчивается и вы хотитечтобы перетасовать колоду, скопируйте все из Arraylists не-drawPile в drawPile, вызовите clear () для этих ArrayLists, а затем вызовите Collections.sort () в вашем drawPile.Затем заново сдайте карты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...