0

尝试在 java 中创建纸牌游戏“UNO”。当玩家打出一张牌时,应将其从手中移走,而其他元素则向左移动。它以一个 int n 作为参数,它指的是被丢弃的卡片。该方法应该更改我指定为类字段的卡片数组。它是一组对象,即卡片或玩家手牌。运行时,它会产生一个 nullPointerException。我知道为什么会发生错误,我只是不知道如何解决它。我也试图避免使用数组列表。它还会返回被丢弃的卡片,以便打印。谢谢。

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

错误代码:

java.lang.ArrayIndexOutOfBoundsException:7

at Player.removeCardFromHand(Player.java:86)
at BUno.executeOnePlay(BUno.java:112)
at BUno.play(BUno.java:70)
at BUno.main(BUno.java:186)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:271)

这是因为,在这种情况下,玩家有 7 张牌。当第 7 个被删除时,第 7 个索引为空。当玩家必须抽一张牌时,我写了一个类似的方法来添加一张牌,它完美无缺。我正在为即将到来的考试练习,该考试不包括数组列表或向量,因此对我来说使用它们是没有用的。

4

3 回答 3

2
for(int i = n; i < cards.length; i--)
{
    tempCards[n] = cards[n + 1];
}

那是什么:-)

三个迫在眉睫的问题。第一个是您在n循环内的数组索引中使用,而不是正确的i.

第二个是,即使你解决了这个问题,你也会超出数组的末尾。

第三是你应该增加i而不是减少它。递减它意味着循环将永远运行,因为i总是小于cards.length。而且,永远,我的意思是直到你开始尝试做某事的地步cards[-1]:-)

相反,您应该尝试:

for (int i = n; i < cards.length - 1; i++)
    tempCards[i] = cards[i + 1];
于 2012-04-30T02:37:09.660 回答
1

您的第二个for循环没有按照您的预期进行。当您不断递减时,您只是tempCards[n] = cards[n+1]一遍又一遍地重新分配i

for(int i = n; i < cards.length; i--) 
    { 
        tempCards[n] = cards[n + 1]; 
    } 

看起来像一个示例i以类似 3 的值开始,这将小于cards.length,然后您递减i到 2、1、0、-1、-2 等等。

于 2012-04-30T02:37:33.653 回答
0

您可以使用LinkedList而不是依赖数组。将物品 (a Card) 移除和添加到玩家手上会更快。

我发现您发布的代码存在两个问题。第一个是潜在的并发访问(但您可能会在更高级别处理它):同时,当一张卡片的移除没有完全完成时,是否有可能添加一张卡片?

第二个在这里:

for(int i = n; i < cards.length; i--) 
{ 
   tempCards[n] = cards[n + 1]; 
}

您应该在另一个方向 ( i++) 进行复制,否则您的 tempCard 将包含类似 {Card1, Card2, ..., Card n-1, Card n+1, Card n, Card n -1 ... Card 2,卡 1} 或如果您尝试删除索引 > card.lengh / 2 的卡,则会因 ArrayIndexOutOfBound 崩溃

于 2012-04-30T02:46:41.583 回答