2013-08-27 12 views
6

Mam trudny czas próbując stworzyć metodę "shuffleDeck()".Jak "przetasować" tablicę?

Co próbuję zrobić, to stworzyć metodę, która weźmie parametr tablicy (który będzie talią kart) przetasować karty, i zwróci listę przetasowanych tablic.

Jest to kod:

class Card 
{ 
    int value; 
    String suit; 
    String name; 

    public String toString() 
    { 
     return (name + " of " + suit); 
    } 
} 

public class PickACard 
{ 
    public static void main(String[] args) 
    { 
     Card[] deck = buildDeck(); 
     // display Deck(deck); 

     int chosen = (int)(Math.random()* deck.length); 
     Card picked = deck[chosen]; 

     System.out.println("You picked a " + picked + " out of the deck."); 
     System.out.println("In Blackjack your card is worth " + picked.value + " points."); 

    } 

    public static Card[] buildDeck() 
    { 
     String[] suits = {"clubs", "diamonds", "hearts", "spades" }; 
     String[] names = {"ZERO", "ONE", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "Jack", "Queen", "King", "Ace" }; 

     int i = 0; 
     Card[] deck = new Card[52]; 

     for (String s: suits) 
     { 
      for (int v = 2; v<=14; v++) 
      { 
       Card c = new Card(); 
       c.suit = s; 
       c.name = names[v]; 
       if (v == 14) 
        c.value = 11; 
       else if (v>10) 
        c.value = 10; 
       else 
        c.value = v; 

       deck[i] = c; 
       i++; 
      } 
     } 
     return deck; 
    } 

    public static String[] shuffleDeck(Card[] deck) 
    { 
     /** I have attempted to get two index numbers, and swap them. 
     I tried to figure out how to loop this so it kind of simulates "shuffling". 
     */ 
    } 

    public static void displayDeck(Card[] deck) 
    { 
     for (Card c: deck) 
     { 
      System.out.println(c.value + "\t" + c); 
     } 
    } 
} 
+4

Konwertuj tablicę na 'List' i wywołaj' Collections.shuffle (list) '. –

+0

Tak, to wszystko! – LastFreeNickname

+1

Kod, który wysłałeś, jest bez znaczenia, ponieważ brakuje w nim najważniejszej części - próbnej implementacji shuffle. Głosowałem za zamknięciem, ponieważ nie wydawało się, że próbowałeś tego w ogóle. –

Odpowiedz

10

Jak o:

List<Card> list = Arrays.asList(deck); 
Collections.shuffle(list); 
+0

Co z 'Card []'? –

+1

Ale przegapiłeś swój wynik w jednolinijkowej: która zmienna zawiera tasowane treści? ;) – UR6LAD

+0

Myliłem się: Arrays.asList tworzy listę opartą na tablicy, więc gdy Collections zamienia dowolne elementy na tej liście, zmienia się tak samo, jak zamienia je w tablicy. – UR6LAD

0

Jeśli jest to dla szkolnego projektu (jak myślę, że jest), to może nie być wolno używać wbudowanych funkcji, takich jak Kolekcje :: shuffle(). W takim przypadku należy spróbować zasymulować przypadkowość (która w programowaniu może być zaskakująco trudna).

Najpopularniejszym sposobem na stworzenie poczucia losowości jest użycie RNG (random number generator). Jak powiedział

starałem się dostać dwa numery indeksów i zamienić je.

Prawidłowo. Jednym ze sposobów przetasowania jest wybranie jednej karty na raz i losowe wybranie innej karty do zamiany pozycji.

  • Wiesz, że talia zawsze ma 52 karty.
  • Masz losowy generator , aby wybrać losowy indeks.
  • Masz język programowania ze strukturami pętli .

Z łatwością można zaimplementować własną funkcję shuffle.

2

Jednym ze sposobów jest, aby przekształcić tablicę do listy i użyć java.util.Collections.shuffle(array) aby go shuffle

Card[] deck = ...; 
List<Card> list = Arrays.asList(deck); 
Collections.shuffle(list); 

Jeśli nie jeszcze trzeba tablicę zamiast listy można dodać:

list.toArray(deck); 

Here is a TIO (Try-it-online) link to see the array to list conversion and shuffling in action.

Kodeks Tio przytoczone poniżej, jak odnoszą ence:

import java.util.Arrays; 
import java.util.Collections; 
import java.util.List; 

class M{ 
    public static void main(String[] a){ 
    // Original array 
    Integer[] array = new Integer[]{ 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
    System.out.println("before: " + Arrays.toString(array)); 

    // Convert array to list 
    List<Integer> list = Arrays.asList(array); 
    // And shuffle that list 
    Collections.shuffle(list); 
    System.out.println("after as list: " + list); 

    // (Optional) then convert the list back to an array, 
    // and save it in its initial variable (`array` in this case) 
    list.toArray(array); 
    System.out.println("after as array: " + Arrays.toString(array)); 
    } 
}