我被分配了创建臭名昭着的“UNO”游戏的任务。我遇到了其中一种方法的问题,如果他们选择播放它,它应该“删除”玩家手中的一个卡片对象。我想你必须让UNO去理解。无论如何,这里是方法应该是什么的描述:
创建一个名为removeCardFromHand的方法,该方法将整数索引作为参数,并在播放器手的该位置移除并返回Card。如果指定的索引与手中的某个卡不对应,则该方法应抛出IndexOutOfBoundsException。 移除卡后,应根据需要重新排列剩余的卡,以便它们占据阵列的最左侧位置。一种方法是将最右边的卡移动到要移除的卡的位置。例如,如果手牌当前是四张牌{蓝色3,红色2,黄色7,绿色1}并且您正在移除位置1(红色2)的牌,则可以将其替换为最后一张牌(绿色) 1),因此得到的手将是:{blue 3,green 1,yellow 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;
}
显然这是不对的,但我不知道该怎么做。
答案 0 :(得分:1)
你几乎得到了它,除了你将阵列中的所有卡片向左移动一个位置,所以你要丢弃最左边的卡片,然后将“已移除”的卡片留在阵列中,除非它恰好是最左边的一个。 你想做的只是从卡片向右移动(更高的索引)开始移动卡片。因为我认为这是家庭作业,所以我会让你弄清楚你需要改变的一个表达方式; - )
答案 1 :(得分: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
答案 2 :(得分:0)
您正在向左移动所有卡片。考虑第n张牌的位置。您只需将那些移动到该卡的右侧即可。此外,循环的第一次迭代将尝试执行此操作
cards[0] = cards[0 - 1];
这可能不是你真正希望发生的事情。