[英]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.