2013-08-27 48 views
6

Tôi đang gặp khó khăn khi cố tạo phương thức "shuffleDeck()".Làm thế nào để "trộn" một mảng?

Điều tôi đang cố làm là tạo phương thức sẽ lấy tham số mảng (sẽ là bộ bài) trộn các thẻ và trả về danh sách mảng xáo trộn.

Đây là mã:

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

Chuyển mảng thành 'Danh sách' và gọi' Bộ sưu tập.shuffle (danh sách) '. –

+0

Vâng, đúng vậy! – LastFreeNickname

+1

Mã bạn đăng là vô nghĩa vì nó thiếu phần quan trọng nhất - việc triển khai shuffle đã thử của bạn. Tôi đã bỏ phiếu để đóng như bạn đã không xuất hiện để đã cố gắng này cả. –

Trả lời

10

Làm thế nào về:

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

Còn về 'Thẻ []' thì sao? –

+1

Nhưng bạn đã bỏ lỡ kết quả của mình trong một lớp lót: biến nào chứa nội dung xáo trộn? ;) – UR6LAD

+0

Tôi đã sai: Arrays.asList tạo danh sách dựa trên mảng để khi Bộ sưu tập hoán đổi bất kỳ phần tử nào trong danh sách này, nó giống như trao đổi chúng trong mảng. – UR6LAD

0

Tôi thấy hai cách để làm điều đó:

-> Bạn có thể sử dụng một thuật toán ngẫu nhiên như các thuật toán Fisher-Yates shuffle nếu bạn muốn thực hiện chính mình phương pháp.

-> Bạn có thể sử dụng shuffle method from Collections

0

Nếu đây là một dự án trường học (như tôi nghĩ rằng đó là), bạn có thể không được phép sử dụng built-in chức năng như Bộ sưu tập :: ngẫu nhiên(). Nếu đây là trường hợp, sau đó bạn phải cố gắng để mô phỏng ngẫu nhiên (trong lập trình có thể được đáng ngạc nhiên cứng).

Cách phổ biến nhất để tạo cảm giác ngẫu nhiên là sử dụng RNG (random number generator). Như bạn nói

tôi đã cố gắng để có được hai con số chỉ số, và trao đổi chúng.

Đúng. Một cách để xáo trộn là chọn một thẻ tại một thời điểm và chọn ngẫu nhiên một thẻ khác để hoán đổi vị trí.

  • Bạn biết boong luôn có 52 thẻ.
  • Bạn có trình tạo ngẫu nhiên để chọn chỉ mục ngẫu nhiên.
  • Bạn có ngôn ngữ lập trình với cấu trúc vòng lặp.

Với những công cụ này, bạn có thể thực hiện chức năng trộn ngẫu nhiên của mình một cách dễ dàng.

2

Một cách là để chuyển đổi mảng vào một danh sách, và sử dụng java.util.Collections.shuffle(array) Tuy nhiên nhiều khi:

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

Nếu bạn vẫn cần một mảng thay vì một danh sách, bạn có thể thêm:

list.toArray(deck); 

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

Mã của TIO sao chép dưới đây tham khảo 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)); 
    } 
} 
Các vấn đề liên quan