2014-02-04 2 views
0

У меня есть эта программа для карточек, которая выводит все 52 карты в качели. Он содержит 4 строки из 14 карт, первые - серые пустые места.Случайный массив в Java

Я пытаюсь рандомизировать, как они печатаются. До сих пор каждая строка печатается в произвольном порядке Ace через король и случайных костюмах. Ошибка, которую я получаю, - это когда она имеет случайное значение, например [Ace, Four, Jack и т. Д.], Это следует за тем же шаблоном в каждой строке.

enter image description here

Как я могу рандомизации разные строки?

package project2; 

import javax.swing.*; 

import java.io.File; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.awt.*; 

public class main 
{ 
    public static final int PERIMETER_BEVEL = 20; //space between panel border and perimeter cards 
    public static final int LEFT_PERIMETER_BEVEL = 98; 
    public static final int INTERIOR_BEVEL = 5;     //space between cards 
    public static final int CARD_HEIGHT = 97; 
    public static final int CARD_WIDTH = 73;  

    public static final int PANEL_HEIGHT = (2*PERIMETER_BEVEL) + (4*CARD_HEIGHT) + (3*INTERIOR_BEVEL); 
    public static final int PANEL_WIDTH = (2*PERIMETER_BEVEL) + (14*CARD_WIDTH) + (13*INTERIOR_BEVEL); 

    public static final String BACKGROUND_COLOR = "#64C866"; //window background color [hex] 
    public static final String CARD_FOLDER = "cardImages"; //default folder containing images 

    public static final String[] RANKS = { "jack","three","four","five","six","seven", 
    "eight","nine","ten","two","queen","king","ace" 
}; 
    public static final String[] GRAY = {"gray","gray","gray","gray","gray","gray","gray","gray","gray","gray","gray","gray","gray","gray", 
    "gray","gray","gray","gray","gray","gray","gray","gray","gray","gray","gray","gray","gray","gray", 
    "gray","gray","gray","gray","gray","gray","gray","gray","gray","gray","gray","gray","gray","gray", 
    "gray","gray","gray","gray","gray","gray","gray","gray","gray","gray","gray","gray","gray","gray"}; 
public static void main(String[] args) 
{ 
    JFrame window = new JFrame("deck"); 
    JPanel panel = new JPanel() { 
     public void paintComponent(Graphics g) {      //find each rank of card in increasing 
      super.paintComponent(g);         //order as specified in the array. All 
      File[] files = new File(CARD_FOLDER).listFiles();  //ranks appear in the same suit order in 

      //This randomizes the order the suits are put in. 
      for(int i = 0; i < files.length; i++) 
      { 
       int r = (int)(Math.random()*(i+1)); 
       File swap = files[r]; 
       files[r] = files[i]; 
       files[i] = swap; 
      } 

      int counter = 0; 

      //This displays the gray background cards. These cannot move but can be placed over with any other card. 
      int grayCounter = 0; 
      for(String rank : GRAY) {        
       for(File filename : files) {       
        if(filename.getName().contains(rank)) { 
         new ImageIcon(filename.getPath()).paintIcon(this, g, 
          PERIMETER_BEVEL + (grayCounter/4) * (CARD_WIDTH + INTERIOR_BEVEL), 
          PERIMETER_BEVEL + (3-(grayCounter%4)) * (CARD_HEIGHT + INTERIOR_BEVEL)); 
         grayCounter++; 
        }             
       }              
      } 

      //This randomizes the ranks Ace through King. 
      for(int i = 0; i < RANKS.length; i++) 
      { 
       int r = (int)(Math.random()*(i+1)); 
       String swap = RANKS[r]; 
       RANKS[r] = RANKS[i]; 
       RANKS[i] = swap; 
      } 
                    //the filesystem so suits will automatically 
      for(String rank : RANKS) {        //be in order when printing in groups of four 
       for(File filename : files) {       //cards. 
        if(filename.getName().contains(rank)) { 
         new ImageIcon(filename.getPath()).paintIcon(this, g, 
          LEFT_PERIMETER_BEVEL + (counter/4) * (CARD_WIDTH + INTERIOR_BEVEL), 
          PERIMETER_BEVEL + (3-(counter%4)) * (CARD_HEIGHT + INTERIOR_BEVEL)); 
         counter++; 
        }            //counter/4 keeps track of the correct column 
       }             //3-(counter%4) keeps track of the correct row 
      }              //in which to print the card image 
     } 
    }; 
    panel.setPreferredSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); 
    window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    window.setBackground(Color.decode(BACKGROUND_COLOR)); 
    window.add(panel); 
    window.setVisible(true);  
    window.pack(); 

} 
} 
+2

