Перетасовка массива карт

У меня проблемы с тасованием массива карт. В моей программе есть около 3 методов тасования, и ни один из них не работает. Если кто-нибудь может помочь мне с этим, это было бы здорово. У меня есть папка, полная карточек с именами 1.png, 2.png.... 52.png

public class CardButton extends JButton{

    ImageIcon front, back;
    boolean flipped;

    public CardButton(ImageIcon front, ImageIcon back)
    {
        this.front = front;
        this.back = back;
        flipped = true;
        flip();
    }

    public void flip()
    {
        flipped = !flipped;
        if (flipped)
            this.setIcon(front);
        else
            this.setIcon(back);
    }
}

public class CardButtonPanel extends JPanel {

    CardButton b, b1, b2, b3;
    ImageIcon back, card1, card2, card3;
    int count;
    ActionListener taskPerformer;
    Timer t1;

    // Instantiating a new array
    CardButton[] array;

    public CardButtonPanel() {
        int w = 72, h = 86;

        back = new ImageIcon(getClass().getResource("b2fv.png"));
        Image i1 = back.getImage();
        Image i2 = i1.getScaledInstance(w, h, Image.SCALE_DEFAULT);
        back.setImage(i2);

        array = new CardButton[53];
        List list = Arrays.asList(array);
        Collections.shuffle(list);
        for (int i = 1; i < array.length; i++) {
            // int j = shuffle();
            card1 = new ImageIcon(getClass().getResource(i + ".png"));
            i1 = card1.getImage();
            i2 = i1.getScaledInstance(w, h, Image.SCALE_DEFAULT);
            card1.setImage(i2);
            b1 = new CardButton(card1, back);
            b1.addActionListener(new ButtonHandler1());
            add(b1);
            array[i] = b1;
        }
        taskPerformer = new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                b1.flipped = true;
                b1.flip();
            }
        };
        t1 = new Timer(200, taskPerformer);
        t1.setRepeats(false);
    }

    /*
     * public void shuffle() { currentCard = 1; for (int i = 1; i<array.length;
     * i++) { int second = randomNumbers.nextInt(52);
     * 
     * 
     * } }
     * 
     * public int randomInteger(int x, int y) { Random rInteger = new Random();
     * // int IntegerRandom = rInteger.nextInt((x-y) +1) + x; int IntegerRandom
     * = rInteger.nextInt(52); return IntegerRandom; }
     * 
     * public void swapCards(int i, int j) { CardButton temp = array[i];
     * array[i] = array[j]; array[j] = temp; }
     * 
     * public void shuffle() { for (int i = 0; i < array.length; i++) { int j =
     * randomInteger(i, array.length - 1); } }
     */

    /*
     * public static int[][] randomize(int rows, int cols) { int[][] temp = new
     * int[4][13]; Random randomize = new Random(); // int stuff; for (int i =
     * 0; i < temp.length; i++) { // temp[i] = new int[cols]; for (int j = 0; j
     * < temp[i].length; j++) temp[i][j] = (int) ((Math.random()) * (rows *
     * cols)); // stuff = randomize.nextInt(52); } return temp; }
     */

    private class ButtonHandler1 implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            // Need to create for loop for printing out how many attempts
            int i = 0;
            System.out.println(i + 1);

            CardButton tempCB = (CardButton) e.getSource();
            if (!tempCB.flipped && !t1.isRunning()) {
                tempCB.flip();
                count++;
            }
            if (count > 1) {
                t1.start();
                count = 0;
            }
        }
    }
}

На самом деле я попытался создать еще один класс в случайном порядке.

public class Shuffle {
    public static int[] shuffleCards(int[] cards) {
        for (int i = 1; i < cards.length; i++) {
            int rand = new Random().nextInt(cards.length-i)+i;
            int temp = cards[i];
            cards[i] = cards[rand];
            cards[rand] = temp;
        }
        return cards;
    }
}

Я не знаю, как реализовать это в моей CardButtonPanel, поэтому я не уверен, работает это или нет.


person Alex M    schedule 09.11.2014    source источник
comment
Лучшее, что вы могли бы сделать, это выполнить это с помощью отладчика, чтобы вы могли понять, почему он не делает то, что вы ожидаете.   -  person Dawood ibn Kareem    schedule 09.11.2014
comment
Не создавайте каждый раз новый объект Random. Создайте только один в начале вашей программы. Также я должен начать с 0, а не с 1.   -  person SpiderPig    schedule 09.11.2014


Ответы (2)


Используйте лучший алгоритм перетасовки Fisher Yates

Образец кода :

import java.util.*;

class Test
{
  public static void main(String args[])
  {
    int[] solutionArray = { 1, 2, 3, 4, 5, 6, 16, 15, 14, 13, 12, 11 };

    shuffleArray(solutionArray);
    for (int i = 0; i < solutionArray.length; i++)
    {
      System.out.print(solutionArray[i] + " ");
    }
    System.out.println();
  }

  // Implementing Fisher–Yates shuffle
  static void shuffleArray(int[] ar)
  {
    Random rnd = new Random();
    for (int i = ar.length - 1; i > 0; i--)
    {
      int index = rnd.nextInt(i + 1);
      // Simple swap
      int a = ar[index];
      ar[index] = ar[i];
      ar[i] = a;
    }
  }
}
person Sunil Sharma    schedule 09.11.2014

Вы можете сделать перетасовку двумя способами: -

1) Алгоритм Фишера-Йейтса — один из лучших вариантов.

2)Еще Вы можете создать список карт и собрать их. Затем используйте Collections.shuffle ссылку на учебник. Один из самых простых способов, которые я использовал до сих пор.

Взгляните на этот вопрос для вашего удобства. вопрос

person Crawler    schedule 09.11.2014
comment
Итак, я попытался выполнить Collections.shuffle, но моя проблема до сих пор не решена. У тебя есть идеи, как я облажался? - person Alex M; 09.11.2014
comment
Я думаю, у вас проблемы с реализацией Collections.shuffle. Я обновил свой ответ примером перетасовки регистра. Надеюсь, я смогу вам помочь. - person Crawler; 09.11.2014