Как мне два метода в отдельных классах ждать, прежде чем продолжить выполнение? - PullRequest
0 голосов
/ 08 февраля 2020

У меня есть два класса, BlackJack и BlackJackPane, BlackJack имеет метод с именем dealCards(), который дает класс с именем Player a Card путем цикла от первого Player до последнего Player дважды, как в реальной игре в блэкджек, где каждому игроку сдается по одной карте за раз.

BlackJackPane - это JFrame, который содержит JButtons и JLabels. JButton deal при нажатии имеет .actionCommand("deal") и ActionListener с лямбда-выражением, которое вызывает переменную экземпляра blackjack в BlackJackPane для раздачи карт, blackjack.dealCards(). ActionListener также определяет, какую карту из обычной колоды из 52 карт сдается Player для отображения правильных Card, которые есть у Player.

Я бы предпочел иметь dealCards() метод в BlackJack ждет после передачи Card в Player, чтобы JLabel был создан и отображен в JFrame, однако я не знаю, как заставить это работать между классами. Я открыт для других творческих возможностей или советов, как улучшить мой код.

Я пытаюсь сохранить классы инкапсулированными, а ввод / вывод ограничен BlackJackPane.

Это мой класс BlackJack

public class BlackJack
{

   private final Deck deck;
   private final ArrayList<Player> player;
   private final int numOfPlayers;

   public BlackJack(int players)
   {
       this.numOfPlayers = players + 1; // +1 for dealer, dealer is always first in arrayList
       this.deck = new Deck(Deck.TYPE[0]);
       this.player = new ArrayList();
       for (int i = 0; i < players + 1; i++)
       {
           this.player.add(new Player((i == 0))); //i == 0 is to say true to Player constructor that it is the dealer or cpu
       }
   }

   public void DealCards()
   {
       deck.shuffle();

       for (int i = 0; i < 2; i++)
       {
           for (int j = 0; j < player.size(); j++)
           {
               player.get(j).getHand().add(deck.getCard(0));
               deck.remove(0);
           }
       }
   }
}

Это BlackJackPane

    public class BlackJackPane extends JFrame
    {

       private BlackJack blackjack;
       private JLabel pokerTable;
       private JButton hit, stay, split, deal, hiddenCard;

       public BlackJackPane(BlackJack blackjack) throws IOException
       {
          this.blackjack = blackjack;
          display();
       }

       private void display() throws IOException
       {


        deal.addActionListener((event) ->
        {
            if (event.getActionCommand().equals("deal"))
            {
                blackjack.DealCards();

                for (int i = 0; i < 2; i++)
                {
                    for (int j = 0; j < blackjack.getNumOfPlayers(); j++)
                    {
                        if (blackjack.getPlayer(j).isCpu() && i != 1) //One card dealer has is face down
                        {

                        } else
                        {
                            if (blackjack.getPlayer(j).getHand().get(i).getFace() == 0) // face = 2
                            {
                                if (blackjack.getPlayer(j).getHand().get(i).getSuit() == 0) //clubs
                                {
                                   //Code to make and display the JLabel within the JFrame
                                } else if (blackjack.getPlayer(j).getHand().get(i).getSuit() == 1) //diamonds
                                {

                                } else if (blackjack.getPlayer(j).getHand().get(i).getSuit() == 2) //hearts
                                {

                                } else //spades
                                {

                                }
                            } else if() //and so on for 52 cards
                        }
                    }
                }
             }
        });
    }
}

1 Ответ

2 голосов
/ 08 февраля 2020

Вы можете переопределить свой метод dealCards, чтобы получить некоторый обратный вызов, который будет вызываться после раздачи каждой карты.

public void dealCards(BiConsumer<Player, Card> onDealtCallback) {
    for (Player player : players) {
        Card dealt = this.getNextCardToDeal();
        onDealtCallback.accept(player, dealt);
    }
}

А затем вызвать его с помощью чего-то вроде:

public void callIt() {
    this.blackJack.dealCards(this::drawLabel);
}

public void drawLabel(Player player, Card card) {
    // TODO
}

Я не могу сказать, что это наиболее объектно-ориентированный подход, и он не дает хорошего разделения состояния и пользовательского интерфейса. Но он должен делать то, что вы пытаетесь сделать.

(Примечание: это не место для проверки кода, поэтому я сопротивляюсь желанию предложить дополнительные предложения о том, «как улучшить ваш код»). .)

...