Can't see me
Can't see me

Reputation: 501

Arrays, algorithms and elements

I am trying to make a poker game through java. The first thing I wanted to do is distribute 5 cards using arrays. I have done the distribution part, but how can I prevent the same cards being distributed twice. In other words, how can I check if an array already contains an element. I want it to be able to detect if the element already exists in an array, and if it does, I want to be able to change just that card that has been given out twice, help would be much appreciated. My codes down below,

      import java.util.Random;
      import java.util.Scanner;
      import java.util.Arrays;


    public class Poker
    {
        public final static String[] numbers = {"❤","♠","♦","♣"};  
        public final static String[] sign = {"1","2","3","4","5","6","7","8","10","J","Q","K","A"};
        private String[] hand = {"","","","",""};
        private boolean found;
        private Random random;

       public Poker()

        {

           found = false;
           String hand[] = {"","","","",""};
           int tokens = 10;

           Scanner in = new Scanner(System.in);
           random = new Random();
        }

       public void handOut()
        {

           for (int i = 0; i < 5; i++)
           {
               int numberRandom = random.nextInt(numbers.length);
               int signRandom = random.nextInt(sign.length);
               String pickedNumber = numbers[numberRandom];
               String pickedSign = sign[signRandom];
               String combinedSigns = pickedSign + pickedNumber;
               hand[i] = combinedSigns;
           System.out.print(hand[i] + " ");

       }
        System.out.println("\n");

   }
   }

Upvotes: 0

Views: 106

Answers (3)

Joel Christophel
Joel Christophel

Reputation: 2643

What you want to do is break your code into different methods. You should have a method for generating one card, a method for checking whether or not a card is in the hand, and a method to distribute cards to the hand.

public String generateCard() {
    int numberRandom = random.nextInt(numbers.length);
    int signRandom = random.nextInt(sign.length);
    String pickedNumber = numbers[numberRandom];
    String pickedSign = sign[signRandom];
    return pickedSign + pickedNumber;
}

public static boolean cardIsInHand(String card) {
    for(int i = 0; i < 5; i++) {
        if(hand[i] != null && hand[i].contains(card)) {
            return true;
        }
    }

    return false;
}

public static void handout() {
    for (int i = 0; i < 5; i++) {
        String card = generateCard();

        while(cardIsInHand(card)) {
            card = generateCard();
        }

        hand[i] = card;
    }
}

Upvotes: 1

vandale
vandale

Reputation: 3650

If you can use the collections framework as opposed to an array, create a Stack and populate it with all the 52 cards. then call Collections.shuffle() on it. finally set hand[i]=(deck name).pop()

Once a card is popped from the stack it will be removed from the deck so it can't be dealt again.

Upvotes: 2

paxdiablo
paxdiablo

Reputation: 881153

Your choice of terminology is ... err ... interesting :-)

The card value is a "face value", not a sign. And whether it's hearts or diamonds or so on, that's its "suit" rather than its number.

But, on to the question. I believe the best way to do this is to construct an entire 52-card deck out of your facevalue and suit arrays and then use a Fisher Yates shuffle to distribute cards.

This is a nifty way to randomly choose elements from an array without duplicates. The beauty is that the items in the array don't actually need to be shuffled up front. Details on how it works can be found here.

Upvotes: 2

Related Questions