2016-10-26 1 views
0

Désolé si c'est long mais j'écris un programme qui dessine une main de poker (5 cartes différentes) d'un paquet standard de 52. La seule partie avec laquelle je lutte encore est d'obtenir des cartes différentes. Le code que j'ai maintenant est aussi simple que possible et fonctionne pour la plupart, mais parfois peut dessiner la même carte plus d'une fois. Je veux que la carte soit retirée du paquet une fois qu'elle est dessinée et je suis coincé sur cette partie.Comment obtenir différents objets aléatoires différents dans un tableau?

Card[] hand = new Card[5]; 
     for (int i = 0; i < 5; i += 1) 
     { 
      int index = rand.nextInt(52); 
      hand[i] = cards[index]; 
     } 
    return hand; 
+0

Comme il s'agit d'un tableau, vous ne pouvez pas vraiment le "supprimer" puisque l'index est toujours là; Au lieu de cela, une fois que vous l'avez dessiné, essayez de définir cet index sur null. – SomeStudent

+0

Vous pouvez être inspiré par http://stackoverflow.com/questions/8115722/generating-unique-random-numbers-in-java – SomeDude

+0

comme mentionné par @SomeStudent, êtes-vous autorisé à utiliser autre chose qu'un tableau? Comme une ArrayList par exemple. Vous pouvez ensuite supprimer l'objet lorsque vous le choisissez au hasard, et ensuite il ne sera pas disponible pour les tirages suivants (si vous faites cela, n'oubliez pas d'appeler nextInt avec une variable: rand.nextInt (numberOfCardsRemaining)). – alexbt

Répondre

1

Vous pouvez créer un ArrayList comme

List<Card> cards = new ArrayList<>(); 

// add 52 cards to cards 

Card[] hand = new Card[5]; 
for (int i = 0; i < 5; i ++) { 
    int index = rand.nextInt(cards.size()); 
    hand[i] = cards.remove(index); 
} 
+0

Je pense que vous vouliez dire rand.nextInt (cards.size()) pas rand.nextInd (cards.size()) – BigMonkey89WithaLeg

+0

Oh oui, merci d'avoir signalé cela. –

+0

Merci! Marqué comme répondu. –

2

Utilisez List et Collections.shuffle().

List<Card> cards = new ArrayList<>(52); 
for (int i = 0; i < 52; i++) { 
    cards.add(new Card(i)); // or so 
} 
Collections.shuffle(cards); 

Card[] hand = new Card[5]; 
for (int i = 0; i < 5; i += 1) { 
    hand[i] = cards.remove(0); 
} 

return hand; 
0

Vous pouvez littéralement faire ce que vous faites avec un jeu de cartes:

class Deck 
{ 
    private LinkedList<Card> cards = new LinkedList<Card>(); 

    Deck() 
    { 
      for (i=0; i<52; ++i) { 
       // or however you want to correctly create a card 
       cards.add(new Card(i)) 
      } 
    } 

    public Card takeRandomCard() 
    { 
      int takeCard = rand.nextInt(cards.size()); 
      return cards.remove(takeCard); 
    } 
} 

int handSize = 5; 
Deck deck = new Deck(); 
Card[] hand = new Card[handSize]; 
for (int i=0; i<handSize; ++i) { 
    hand[i] = deck.takeRandomCard(); 
} 

Cela peut ne pas être la méthode la plus efficace, mais il est, espérons assez clair ce qu'il fait.

Le tirage de cartes aléatoires peut ou non être plus rapide que le brassage de la totalité du jeu en premier. LinkedList est plus rapide que ArrayList lors de la suppression d'entrées aléatoires. Probablement pas pertinent mais vraiment.

0

Il suffit de créer un List de Integer s allant de 1 à 50. J'ai démontré cet exemple en utilisant Java 1.8.

public class NumUtility { 
    public static List<Integer> shuffle() { 
     List<Integer> range = IntStream.range(1, 53).boxed() 
       .collect(Collectors.toCollection(ArrayList::new)); 
     Collections.shuffle(range); 
     return range; 
    } 
} 

Maintenant vous pouvez parcourir les index 1 à 5 et quand vous voulez des nombres mélangés, appelez simplement la méthode ci-dessus.

Card[] hand = new Card[5]; 

//call this method whereever you want random integers. 
List<Integer> range = NumUtility.shuffle(); 

for (int i = 0; i < 5; i += 1) { 
    hand[i] = range.get(i); 
} 
return hand;