Defining lots of variables in java
I am working on a project for my computer science class. My teacher wants us to create a program that has a deck of cards that you can shuffle and get hold of. He wants us to create a map class that has the variables suitName, suitValue, faceName, and faceValue. I currently have some code that looks like this:
//Construct Array
Card[] deck = new Card[52];
//Define cards
Card aceSpades = new Card("Spades", 1, "Ace", 1);
Card aceHearts = new Card("Hearts", 2, "Ace", 1);
Card aceClubs = new Card("Clubs", 3, "Ace", 1);
Card aceDiamonds = new Card("Diamonds", 4, "Ace", 1);
Card twoSpades = new Card("Spades", 1, "Two", 2);
Card twoHearts = new Card("Hearts", 2, "Two", 2);
Card twoClubs = new Card("Clubs", 3, "Two", 2);
Card twoDiamonds = new Card("Diamonds", 4, "Two", 2);
Card threeSpades = new Card("Spades", 1, "Three", 3);
Card threeHearts = new Card("Hearts", 2, "Three", 3);
Card threeClubs = new Card("Clubs", 3, "Three", 3);
Card threeDiamonds = new Card("Diamonds", 4, "Three", 3);
Card fourSpades = new Card("Spades", 1, "Four", 4);
Card fourHearts = new Card("Hearts", 2, "Four", 4);
Card fourClubs = new Card("Clubs", 3, "Four", 4);
Card fourDiamonds = new Card("Diamonds", 4, "Four", 4);
Card fiveSpades = new Card("Spades", 1, "Five", 5);
Card fiveHearts = new Card("Hearts", 2, "Five", 5);
Card fiveClubs = new Card("Clubs", 3, "Five", 5);
Card fiveDiamonds = new Card("Diamonds", 4, "Five", 5);
Card sixSpades = new Card("Spades", 1, "Six", 6);
Card sixHearts = new Card("Hearts", 2, "Six", 6);
Card sixClubs = new Card("Clubs", 3, "Six", 6);
Card sixDiamonds = new Card("Diamonds", 4, "Six", 6);
Card sevenSpades = new Card("Spades", 1, "Seven", 7);
Card sevenHearts = new Card("Hearts", 2, "Seven", 7);
Card sevenClubs = new Card("Clubs", 3, "Seven", 7);
Card sevenDiamonds = new Card("Diamonds", 4, "Seven", 7);
Card eightSpades = new Card("Spades", 1, "Eight", 8);
Card eightHearts = new Card("Hearts", 2, "Eight", 8);
Card eightClubs = new Card("Clubs", 3, "Eight", 8);
Card eightDiamonds = new Card("Diamonds", 4, "Eight", 8);
Card nineSpades = new Card("Spades", 1, "Nine", 9);
Card nineHearts = new Card("Hearts", 2, "Nine", 9);
Card nineClubs = new Card("Clubs", 3, "Nine", 9);
Card nineDiamonds = new Card("Diamonds", 4, "Nine", 9);
Card tenSpades = new Card("Spades", 1, "Ten", 10);
Card tenHearts = new Card("Hearts", 2, "Ten", 10);
Card tenClubs = new Card("Clubs", 3, "Ten", 10);
Card tenDiamonds = new Card("Diamonds", 4, "Ten", 10);
Card jackSpades = new Card("Spades", 1, "Jack", 11);
Card jackHearts = new Card("Hearts", 2, "Jack", 11);
Card jackClubs = new Card("Clubs", 3, "Jack", 11);
Card jackDiamonds = new Card("Diamonds", 4, "Jack", 11);
Card queenSpades = new Card("Spades", 1, "Queen", 12);
Card queenHearts = new Card("Hearts", 2, "Queen", 12);
Card queenClubs = new Card("Clubs", 3, "Queen", 12);
Card queenDiamonds = new Card("Diamonds", 4, "Queen", 12);
Card kingSpades = new Card("Spades", 1, "King", 13);
Card kingHearts = new Card("Hearts", 2, "King", 13);
Card kingClubs = new Card("Clubs", 3, "King", 13);
Card kingDiamonds = new Card("Diamonds", 4, "King", 13);
deck[0] = aceSpades;
deck[1] = aceHearts;
deck[2] = aceClubs;
deck[3] = aceDiamonds;
deck[4] = twoSpades;
deck[5] = twoHearts;
deck[6] = twoClubs;
deck[7] = twoDiamonds;
deck[8] = threeSpades;
deck[9] = threeHearts;
deck[10] = threeClubs;
deck[11] = threeDiamonds;
deck[12] = fourSpades;
deck[13] = fourHearts;
deck[14] = fourClubs;
deck[15] = fourDiamonds;
deck[16] = fiveSpades;
deck[17] = fiveHearts;
deck[18] = fiveClubs;
deck[19] = fiveDiamonds;
deck[20] = sixSpades;
deck[21] = sixHearts;
deck[22] = sixClubs;
deck[23] = sixDiamonds;
deck[24] = sevenSpades;
deck[25] = sevenHearts;
deck[26] = sevenClubs;
deck[27] = sevenDiamonds;
deck[28] = eightSpades;
deck[29] = eightHearts;
deck[30] = eightClubs;
deck[31] = eightDiamonds;
deck[32] = nineSpades;
deck[33] = nineHearts;
deck[34] = nineClubs;
deck[35] = nineDiamonds;
deck[36] = tenSpades;
deck[37] = tenHearts;
deck[38] = tenClubs;
deck[39] = tenDiamonds;
deck[40] = jackSpades;
deck[41] = jackHearts;
deck[42] = jackClubs;
deck[43] = jackDiamonds;
deck[44] = queenSpades;
deck[45] = queenHearts;
deck[46] = queenClubs;
deck[47] = queenDiamonds;
deck[48] = kingSpades;
deck[49] = kingHearts;
deck[50] = kingClubs;
deck[51] = kingDiamonds;
Is there any more efficient way to do this
source to share
The following code might work for you. It just iterates over the two enums and also shuffles the cards for you.
The following abstractions are used:
-
Suit
-
Rank
-
Card
(aRank
and aSuit
) -
Deck
: contains cards (reshuffled if necessary)
Lightweight abstraction to work with non-commercial code to store all maps.
public enum Rank {
ace, two, three, four, five, six, seven, eight, nine, ten, jack, queen, king
}
public enum Suit {
hearts, clubs, diamonds, spades
}
public class Card {
private final Rank rank;
private final Suit suit;
public Card(Rank rank, Suit suit) {
this.rank = rank;
this.suit = suit;
}
public Rank rank() {
return rank;
}
public Suit suit() {
return suit;
}
}
public class Deck {
// Static
private static final List<Card> allCards = new ArrayList<>();
static {
for (Suit s : Suit.values()) {
for (Rank r : Rank.values()) {
allCards.add(new Card(r, s));
}
}
}
private final List<Card> shuffledCards;
public Deck() {
// Shuffle
shuffledCards= new ArrayList<>(allCards);
Collections.shuffle(shuffledCards);
}
public Iterable<Card> shuffledCards() {
return shuffledCards;
}
}
source to share
To keep things simpler, here's what I would do (just my two cents):
-
In your class,
Card
just create your constructor with two take argumentsint
and assign values ββto your variablessuitName
andfaceName
, for example:public Card(int suitValue, int faceValue) { switch (suitValue) { case 1: suitName = "Spades"; break; case 2: suitName = "Hearts"; break; case 3: suitName = "Clubs"; break; case 4: suitName = "Diamonds"; break; default: throw new RuntimeException("Invalid suit value: " + String.valueOf(suitValue)); } // same for faceName this.suitValue = suitValue; this.faceValue = faceValue; }
-
Create an array using a loop:
Card[] deck = new Card[52]; for (int k = 1; k <= 4; k++) { for (int l = 1; l <= 13; l++) { card[(k-1)*13+(l-1)] = new Card(k,l); } }
source to share
I would do it like this:
String[] suitNames = {"Spades", "Hearts", "Clubs", "Diamonds" };
String[] faceNames = {"ace", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "jack", "queen", "king"};
List<Card> deck = new ArrayList<Card>();
for (int i = 0; i < suitNames.length; i++) {
String suitName = suitNames[i];
int suitValue = i + 1;
for (int j = 0; j < faceNames.length; j++) {
String faceName = faceNames[j];
int faceValue = j + 1;
Card c = new Card(suitName, suitValue, faceName, faceValue);
deck.add(c);
}
}
source to share