Reputation: 23
In my main method, eclipse is giving me 'DeckOfCards can not be resolved to a variable' when trying to create a new deck
This started happening when I was combining multiple .java files into one for easier portability.
I am loosing sleep trying to fix this...Please help
import java.util.Random;
public class PokerGame {
class Card {
private String face; // face of card ("Ace", "Deuce", ...)
private String suit; // suit of card ("Hearts", "Diamonds", ...)
// two-argument constructor initializes card's face and suit
public Card(String cardFace, String cardSuit) {
face = cardFace; // initialize face of card
suit = cardSuit; // initialize suit of card
} // end two-argument Card constructor
// return String representation of Card
public String toString() {
return face + " of " + suit;
} // end method toString
}
class DeckOfCards {
private Card[] deck; // arrays of Card objects
private int currentCard; // index of next Card to be dealt (0-51)
private static final int NUMBER_OF_CARDS = 52; // constant # of Cards
// random number generator
private final Random randomNumbers = new Random();
// constructor fills deck of Cards
public DeckOfCards() {
String[] faces = {
"Ace", "Deuce", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King"
};
String[] suits = {
"Hearts", "Diamonds", "Clubs", "Spades"
};
deck = new Card[NUMBER_OF_CARDS]; // create array of Card objects
currentCard = 0; // set currentCard so first Card dealt is deck[ 0 ]
// populate deck with Card objects
for (int count = 0; count < deck.length; count++)
deck[count] = new Card(faces[count % 13], suits[count / 13]);
} // end DeckOfCards constructor
// shuffle deck of Cards with one-pass algorithm
public void shuffle() {
// after shuffling, dealing should start at deck[ 0 ] again
currentCard = 0; // reinitialize currentCard
// for each Card, pick another random Card (0-51) and swap them
for (int first = 0; first < deck.length; first++) {
// select a random number between 0 and 51
int second = randomNumbers.nextInt(NUMBER_OF_CARDS);
// swap current Card with randomly selected Card
Card temp = deck[first];
deck[first] = deck[second];
deck[second] = temp;
} // end for
} // end method shuffle
// deal one Card
public Card dealCard() {
// determine whether Cards remain to be dealt
if (currentCard < deck.length) return deck[currentCard++]; // return current Card in array
else return null; // return null to indicate that all Cards were dealt
} // end method dealCard
}
public static void main(String[] args) {
Card[] hand1, hand2;
PokerGame.DeckOfCards myDeckOfCards = DeckOfCards.new DeckOfCards();
myDeckOfCards.shuffle(); // place Cards in random order
hand1 = new Card[5];
hand2 = new Card[5];
// print 5 Cards in the order in which they are dealt
for (int i = 0; i < 10; i++) {
if (i == 0) //display hand labels
System.out.printf("Hand 1: \t Hand 2: \n");
if (i < 5) {
hand1[i] = myDeckOfCards.dealCard();
System.out.printf("%-19s", hand1[i]);
}
if (i >= 5) {
hand2[i - 5] = myDeckOfCards.dealCard();
System.out.printf("%-19s", hand2[i - 5]);
}
if ((i + 1) % 2 == 0) // output a newline after every other card
System.out.println();
} // end for
}
}
Upvotes: 1
Views: 608
Reputation: 839
Move Card and DeckOfCards definition outside of PokerGame class definition, like this
public class PokerGame {
//your code goes here
}
class Card {
//your code goes here
}
class DeckOfCards{
//your code goes here
}
This solves your problem of inner class instantiation, but it is not a good design. Class definitions should be in their respective files, so that it is easier to incorporate changes later on.
Upvotes: 0
Reputation: 425043
Your two classes Card
and DeckOfCards
should be static
, ie:
static class Card {
...
}
static class DeckOfCards {
...
}
Otherwise you need an instance of your PokerGame
class to create them, which is a design flaw,because PokerGame
has no "state" (no fields/variables).
Actually, they should be their own top=level class (in their own java file).
Upvotes: 1
Reputation: 2250
That's not how inner classes work.
You first need to create an instance of the PokerGame
instance:
PokerGame game = new PokerGame();
DeckOfCards myDeckOfCards = game.new DeckOfCards();
...
Upvotes: 0
Reputation: 13872
Change
PokerGame.DeckOfCards myDeckOfCards = DeckOfCards.new DeckOfCards();
to
PokerGame.DeckOfCards myDeckOfCards = new PokerGame.DeckOfCards();
Upvotes: 2
Reputation: 31952
DeckOfCards.new DeckOfCards();
This is wrong. Try new PokerGame.DeckOfCards()
or just new DeckOfCards();
Upvotes: 0