...

View Full Version : Getting object vars after retrieval from vector



dan-dan
04-27-2012, 05:06 PM
I just started out trying to make a simple card game as of last night.

My problem is on line 16 and 17 of the first file. I have successfully created the 52 objects with variables for the cards, and once created they are placed into a Vector (the deck). Just to test it worked I used the below code, but the name is underlined and I get the error name cannot be resolved or is not a field.

Does anyone know why this may be? The objects are deffinately in the Vector, I just can't get to the variables they contain.

Thanks.



Object ob = (Object) Cards.deck.get(i);
System.out.println(ob.name);


****head.java


import javax.swing.JOptionPane;

public class ****head {

public ****head() {

int p = 0;
for (int i = 0; i < Cards.allCards.length; i++) {
p = p != 13 ? p : 0;
Cards card = new Cards();

card.name = Cards.allCards[i];
card.cardValue = p + 1;
card.imgPath = "images\\cards\\" + card.name + ".gif";
Cards.deck.add(card);
Object ob = (Object) Cards.deck.get(i);
System.out.println(ob.name);
p++;
}
}


public static void main(String[] args) {
****head sh = new ****head();

}
}


Cards.java


import java.util.Vector;

public class Cards {

static String[] allCards = {
"A-Hearts", "2-Hearts", "3-Hearts", "4-Hearts", "5-Hearts",
"6-Hearts", "7-Hearts", "8-Hearts", "9-Hearts", "10-Hearts",
"J-Hearts", "Q-Hearts", "K-Hearts",

"A-Dimonds", "2-Dimonds", "3-Dimonds", "4-Dimonds", "5-Dimonds",
"6-Dimonds", "7-Dimonds", "8-Dimonds", "9-Dimonds", "10-Dimonds",
"J-Dimonds", "Q-Dimonds", "K-Dimonds",

"A-Clubs", "2-Clubs", "3-Clubs", "4-Clubs", "5-Clubs",
"6-Clubs", "7-Clubs", "8-Clubs", "9-Clubs", "10-Clubs",
"J-Clubs", "Q-Clubs", "K-Clubs",

"A-Spades", "2-Spades", "3-Spades", "4-Spades", "5-Spades",
"6-Spades", "7-Spades", "8-Spades", "9-Spades", "10-Spades",
"J-Spades", "Q-Spades", "K-Spades"
};


static String name;
static int cardValue;
static String imgPath;

static Vector <Object> deck = new Vector<Object>(allCards.length);

public Cards() { }

}

Fou-Lu
04-27-2012, 07:08 PM
It never will. Object is a base type that contains no properties, and your Card doesn't represent what it is.
You'll need to represent a card as an object, and a deck of Card. I'd represent the suit and value as an enum string pair:



public class Card implements Comparable<Card>
{
public static enum Suit
{
HEART ("Hearts"),
SPADE ("Spades"),
CLUB ("Clubs"),
DIAMOND ("Diamonds");

private final String sSuit;

Suit(String s)
{
this.sSuit = s;
}

public String getSuit()
{
return this.sSuit;
}
}

public static enum FaceValue
{
ACE ("A"),
TWO ("2"),
THREE ("3"),
FOUR ("4"),
FIVE ("5"),
SIX ("6"),
SEVEN ("7"),
EIGHT ("8"),
NINE ("9"),
TEN ("10"),
JACK ("J"),
QUEEN ("Q"),
KING ("K");

private final String sValue;

FaceValue(String s)
{
this.sValue = s;
}

public String getValue()
{
return this.sValue;
}
}


private Suit suit;
private FaceValue value;

public Card(Suit suit, FaceValue value)
{
this.suit = suit;
this.value = value;

}

public Card(String suit, String value)
{
this.suit = Suit.valueOf(suit);
this.value = FaceValue.valueOf(value);
}

public Suit getSuit()
{
return this.suit;
}

public FaceValue getValue()
{
return this.value;
}

public int compareTo(Card c)
{
int iResult = this.suit.compareTo(c.suit);
if (iResult == 0)
{
iResult = this.value.compareTo(c.value);
}

return iResult;
}

public String toString()
{
return this.value.getValue() + "-" + this.suit.getSuit();
}
}


And the deck as an array list. I like the list since you can shuffle it, but without an override it will accept duplicate values.


import java.util.Collections;
import java.util.ArrayList;


public class Deck extends ArrayList<Card>
{
private static final long serialVersionUID = 7465934980544707488L;

public static void main(String... argv)
{
Deck d = new Deck();

// Populate the deck with one of each suit and face value.
for (Card.Suit s : Card.Suit.values())
{
for (Card.FaceValue v : Card.FaceValue.values())
{
d.add(new Card(s, v));
}
}

Collections.shuffle(d);
System.out.println("shuffled:");
for (Card c : d)
{
System.out.println(c);
}

Collections.sort(d);
System.out.println("sorted:");
for (Card c : d)
{
System.out.println(c);
}
}
}


I like the enums since you can do a lot with them. It forces specific allowed entries and lets you run a switch on them unlike a string.


Oh, btw I should mention simplicity as well. If you don't really care about a Deck or a Card, you can represent it just using the String array you have. That can be thrown into a list and Shuffled as well and print just as a string:


public static void main(String[] argv)
{
String[] allCards = {
"A-Hearts", "2-Hearts", "3-Hearts", "4-Hearts", "5-Hearts",
"6-Hearts", "7-Hearts", "8-Hearts", "9-Hearts", "10-Hearts",
"J-Hearts", "Q-Hearts", "K-Hearts",

"A-Dimonds", "2-Dimonds", "3-Dimonds", "4-Dimonds", "5-Dimonds",
"6-Dimonds", "7-Dimonds", "8-Dimonds", "9-Dimonds", "10-Dimonds",
"J-Dimonds", "Q-Dimonds", "K-Dimonds",

"A-Clubs", "2-Clubs", "3-Clubs", "4-Clubs", "5-Clubs",
"6-Clubs", "7-Clubs", "8-Clubs", "9-Clubs", "10-Clubs",
"J-Clubs", "Q-Clubs", "K-Clubs",

"A-Spades", "2-Spades", "3-Spades", "4-Spades", "5-Spades",
"6-Spades", "7-Spades", "8-Spades", "9-Spades", "10-Spades",
"J-Spades", "Q-Spades", "K-Spades"
};
java.util.List<String> cards = Arrays.asList(allCards);
java.util.Collections.shuffle(cards);
for (String s : cards)
{
System.out.println(s);
}
}


Depending on exactly what you want to do, sometimes simplicity is for the better.

dan-dan
04-29-2012, 06:35 PM
Wow, thanks Fou-Lu! I've tried your code and it works great. I understand what you're saying.

My first attempt actually used a String array and used the Collections.shuffle method, though I dropped it. I'm still struggling with classes and objects so this is pretty difficult understanding the best (and legal) approach.

Thanks again.



EZ Archive Ads Plugin for vBulletin Copyright 2006 Computer Help Forum