Java 我的程序陷入了一个它不应该陷入的循环中';不行
我的程序中有四个几乎相同的while lopp。该计划正在通过其中的3个,但在第四个(最后一个)被卡住了 我想实现的是一个程序,给每个玩家13张随机的扑克牌 我在下面添加了相关的程序Java 我的程序陷入了一个它不应该陷入的循环中';不行,java,random,while-loop,Java,Random,While Loop,我的程序中有四个几乎相同的while lopp。该计划正在通过其中的3个,但在第四个(最后一个)被卡住了 我想实现的是一个程序,给每个玩家13张随机的扑克牌 我在下面添加了相关的程序 public static void main(String[] args) { String[] cards = new String[53]; cards[1] = "1k"; cards[2] = "2k"; cards[3] = "3k"; cards[4] = "4k"; cards[5]
public static void main(String[] args) {
String[] cards = new String[53];
cards[1] = "1k"; cards[2] = "2k"; cards[3] = "3k"; cards[4] = "4k"; cards[5] = "5k"; cards[6] = "6k";
cards[7] = "7k"; cards[8] = "8k"; cards[9] = "9k"; cards[10] = "10k"; cards[11] = "11k"; cards[12] = "12k";
cards[13] = "13k";
cards[14] = "1h"; cards[15] = "2h"; cards[16] = "3h"; cards[17] = "4h"; cards[18] = "5h"; cards[19] = "6h";
cards[20] = "7h"; cards[21] = "8h"; cards[22] = "9h"; cards[23] = "10h"; cards[24] = "11h"; cards[25] = "12h";
cards[26] = "13h";
cards[27] = "1r"; cards[28] = "2r"; cards[29] = "3r"; cards[30] = "4r"; cards[31] = "5r"; cards[32] = "6r";
cards[33] = "7r"; cards[34] = "8r"; cards[35] = "9r"; cards[36] = "10r"; cards[37] = "11r"; cards[38] = "12r";
cards[39] = "13k";
cards[40] = "1s"; cards[41] = "2s"; cards[42] = "3s"; cards[43] = "4s"; cards[44] = "5s"; cards[45] = "6s";
cards[46] = "7s"; cards[47] = "8s"; cards[48] = "9s"; cards[49] = "10s"; cards[50] = "11s"; cards[51] = "12s";
cards[52] = "13s";
String[] player1 = new String[14];
String[] player2 = new String[14];
String[] player4 = new String[14];
String[] player3 = new String[14];
String used = "";
int i1 = 0;
int i2 = 0;
int i3 = 0;
int i4 = 0;
while (true) {
Random rand1 = new Random();
int irand1 = rand1.nextInt(51) + 1 ;
String card = cards[irand1];
if (i1 == 14)
break;
if (used.contains(card))
continue;
else {
player1[i1] = card;
used = used + " " + card;
i1++;
}
}
while (true) {
Random rand2 = new Random();
int irand2 = rand2.nextInt(51) + 1 ;
String card2 = cards[irand2];
if (i2 == 14)
break;
if ( used.contains(card2))
continue;
else {
player2[i2] = card2;
used = used + " " + card2;
i2++;
}
}
while (true) {
Random rand3 = new Random();
int irand3 = rand3.nextInt(51) + 1;
String card3 = cards[irand3];
if (i3 == 14)
break;
if (used.contains(card3))
continue;
else {
player3[i3] = card3;
used = used + " " + card3;
i3++;
}
}
while (true) {
Random rand4 = new Random();
int irand4 = rand4.nextInt(51) + 1;
String card4 = cards[irand4];
if (i4 == 14)
break;
if (used.contains(card4))
continue;
else {
player4[i4] = card4;
used = used + " " + card4;
i4++;
}
}
}
}
为了澄清,程序陷入的while循环是:
while (true) {
Random rand4 = new Random();
int irand4 = rand4.nextInt(51) + 1;
String card4 = cards[irand4];
if (i4 == 14)
break;
if (used.contains(card4))
continue;
else {
player4[i4] = card4;
used = used + " " + card4;
i4++;
}
}
任何帮助都将不胜感激,谢谢 首先,您可以通过初始化和声明您的
卡来节省一些时间(并且您使用卡重复了“13k”[39]=“13k”;
-因此您没有52张唯一的卡)。第二,我会使用Collections.shuffle(List)
来发牌。这可以通过以下方式实现:
String[] cards = {
"1k", "2k", "3k", "4k", "5k", "6k", "7k", "8k", "9k", "10k", "11k", "12k", "13k",
"1r", "2r", "3r", "4r", "5r", "6r", "7r", "8r", "9r", "10r", "11r", "12r", "13r",
"1h", "2h", "3h", "4h", "5h", "6h", "7h", "8h", "9h", "10h", "11h", "12h", "13h",
"1s", "2s", "3s", "4s", "5s", "6s", "7s", "8s", "9s", "10s", "11s", "12s", "13s"
};
List<String> al = new ArrayList<>(Arrays.asList(cards));
Collections.shuffle(al);
String[] player1 = al.subList(0, 13).toArray(new String[13]);
String[] player2 = al.subList(13, 26).toArray(new String[13]);
String[] player3 = al.subList(26, 39).toArray(new String[13]);
String[] player4 = al.subList(39, al.size()).toArray(new String[13]);
System.out.println(Arrays.toString(player1));
System.out.println(Arrays.toString(player2));
System.out.println(Arrays.toString(player3));
System.out.println(Arrays.toString(player4));
String[]卡片={
“1k”、“2k”、“3k”、“4k”、“5k”、“6k”、“7k”、“8k”、“9k”、“10k”、“11k”、“12k”、“13k”,
“1r”、“2r”、“3r”、“4r”、“5r”、“6r”、“7r”、“8r”、“9r”、“10r”、“11r”、“12r”、“13r”,
“1h”、“2h”、“3h”、“4h”、“5h”、“6h”、“7h”、“8h”、“9h”、“10h”、“11h”、“12h”、“13h”,
“1s”、“2s”、“3s”、“4s”、“5s”、“6s”、“7s”、“8s”、“9s”、“10s”、“11s”、“12s”、“13s”
};
List al=新的ArrayList(Arrays.asList(cards));
收藏。洗牌(al);
String[]player1=al.subList(0,13).toArray(新字符串[13]);
String[]player2=al.subList(13,26).toArray(新字符串[13]);
String[]player3=al.subList(26,39).toArray(新字符串[13]);
String[]player4=al.subList(39,al.size()).toArray(新字符串[13]);
System.out.println(Arrays.toString(player1));
System.out.println(Arrays.toString(player2));
System.out.println(Arrays.toString(player3));
System.out.println(Arrays.toString(player4));
首先,您可以通过初始化和声明您的卡来节省一些时间(并且您使用卡重复了“13k”[39]=“13k”
——因此您没有52张唯一的卡)。第二,我会使用Collections.shuffle(List)
来发牌。这可以通过以下方式实现:
String[] cards = {
"1k", "2k", "3k", "4k", "5k", "6k", "7k", "8k", "9k", "10k", "11k", "12k", "13k",
"1r", "2r", "3r", "4r", "5r", "6r", "7r", "8r", "9r", "10r", "11r", "12r", "13r",
"1h", "2h", "3h", "4h", "5h", "6h", "7h", "8h", "9h", "10h", "11h", "12h", "13h",
"1s", "2s", "3s", "4s", "5s", "6s", "7s", "8s", "9s", "10s", "11s", "12s", "13s"
};
List<String> al = new ArrayList<>(Arrays.asList(cards));
Collections.shuffle(al);
String[] player1 = al.subList(0, 13).toArray(new String[13]);
String[] player2 = al.subList(13, 26).toArray(new String[13]);
String[] player3 = al.subList(26, 39).toArray(new String[13]);
String[] player4 = al.subList(39, al.size()).toArray(new String[13]);
System.out.println(Arrays.toString(player1));
System.out.println(Arrays.toString(player2));
System.out.println(Arrays.toString(player3));
System.out.println(Arrays.toString(player4));
String[]卡片={
“1k”、“2k”、“3k”、“4k”、“5k”、“6k”、“7k”、“8k”、“9k”、“10k”、“11k”、“12k”、“13k”,
“1r”、“2r”、“3r”、“4r”、“5r”、“6r”、“7r”、“8r”、“9r”、“10r”、“11r”、“12r”、“13r”,
“1h”、“2h”、“3h”、“4h”、“5h”、“6h”、“7h”、“8h”、“9h”、“10h”、“11h”、“12h”、“13h”,
“1s”、“2s”、“3s”、“4s”、“5s”、“6s”、“7s”、“8s”、“9s”、“10s”、“11s”、“12s”、“13s”
};
List al=新的ArrayList(Arrays.asList(cards));
收藏。洗牌(al);
String[]player1=al.subList(0,13).toArray(新字符串[13]);
String[]player2=al.subList(13,26).toArray(新字符串[13]);
String[]player3=al.subList(26,39).toArray(新字符串[13]);
String[]player4=al.subList(39,al.size()).toArray(新字符串[13]);
System.out.println(Arrays.toString(player1));
System.out.println(Arrays.toString(player2));
System.out.println(Arrays.toString(player3));
System.out.println(Arrays.toString(player4));
看起来您可能需要学习使用调试器。请随便吃点。如果您以后仍然有问题,请将您的问题更具体地说明您需要什么帮助。while(True)
-->换句话说,请永远这样做。最后一个玩家必须让“星星对齐”才能找到剩余的牌,它可能会完成,但只需要随机选择剩余的牌,这可能需要一段时间。通过找到两个数组的交集,将剩余的牌交给玩家4可能更好。您正在尝试从52张牌中获得4*14=56张不同的牌,使用一个只生成51个不同值的随机数生成器。即使你修正了代码,只得到4*13=52张牌,它也永远不会成功,因为你只能从前51张牌中选择。将代码更改为使用nextInt(52)
而不是nextInt(51)
--由于,cards[39]=“13k”
是一个重复的值,应该是cards[39]=“13r”
,除了其他人注意到的几个错误之外,您在while(true)
循环的每次迭代中都创建了一个新的Random()
对象。使用伪随机数生成器的正确方法是创建一个静态实例,然后根据需要重新使用它。请随便吃点。如果您以后仍然有问题,请将您的问题更具体地说明您需要什么帮助。while(True)
-->换句话说,请永远这样做。最后一个玩家必须让“星星对齐”才能找到剩余的牌,它可能会完成,但只需要随机选择剩余的牌,这可能需要一段时间。通过找到两个数组的交集,将剩余的牌交给玩家4可能更好。您正在尝试从52张牌中获得4*14=56张不同的牌,使用一个只生成51个不同值的随机数生成器。即使你修正了代码,只得到4*13=52张牌,它也永远不会成功,因为你只能从前51张牌中选择。将代码更改为使用nextInt(52)
而不是nextInt(51)
--由于,cards[39]=“13k”
是一个重复的值,应该是cards[39]=“13r”
,除了其他人注意到的几个错误之外,您在while(true)
循环的每次迭代中都创建了一个新的Random()
对象。使用伪随机数生成器的正确方法是创建一个静态实例,然后根据需要重新使用。更好的方法,但没有解释OP的代码不起作用的原因。@Andreascards[39]=“13k”代码>可以。OP没有52张独特的卡片。@ElliottFrisch Genius!:)@艾略特·弗里希也看到了,精灵!谢谢你的备用代码。但是我的代码即使在我纠正了重复的错误后仍然不起作用。更好的方法,但没有解释OP的代码为什么不起作用。@Andreascards[39]=“13k”代码>可以。OP没有52张独特的卡片。@ElliottFrisch Gen