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