UNO纸牌游戏从手中取出卡

时间:2012-04-30 02:25:38

标签: java arrays playing-cards indexoutofboundsexception

尝试制作纸牌游戏" UNO"在java中。当玩家玩牌时,应将其从手中移开,其他元素向左移动。它需要一个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个索引就是空的。当玩家必须画一张卡片时,我写了一个类似的方法来添加卡片,这种方法完美无缺。我正在练习即将开始的考试,它不包括数组列表或向量,因此我无法使用它们。

3 个答案:

答案 0 :(得分: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];

答案 1 :(得分: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等等。

答案 2 :(得分:0)

您可以使用LinkedList而不是依赖数组。删除项目(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 ...卡2,卡1}或如果您尝试删除索引&gt;卡而导致与ArrayIndexOutOfBound崩溃card.lengh / 2