我正在写一个扑克游戏,并将所有卡存储在Deck类中创建的arraylist中:
public class Deck {
ArrayList<Card> deck = new ArrayList<Card>();
Deck(){ //Build the deck in order.
for(int suit = 1; suit <= 4; suit++){
for(int rank = 1; rank <= 13; rank++){
Card card = new Card(rank, suit);
deck.add(card);
}
}
}
。 。
我想要另一个类 - 手工绘制arraylist中的前五个元素并将它们放入一个名为myHand的新arraylist中:
public class Hand {
ArrayList<Card> myHand = new ArrayList<Card>();
Deck deckObject = new Deck();
public void Draw(){ //Draws the top 5 cards of the deck and puts them in your hand ArrayList.
for(int i = 0; i <= 4; i++){
myHand.add(deckObject.deck.get(0));
deckObject.deck.remove(0);
}
}
。 。 。 到现在为止还挺好。当我从主类中显示手ArrayList时,我得到了牌组中的前五张牌。但是,当我从Deck类显示牌组时(在调用Draw()方法之后),所有52张牌仍在那里。
如果我在Hand类中创建了一个getDeck()方法并调用它,那么前五张牌会按预期删除...
所以我觉得这两个班级之间有单向交流;当我从Hand类修改ArrayList时,Deck类不知道它,并且似乎每个类都保留了ArrayList的单独版本。这是怎么回事?
答案 0 :(得分:3)
每个Hand
都有自己的Deck
。你想在很多人手中分享一个Deck
。
我想你想要这样的东西:
public class Hand {
Deck deck;
ArrayList<Card> myHand = new ArrayList<Card>();
Hand(Deck deck) {
this.deck = deck;
}
public void removeCard(Card card) {
deckObject.deck.remove(card);
}
public void Draw() {
for(int i = 0; i <= 4; i++) {
myHand.add(deckObject.deck.get(0));
deckObject.deck.remove(0);
}
}
}
然后
Deck deck = new Deck();
Hand hand1 = new Hand(deck);
Hand hand2 = new Hand(deck);
hand1.Draw();
hand2.Draw();
FYI
Draw
)。List<Card> myHand
,因为它具有更高的抽象级别。答案 1 :(得分:0)
我会在您的Hand
方法Draw()
中尝试这一点,该方法应该真正命名为draw()
。
if (deckObject.deck.size() > 0) { // Are there cards in the deck?
myHand.add(deckObject.deck.remove(0)); // add the card removed from
// the deck to the Hand.
} else {
break; // No cards.
}
// deckObject.deck.remove(0); // Already taken care of.
答案 2 :(得分:0)
一般来说,你不希望别人搞乱你对象的内部状态。相反,您希望提供允许其他对象与其交互的方法,例如......
public class Deck {
private ArrayList<Card> deck = new ArrayList<Card>();
Deck(){ //Build the deck in order.
for(int suit = 1; suit <= 4; suit++){
for(int rank = 1; rank <= 13; rank++){
Card card = new Card(rank, suit);
deck.add(card);
}
}
}
public Card[] draw(int count) {
Card[] cards = new Card[count];
if (count < deck.size()) {
for(int i = 0; i < count; i++){
cards[i] = deckObject.deck.remove(0);
}
} else {
throw new IllegalStateException("Can not with draw " + (count + 1) + " from deck that only has " + deck.size() + " cards");
}
return cards;
}
通过这种方式,您可以保护Cards
的内部状态,同时提供其他对象与您的Deck
进行互动的能力
这也涉及单个地方的管理和逻辑,因此总是相同......