尝试在Java中创建纸牌游戏“ UNO”。玩家玩纸牌时,应将其从手上移开,其他元素向左移动。它以int n作为参数,它表示被丢弃的卡。该方法应更改我已指定为类字段的cards数组。它是纸牌或玩家手牌的一组对象。运行时,将产生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个索引将为空。我写了一种类似的方法,当玩家必须抽出一张纸牌时就可以添加一张纸牌,这种方法完美无缺。我正在为即将举行的考试做练习,该考试不涵盖数组列表或向量,因此对我而言,使用它们是没有用的。

最佳答案

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];

关于java - UNO纸牌游戏从手中取出卡,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10377839/

10-11 04:02