尝试在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 个索引是空的。我写了一个类似的方法,当玩家必须抽一张牌时添加一张牌,效果很好。我正在为即将到来的考试进行练习,该考试不包括数组列表或向量,因此使用它们对我来说毫无用处。
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];
你的第二个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,依此类推。
您可以使用 LinkedList 而不是依赖数组。移除物品(Card
(并将其添加到玩家手中会更快。
我看到您发布的代码有两个问题。第一个是潜在的并发访问(但您可以在更高级别处理它(:同时,当一张卡的删除未完全完成时,是否可以添加卡?
第二个在这里:
for(int i = n; i < cards.length; i--)
{
tempCards[n] = cards[n + 1];
}
你应该在另一个方向(i++
(做一个副本,否则你的临时卡将包含类似{卡1,卡2,...,卡n-1,卡n+1,卡n,卡n-1 ...卡 2、卡 1} 或使用具有索引的卡崩溃> card.lengh/2