首先,英语不是我的主要语言,所以我为错误道歉。其次,我对Java也很陌生
我遇到了一个可能产生“战争”的分配问题。每张16张牌的两名玩家的纸牌游戏。我使用随机数作为卡值,使用两个ArrayLists来存储它们。它通常工作正常,但有时会打印出这条消息:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 17, Size: 17
根据我的理解,这意味着ArrayList由于某种原因变长了。有人可以解释原因吗?
这是我的代码:
import java.util.Random;
import java.util.ArrayList;
public class wargame{
public static void main(String []args){
Random rand = new Random();
ArrayList p1 = new ArrayList ();
ArrayList p2 = new ArrayList ();
int tri=0, empt1, empt2, point1=0,point2=0;
String card1="", card2="";
do {
int x=rand.nextInt(8) + 7 ;
p1.add(x);
} while (p1.size()<=16);
do {
int x=rand.nextInt(8) + 7 ;
p2.add(x);
} while (p2.size()<=16);
System.out.println("GAME!\n");
System.out.println(p1+"\n"+p2+"\n");
do {
empt1=(int)p1.get(tri);
if (empt1>10){
switch (empt1)
{
case 11: card1="jack";
break;
case 12: card1="queen";
break;
case 13: card1="king";
break;
case 14: card1="ace";
break;
default: card1="error";
break;
} }
empt2=(int)p2.get(tri);
if (empt2>10){
switch (empt2)
{
case 11: card2="jack";
break;
case 12: card2="queen";
break;
case 13: card2="king";
break;
case 14: card2="ace";
break;
default: card2="error";
break;
}
}
if (empt1>10 && empt2>10)
{
System.out.println("player one drew a "+card1+" and player two drew a "+card2);}
else
{
if (empt1<=10 && empt2>10)
{
System.out.println("player one drew a "+empt1+" and player two drew a "+card2);
}
else {
if (empt1<=10 && empt2<=10)
{
System.out.println("player one drew a "+empt1+" and player two drew a "+empt2);
}
else {
System.out.println("player one drew a "+card1+" and player two drew a "+empt2);
}
}
}
if (empt1<empt2)
{
point2++;
}
if (empt1>empt2)
{
point1++;
}
if (empt1==empt2)
{
if (tri>14)
{
System.out.println("\neven thougha battle would occur there are too litle cards to do so. nobody gets a point");
break;
}
do {
{ System.out.println("\n\nbattle");
tri=tri+2;
empt1=(int)p1.get(tri);
empt2=(int)p2.get(tri);
if (empt1<empt2)
{
System.out.println("\nplayer two won the battle");
point2=point2+3;
}
if (empt1>empt2)
{
System.out.println("\nplayer one won the battle");
point1=point1+3;
}
}
}
while (empt1==empt2);
}
tri++;
}
while (tri!=16);
if (point1<point2)
{
System.out.println("\nplayer TWO wins with "+point2+" points!");
}
else {System.out.println("\nplayer ONE wins with "+point1+" points!");}
}
}
答案 0 :(得分:0)
索引从0开始,因此getIndex(0)
将返回第一个值。大小以1开头,因此大小为1的arrayList将为1
返回getSize()
。
答案 1 :(得分:0)
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 17, Size: 17
这就是说您正在尝试访问索引数组[17],但由于您的数组大小只有17,因此该索引超出范围。因此,数组大小为17将具有最高的数组索引[16]
答案 2 :(得分:0)
您的代码的问题是在您执行tri = tri +2
的循环时执行。您需要学习如何调试代码,IDE是一个很棒的工具!
您遇到此问题的原因有几个。主要问题是您要向tri
添加2。另一个问题是,您只需在1之间挑选一个随机数,然后再添加7。这只为您提供8种数字可能性。
运行代码时,p1
设置为{14, 10, 8, 11, 10, 9, 7, 14, 14, 8, 9, 9, 13, 11, 7, 12, 14}
,p2
设置为{12, 10, 12, 13, 9, 10, 10, 8, 14, 14, 7, 9, 9, 10, 7, 13, 14}
。如您所见,有多个实例,其中两个数组在同一索引中包含相同的值。如果将tri
设置为10,那么代码将通过do while循环运行,直到tri
达到18,这会引发您看到的异常。 tri
永远不会超过16岁。
我建议你仔细阅读你的代码并将其细分为特定的小方法,以使其更清晰。此外,您可以使用包含所有Card值的arraylist替换switch语句和if语句,这将减少您的代码行并使其不那么复杂。您可以使用cardValue[empt1]
或其他内容来调用ArrayList。