2014-11-25 8 views
0

У моего класса CompSci есть задание, которое мы делаем, в котором мы должны распечатать колоду карт как двухмерный массив из 6 строк по 8 столбцов. Каждая «карта» - это в основном случайное число (1-12) и случайный выбор (Diamonds, Hearts, Spades, & Clubs); никакая карта не может быть повторена в любом месте массива. Вот мой код:Как распечатать случайный двумерный массив без дубликатов?

static Random random = new Random(1234567); 

static int i = 1; 

static int a; 
static int d; 

static List<String> suits = new LinkedList<String>(); 

static List<String> cards = new LinkedList<String>(); 

static int[][] grid = new int[6][8]; 

public static void main(String[]args) 
{ 
    suits.add("Diamonds"); 
    suits.add("Clubs"); 
    suits.add("Hearts"); 
    suits.add("Spades"); 

    cards.add("1"); 
    cards.add("2"); 
    cards.add("3"); 
    cards.add("4"); 
    cards.add("5"); 
    cards.add("6"); 
    cards.add("7"); 
    cards.add("8"); 
    cards.add("9"); 
    cards.add("10"); 
    cards.add("11"); 
    cards.add("12"); 

    drawGrid(); 
} 
private static void drawGrid() 
{ 
    for(int b = 0; b < grid.length; b++) 
    { 
     for(int c = 0; c < grid[i].length; c++) 
     { 
      a = (int)(Math.floor(suits.size() * Math.random())); 
      d = (int)(Math.floor(suits.size() * Math.random())); 

      System.out.print(" |" + cards.get(d) + " " + suits.get(a) + "|"); 

      Collections.shuffle(suits); 
      Collections.shuffle(cards); 
     } 
     System.out.println(); 
    } 
} 
+2

В чем проблема с текущим кодом? Это работает или нет? – SMA

+2

Просто так вы знаете, что есть 13 каждого костюма. Ace -> 10 Jack Queen King –

+0

Почему у вас есть статический объект «Random», а затем использовать 'Math.random()' всюду? –

ответ

0

Есть разные способы сделать это. Моя первая идея заключалась бы в создании списка встроенных массивов.

ArrayList<int[]> list = new ArrayList<int []>(); 

    for (int i=0; i<suits.size(); i++) 
    { 
     for(int j=0; j<cards.size(); j++) 
     { 
      int[] card = {i,j}; 
      list.add(card); 
     } 
    } 

    Collections.shuffle(list); 

Теперь каждый элемент представляет собой карту. С помощью первых 6 элементов у вас есть 6 рандомизированных карт. элемент [0] = костюм и элемент [1] = cardnumber

0

Создайте переменную для запоминания, была ли рисуется карта или не

static boolean[][] drawn = new boolean[4][13]; 

Затем замените бит, где вы рисуете карту с:

do { 
    a = (int)(Math.floor(suits.size() * Math.random())); 
    d = (int)(Math.floor(cards.size() * Math.random())); 
} while (drawn[a][d]); 
drawn[a][d] = true; 

Наконец, удалите две линии, где вы перетасовываете свои две коллекции. Math.random предоставит вам случайную карту.

 Collections.shuffle(suits); 
     Collections.shuffle(cards); 
0

Что вы можете сделать, это хранить карты, которые вы предварительно выбрали, чтобы у вас не было дубликатов. Я уверен, что это поможет:

Создать набор, позволяет назвать его selectedCardMap:

static Set<String> selectedCardMap = new HashSet<String>(); 

Позволяет заменить эти две строки кода:

a = (int)(Math.floor(suits.size() * Math.random())); 
d = (int)(Math.floor(suits.size() * Math.random())); 

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

public static String getNewCard() { 

while (true) { 
    int a = (int)(Math.floor(suits.size() * Math.random())); 
    int d = (int)(Math.floor(suits.size() * Math.random())); 

    //Make a key for the map 
    String key= d+"-"+a; 


    //check if it was selected 
    if (!selectedCardMap.contains(key)) { 
     //This card is available, add it to selected and return it! 
     selectedCardMap.add(key); 
     return " |" + cards.get(d) + " " + suits.get(a) + "|";  
    } 
    } 
} 

После этого продолжайте с тем, что вы делали !, К сожалению, если есть код ошибки, я просто написал это без компиляции. Но это основная идея кода. Надеюсь, вы понимаете, и это полезно для вас.

Смежные вопросы