Возможно, лучше использовать ArrayList и использовать Collections.shuffle(). – mdewitt

+0

Вам нужна каждая строка, чтобы перейти от Ace-King? – user2573153

+0

Не загружайте ресурсы из методов paintXxx, они должны возвращаться как можно быстрее. Я только вижу, что вы рандомизировали «RANKS» однажды ... – MadProgrammer

ответ

2

Я считаю, что ваша проблема в том, что вы только рандомизации РЯДЫ один раз, а затем использовать это для каждой строки. Тогда код здесь:

//This randomizes the ranks Ace through King. 
     for(int i = 0; i < RANKS.length; i++) 
     { 
      int r = (int)(Math.random()*(i+1)); 
      String swap = RANKS[r]; 
      RANKS[r] = RANKS[i]; 
      RANKS[i] = swap; 
     } 
                   //the filesystem so suits will automatically 
     for(String rank : RANKS) {        //be in order when printing in groups of four 
      for(File filename : files) {       //cards. 
       if(filename.getName().contains(rank)) { 
        new ImageIcon(filename.getPath()).paintIcon(this, g, 
         LEFT_PERIMETER_BEVEL + (counter/4) * (CARD_WIDTH + INTERIOR_BEVEL), 
         PERIMETER_BEVEL + (3-(counter%4)) * (CARD_HEIGHT + INTERIOR_BEVEL)); 
        counter++; 
       }            //counter/4 keeps track of the correct column 
      }             //3-(counter%4) keeps track of the correct row 
     }              //in which to print the card image 

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

Как я уже говорил в комментариях, вероятно, было бы лучше использовать ArrayList цепочек для Звания и использовать Collections.shuffle Затем вы можете использовать что-то вроде следующего:

for (int row = 0; row < 4; row++) 
{ 
    Collections.shuffle(RANKS); 
    for(String rank : RANKS) {        
      for(File filename : files) {       
       if(filename.getName().contains(rank)) { 
        new ImageIcon(filename.getPath()).paintIcon(this, g, 
         LEFT_PERIMETER_BEVEL + (counter/4) * (CARD_WIDTH + INTERIOR_BEVEL), 
         PERIMETER_BEVEL + (row) * (CARD_HEIGHT + INTERIOR_BEVEL)); 
        counter++; 
       }            
      }              
     }  
    }             

Примечание: Я не сделал на самом деле запустить этот код, поэтому вам может потребоваться внести небольшие корректировки.

Также, как указал @MadProgrammer, вы не должны загружать все это в свой метод рисования, но это другая проблема.

1

Я хотел бы пересмотреть свой способ сделать это, разделив колоду из карты и отделения контроллера от визуализатора внутри метода визуализации. (Псевдо-код только)

Что-то вроде этого:

public class CardView{ 
    String cardName, cardValue, [...]; 
    public void render(int x, int y){ 
     // Render this card, in the given (x,y) cordinates 
    } 
} 

public class DeckView{ 
    ArrayList<CardView> cards; 

    public void renderAll(){ 
     // Select random cars rows 
     // Shuffle cols 
     // For every card in array, call render inside the card with it's x and y 
    } 

    public ArrayList<CardView> getRandomCards(ArrayList<CardView> cards, int cardsToSelect){ 
     // Returns n random cards from the given list 
    } 

    public ArrayList<CardView> shuffleCards(ArrayList<CardView> cards){ 
     // Shuffle the given cards, in random order. 
    } 
} 
Смежные вопросы