使用edwards修改后的代码,我现在有了这个:
int k, l, tempA, tempB;
for (k = 0; k < 13; k++) {
for (l = 0; l < 4; l++) {
tempA = rndm.get(k);
tempB = suit.get(l);
// increment # and convert into string
buttonNumber++;
buttonName = Integer.toString(buttonNumber);
// assign new button to the array
cardButton[k * 4 + l] = new JButton(buttonName);
// assign button image icon
cardButton[k * 4 + l].setIcon(cardImage[tempA][tempB]);
// assign value to the check variable
check[k * 4 + l] = Integer.toString(tempA+1);
// make button invisible for now
cardButton[k * 4 + l].setVisible(false);
// add the button to the board
board.add(cardButton[k * 4 + l]);
}
}
但我的问题是我需要替换嵌套循环,因为它现在设置的方式,它在显示下一个值之前显示4个不同套装的x值,当我需要它显示它时除非随机完成,否则x值和x套装不重复一次值。发生这种情况的原因是嵌套循环遍历k一次,然后遍历l四次。
答案 0 :(得分:0)
我相信您的for-loop
条件不正确。
在j < 52 || k < 13 || l < 4
之前,j >= 52
将返回true。查看你的代码,这会引发一个越界错误,因为k
和l
也会增加到52.如果我是你,我会把它们放在不同的条件下。
您希望迭代2D数组(根据您的评论)。在这种情况下,我会使用2 for-loops
:
for (k = 0; k < 13; k++) {
for (l = 0; l < 4; l++) {
tempA = rndm.get(k);
tempB = suit.get(l);
cardButton[k * 4 + l].setIcon(cardImage[tempA][tempB]);
check[k * 4 + l] = Integer.toString(tempA+1);
}
}
请注意,我们正在用一些数学代替您的j
变量。每次执行l
循环时,k
都会加1。因此,我们可以通过将k
乘以4来判断我们在哪张卡上,因为l
经历了4次。如果我们添加l
,我们就可以获得您正在查看的当前卡片。此代码应该可以直接使用。
编辑:您的完整代码应如下所示。
int k, l, tempA = 0, tempB = 0;
// create temporary variables
for (k = 0; k < 13; k++) {
for (l = 0; l < 4; l++) {
tempA = rndm.get(k);
tempB = suit.get(l);
// increment # and convert into string
buttonNumber = buttonNumber+1;
buttonName = Integer.toString(buttonNumber);
// assign new button to the array
cardButton[k * 4 + l] = new JButton(buttonName);
// assign button image icon
cardButton[k * 4 + l].setIcon(cardImage[tempA][tempB]);
// assign value to the check variable
check[k * 4 + l] = Integer.toString(tempA+1);
// make button invisible for now
cardButton[k * 4 + l].setVisible(false);
// add the button to the board
board.add(cardButton[k * 4 + l]);
}
}
此外,您可以使用buttonNumber = buttonNumber + 1
buttonNumber++
答案 1 :(得分:0)
如果您尝试获取rndm
和suit
的每个排列,那么您需要一个嵌套循环:
for (int i = 0; i < 13; i++) {
for (int j = 0; j < 4; j++) {
tempA = rndm.get(i);
tempB = suit.get(j);
//...
}
}
答案 2 :(得分:0)
您误解了逻辑运算符的工作原理。双竖条是“或”运算符。它需要两个可以转换为布尔值的表达式,如果至少其中一个为真,则返回true。
boolean test = (1 == 2 || 5 < 3);
// test == true
你的for循环在数组边界之外迭代。让我们简化一下你的代码。让我们创建两个固定大小的数组,1和2个元素,然后在类似于你的循环中迭代它们。
Integer[] arrayA = new Integer[1];
Integer[] arrayB = new Integer[2];
for (int i = 0, j = 0; i < 1 || j < 2; i++, j++) {
arrayA[i] = i; // Will throw ArrayIndexOutOfBounds
arrayB[j] = j;
}
现在,让我们看看在循环执行期间计数器将如何变化:
i == 0
和j == 0
,i < 1 == true
和j < 2 == true
,我们会增加i == 1
和j == 1
,i < 1 == false
但仍然是j < 2 == true
,其中一个条件为真(我们只需要一个为||
}运算符返回true)所以即使i
索引超出范围,也会执行循环代码!出于同样的原因,您的代码会抛出异常。即使l < 4 == false
,整个条件的计算结果为true
,也会执行循环代码。
您想要的是将所有||
运算符更改为&&
:
for (j = 0, k = 0, l = 0; j < 52 && k < 13 && l < 4; j++, k++, l++)
您可以在此处详细了解布尔代数以及and
和or
运算符之间的差异 - http://www.tutorialspoint.com/computer_logical_organization/boolean_algebra.htm
在旁注中,不要做那样的循环。你可能已经注意到,一个陈述中的许多变量都非常令人困惑。如果您总是访问与计数器变量具有完全相同索引的对象,请考虑使用enchanced for loops。