Как я могу создать метод перетасовки карт в Java для карт, чтобы идти в определенном порядке? - PullRequest
1 голос
/ 19 апреля 2011

карты должны чередоваться, как верхняя половина и нижняя половина в этом порядке, пока не пройдет колода из 52 карт.В каждой половине колоды есть 26 карт, которые они идут в следующем порядке:

top1, bottom1, top2, bottom2, top3, bottom3, top4, bottom 4, ..., top n, bottom n

Я думал об этом: Card[] topHalf= new Card[cards.length/2];

public void shuffle() {
    int index = 0;

    for (int suit = 0; suit <= 1; suit++) {
        for (int value = 1; value <= 13; value++) {
            cards[index] = new Card(value, suit);
            index++;
        }
    }
    Card[] botHalf= new Card[(cards.length+26)/2];

    int index2 = 0;

    for (int suit = 2; suit <= 3; suit++) {
        for (int value = 1; value <= 13; value++) {
            cards[index] = new Card(value, suit);
            index2++;

        }
        for (int row = 0; row < cards.length; row++){

            row++;

            Card [] temp = new Card[( topHalf.length)+botHalf.length];
        //cards[row]= cards[index];
    }

Ответы [ 2 ]

0 голосов
/ 20 апреля 2011

Просто, чтобы уточнить, звучит так, как если бы вы захотели перемешать, расположив цифры

1 2 3 4 5 6 7 8

как

1 8 2 7 3 6 4 5.

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

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

  • Если i является четным, то элемент, который нам нужен, имеет индекс i/2
  • Если i нечетно, то элемент имеет индекс array.length - (i+1)/2 (+1 округляется до ближайшего четного числа)

Вот код:

public static Card[] rifleShuffle(Card[] deck) {
    Card[] newDeck = new Card[deck.length];

    for (int i = 0; i < newDeck.length; i++) {
        // Check whether current index is odd or even by using mod 2
        if (i % 2 == 0) {
            newDeck[i] = deck[i / 2];
        } else {
            newDeck[i] = deck[deck.length - ((i + 1) / 2)];
        }
    }

    return newDeck;
}

public static void main(String[] args) {
    Card[] deck1 = new Card[52];

    int i = 0;
    for (int suite = 0; suite < 4; suite++) {
        for (int value = 1; value <= 13; value++) {
            deck1[i++] = new Card(value, suite);
        }
    }

    System.out.println("Before shuffling: " + Arrays.toString(deck1));

    Card[] deck2 = rifleShuffle(deck1);

    System.out.println("After shuffling:  " + Arrays.toString(deck2));
}
0 голосов
/ 19 апреля 2011

Храните карты в отсортированной карте в порядке их появления в качестве ключа.Сортированная карта сделает сортировку за вас.Затем вы можете просмотреть их все по порядку:

SortedMap map = new SortedMap();

map.put(1, "top1");
map.put(2, "bottom1");
map.put(3, "top2");
...
...
...
Iterator iterator = map.keySet().iterator();
while (iterator.hasNext()) {
   Object key = iterator.next();
   System.out.println(" card :" + map.get(key));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...