0

我被分配了创建臭名昭著的“UNO”游戏的任务。我在使用其中一种方法时遇到了麻烦,如果他们选择玩它,它应该会“删除”玩家手中的一张卡片对象。我想你必须玩过UNO才能理解。无论如何,这里是该方法应该是什么的描述:

创建一个名为 removeCardFromHand 的方法,该方法将整数索引作为参数,并在玩家手的该位置移除并返回卡片。如果指定的索引与手中的一张牌不对应,则该方法应抛出 IndexOutOfBoundsException。取出卡片后,应根据需要重新排列剩余卡片,使其占据阵列的最左侧位置。一种方法是将最右边的卡片移动到要移除的卡片的位置。例如,如果手牌当前是四张牌{蓝色 3,红色 2,黄色 7,绿色 1},而您要移除位置 1 的牌(红色 2),您可以用最后一张牌(绿色1),因此得到的手牌是:{蓝 3,绿 1,黄 7}。

不幸的是,我不允许使用数组列表或向量,只能使用简单的旧数组

到目前为止,这是我的代码:

public Card removeCardFromHand(int n)
{
    Card c = cards[n];
    for(int i = n; i < cards.length; i--)
    {
        cards[n] = cards[n + 1];
    }
    c = cards[cards.length - 1];
    return c;
}  

显然这是不对的,但我只是不确定该怎么做。

4

2 回答 2

1

假设数组是使用静态大小创建的。您将无法通过重新分配数组的长度来更改数组大小。可能会给您尝试这样做的错误。

在课堂里

Add a new variable in the Class, ie. int numberOfCardsInHand.

在方法 removeCardFromHand

Make a copy of the card to discard, i.e. discardCard.

Iterate from i = n to i < numberOfCardsInHand
  Left shift the remaining cards to the right of the discarded card.

Decrement numberOfCardsInHand by 1.

Return discardCard
于 2012-04-26T22:05:50.793 回答
1

你几乎明白了,除了你将数组中的所有卡片向左移动一个位置,所以你正在丢弃最左边的卡片,并且你将“移除”的卡片留在数组中,除非它恰好是最左边的一。您只想从已移除卡片右侧(较高索引)的卡片开始移动。既然我认为这是作业,我会让你找出你需要改变的一种表达方式 ;-)

于 2012-04-26T20:04:13.747 回答