2016-06-15 26 views
0

我正在制作一个打牌游戏,似乎与arraylists有问题 我有1个arraylist,其中包含所有可用的游戏卡片, 和另一个播放列表用户选择使用的卡片。如何正确地将引用从一个Arraylist转移到另一个

第二个arraylist开始为空,并且当用户开始从第一个arraylist中挑选卡片时,该卡片被转移到第二个playlist中。

问题是,如果用户选择2张相同的卡片,那么一张卡片发生什么也会发生在另一张卡片上。因此,让我们说用户选择名为“超级男人”的卡两次。当一个超级人的健康下降时,另一个也下降。

我的代码看起来像这样用于添加卡choosen卡:

//choosenCards is the arraylist of cards that the user chooses 
//cards is the arraylist of available cards 
choosenCards.add(cards.get(index)); 
+2

您的问题是由于您只有一个“超级人”卡对象,但只有一个以上的参考。通过任何引用进行的更改都会影响单个对象,因此您会看到所有引用中的所有更改。如果您打算选择两张卡片,则需要更多对象。 – Kayaman

回答

0

如果您需要转移从cardschoosenCards你需要使用remove(index)

choosenCards.add(cards.remove(index)); 

请注意,从卡中取出卡后,最大可用索引之前少一个。

您代码改为将卡片添加到choosenCard,但不会从cards中删除。

+0

我不想转移。我仍然希望阵列列表中的卡牌留在那里。我只需要填入卡片arraylist与特定卡choosenCards arraylist –

+0

问题是,可能你需要真正转让卡。如果可能有重复,也许你需要添加同一张卡的不同副本。 –

2

“添加”这样的卡片实际上只是添加了一个指向原始对象的引用。你想要的可能是一个“深层复制”(所以你可以从原始版本获得两个独立版本)。

使用choosenCards.add((Class of the card object) cards.get(index).clone());

原因(Class of the card object)Object.clone()返回Object,然后需要被转换为正确的类型。

+1

为了实现这一点,Card类需要实现Cloneable接口并用公共方法重写Object.clone(受保护) –

+0

如何创建可复制的接口? –

+0

@HassanAhmed在类定义中添加'实现Cloneable'(然后你必须实现我认为的'clone()'函数)。它应该基本上只是初始化一个新的实例,并设置适当的值,如原来的。 :) – ToVine

相关问题