[英]How do I have two methods in separate classes wait before continuing execution?
我有兩個班, BlackJack
和BlackJackPane
, BlackJack
有一個方法叫dealCards()
這給了一個名為類Player
一Card
通過從第一循環Player
到最后一個Player
在大酒杯的一個真正的游戲,每個玩家發一張牌兩次像一次。
BlackJackPane
是一個包含 JButton 和 JLabel 的 JFrame。 單擊時 JButton deal
有一個.actionCommand("deal")
和一個ActionListener
和一個帶有 Lambda 表達式的ActionListener
,它調用BlackJackPane
的實例變量blackjack
來發牌, blackjack.dealCards()
。 ActionListener
還確定從常規 52 張紙牌中發給Player
的卡片類型,以顯示Player
擁有的正確Card
。
我希望在將Card
傳遞給Player
以在 JFrame 中創建和顯示 JLabel 后,讓BlackJack
的dealCards()
方法等待,但是,我不知道如何跨類進行這項工作。 我願意接受其他有關如何改進代碼的創意選項或提示。
我試圖將類封裝起來,並將 I/O 限制在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
}
}
}
}
});
}
}
您可以重新定義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
}
我不能說這是最面向對象的方法,它沒有很好地分離狀態和 UI。 但它應該做你想做的事。
(注意:這不是代碼審查的地方,所以我拒絕提供關於“如何改進代碼”的進一步建議的沖動。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.