我正在制作纸牌游戏(特别是那些知道那是什么的牌游戏!)并且在整个游戏中,玩家将“购买”卡片添加到他们的牌组中,并且每张牌都有一个点值相关联用它。我有一个JTextField,我想每次将卡添加到播放器套牌时更新,我不确定如何去做。我尝试添加这个:
int deckScore = 0;
for (Card d : player_1_deck)
{
deckScore += d.getValue();
}
deckScoreTextBox.setText(Integer.toString(deckScore));
但我不确定它会起作用(提示:它没有)。但是,如果我把它放在每个卡槽的mouseClickEvent下面,它确实有效。这个问题是,其他玩家将能够将牌添加到你的牌组并取走牌,这不会立即更新。我的google-foo让我认为我需要使用某种类型的监听器,但我仍然是一个菜鸟,并且不确定它是如何工作的,并且我无法理解教程和指南。如果我是正确的,并且听众实际上是必要的,那么这样的事情会怎么样?如果没有,我还有其他选择吗?
我不确定SSCCE需要什么,因为这是一个比我的应用程序更广泛的问题,但你可以从我上面的代码片段看到,我的文本框名为deckScoreTextBox,我使用deckScore作为我的变量。
答案 0 :(得分:2)
嗯,这是 encapsulation 进入的地方。
假设您的套牌在数组列表中:
ArrayList<Card> deck = new ArrayList<>();
现在,当您在卡组中添加卡片或从卡片组中删除卡片时,您可以只调用列表中的add
和remove
功能。
有一个更好的主意:创建两个函数addCard
和removeCard
,这些将是使用卡片(和shuffle
等)处理卡片的唯一方法,并解决重新计算仅在影响卡数的函数中使用套牌值。
您还可以创建一个单独的类Deck
并将字段deck
设为私有,这样您就可以100%保证每个人(如果您单独编程,则为=)仅使用安全函数{{1不直接调用list的函数。
它看起来如何:
addCard