2013-12-16 6 views
1

Я пишу игру в покер, и есть все карты, хранящиеся в ArrayList, созданного в классе Deck:Как изменить arraylist из другого класса? Java

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 и поместить их в новый ArrayList под названием myHand:

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 карты все еще существуют.

Если я создаю метод getDeck() в классе руки и назвать его, первые пять карт удаляются, как ожидалось ...

Так что, похоже, как я одностороннюю связь между этими двумя классами; когда я изменяю ArrayList из класса Hand, класс Deck не знает об этом, и кажется, что каждый класс поддерживает отдельную версию ArrayList. Что тут происходит?

+0

Потому что вы создаете новый экземпляр объекта деки. Вы не хотите этого делать.Передайте объект Deck в метод Draw или создайте одноэлементный объект Deck. Вы не показываете свой основной класс, который организует приложение, но вы должны создать там один объект Deck, а затем передать его по мере необходимости. – OldProgrammer

ответ

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

  1. Java конвенции заключается в нижнем регистре методов (например Draw).
  2. Инициализация переменных внутри конструктор часто яснее.
  3. Объявление List<Card> myHand обычно предпочтительнее, поскольку оно имеет более высокий уровень абстракции.
+0

Спасибо! Это и есть. – user3105897

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. 
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

Это также имеет дело с управлением и логикой в ​​одном месте, так что это всегда то же самое ...

+0

Делает смысл. Спасибо – user3105897

+0

Как это помогает;) – MadProgrammer

Смежные вопросы