gpt4 book ai didi

java - 如何让不同类中的两个方法在继续执行之前等待?

转载 作者:行者123 更新时间:2023-12-02 01:05:22 24 4
gpt4 key购买 nike

我有两个类(class),BlackJackBlackJackPane , BlackJack有一个名为 dealCards() 的方法它给出了一个名为 Player 的类一个Card从第一个 Player 开始循环到最后Player两次就像真正的二十一点游戏一样,每个玩家一次发一张牌。

BlackJackPane是一个包含 JButton 和 JLabels 的 JFrame。 JButton deal单击时有 .actionCommand("deal")和一个ActionListener使用调用实例变量 blackjack 的 Lambda 表达式在BlackJackPane发牌,blackjack.dealCards()ActionListener还决定了常规 52 张牌组中的哪种牌 Player被处理以显示正确的Card Player有。

我更喜欢 dealCards() BlackJack中的方法通过 Card 后等待到 Player然而,对于要在 JFrame 中创建并显示的 JLabel,我不知道如何跨类进行此工作。我愿意接受其他创意选项或有关如何改进我的代码的技巧。

我试图将类封装起来,并将 I/O 限制在 BlackJackPane 中。 .

这是我的类(class)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。但它应该做你想做的事。

(注意:这不是进行代码审查的地方,因此我拒绝提供有关“如何改进代码”的进一步建议。)

关于java - 如何让不同类中的两个方法在继续执行之前等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60123612/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com