Java 从宾果游戏方法中压缩代码
我创建了一个方法,用1-75的整数填充一个5 x 5的数组,设置宾果游戏卡的基础Java 从宾果游戏方法中压缩代码,java,Java,我创建了一个方法,用1-75的整数填充一个5 x 5的数组,设置宾果游戏卡的基础 public static void bingoCard(){ int [][]card=new int [5][5]; ArrayList<Integer> alreadyUsed = new ArrayList<Integer>(); boolean valid = false; int tmp = 0;
public static void bingoCard(){
int [][]card=new int [5][5];
ArrayList<Integer> alreadyUsed = new ArrayList<Integer>();
boolean valid = false;
int tmp = 0;
for(int row=0; row < card.length; row++){
while(!valid){
tmp = (int)(Math.random()*15)+1;
if(!alreadyUsed.contains(tmp)){
valid = true;
alreadyUsed.add(tmp);
}
}
card[row][0]= tmp;
valid = false;
}
for(int row=0;row<card.length;row++){
while(!valid){
tmp = (int)(Math.random()*15)+16;
if(!alreadyUsed.contains(tmp)){
valid = true;
alreadyUsed.add(tmp);
}
}
card[row][1]= tmp;
valid = false;
}
for(int row=0;row<card.length;row++){
while(!valid){
tmp = (int)(Math.random()*15)+31;
if(!alreadyUsed.contains(tmp)){
valid = true;
alreadyUsed.add(tmp);
}
}
card[row][2]= tmp;
valid = false;
}
card[2][2]=0;
for(int row=0;row<card.length;row++){
while(!valid){
tmp = (int)(Math.random()*15)+46;
if(!alreadyUsed.contains(tmp)){
valid = true;
alreadyUsed.add(tmp);
}
}
card[row][3]= tmp;
valid = false;
}
for(int row=0;row<card.length;row++){
while(!valid){
tmp = (int)(Math.random()*15)+61;
if(!alreadyUsed.contains(tmp)){
valid = true;
alreadyUsed.add(tmp);
}
}
card[row][4]= tmp;
valid = false;
}
//create array to make title.
String title []={"B","I","N","G","O"};
for(int i=0;i<title.length;i++){
System.out.print(title[i]+ "\t");
}
System.out.println();
for(int row=0;row<card.length;row++){
for(int col=0;col<card[row].length;col++){
System.out.print(card[row][col]+ "\t");
}
System.out.println();
}
我对压缩代码感兴趣,因为到目前为止,它重复了五行。我能得到一些建议吗?谢谢。我将在一秒钟内嵌套一个
for
循环,外部for
循环在5列上循环。现在可以使用此列索引计算在每个for循环中添加的值(1、16等),并且可以直接在卡
二维数组中使用列索引
for (int col = 0; /* Decide on your bounds here*/ ; col++) {
// One of your for loops is copied and modified here
for(int row=0;row<card.length;row++){
while(!valid){
tmp = (int)(Math.random()*15) + (/* calculation here*/) + 1;
if(!alreadyUsed.contains(tmp)){
valid = true;
alreadyUsed.add(tmp);
}
}
card[row][/* Decide what to use here*/]= tmp;
valid = false;
}
}
for(int col=0;/*在此处决定边界*/;col++){
//此处复制并修改了一个for循环
for(int row=0;row我将在一秒钟内嵌套一个for
循环,外部for
循环在5列上循环。您现在在每个for循环中添加的值(1、16等)可以使用此列索引进行计算,列索引可以直接在卡
2D数组中使用
for (int col = 0; /* Decide on your bounds here*/ ; col++) {
// One of your for loops is copied and modified here
for(int row=0;row<card.length;row++){
while(!valid){
tmp = (int)(Math.random()*15) + (/* calculation here*/) + 1;
if(!alreadyUsed.contains(tmp)){
valid = true;
alreadyUsed.add(tmp);
}
}
card[row][/* Decide what to use here*/]= tmp;
valid = false;
}
}
for(int col=0;/*在此处决定边界*/;col++){
//此处复制并修改了一个for循环
对于(int行=0;行< p>),每当你想压缩代码时,你应该寻找模式。所以,让我们来看看你的代码的一部分:
for(int row=0; row < card.length; row++){
while(!valid){
tmp = (int)(Math.random()*15)+1;
if(!alreadyUsed.contains(tmp)){
valid = true;
alreadyUsed.add(tmp);
}
}
card[row][0]= tmp;
valid = false;
}
及
让我们看看这两条线是如何变化的
tmp = (int)(Math.random()*15)+16;
tmp = (int)(Math.random()*15)+31;
tmp = (int)(Math.random()*15)+46;
tmp = (int)(Math.random()*15)+61;
很容易看出它是如何变化的——它只是每次增加15。至于另一行,它只是每次增加1
一旦您意识到这一点,就可以很容易地编写一个带有空白区域的for循环,您需要在其中进行替换
for (int i = 0; i < _____; i++) {
for (int row = 0; row < card.length; row++) {
while (!valid) {
tmp = (int) (Math.random() * 15) + _____;
if (!alreadyUsed.contains(tmp)) {
valid = true;
alreadyUsed.add(tmp);
}
}
card[row][_____] = tmp;
valid = false;
}
}
for(int i=0;i<\u\u\u;i++){
for(int行=0;行
从这里,你可以填空。
每当你想压缩代码时,你应该寻找模式。所以,让我们来看看你的代码的一部分:
for(int row=0; row < card.length; row++){
while(!valid){
tmp = (int)(Math.random()*15)+1;
if(!alreadyUsed.contains(tmp)){
valid = true;
alreadyUsed.add(tmp);
}
}
card[row][0]= tmp;
valid = false;
}
及
让我们看看这两条线是如何变化的
tmp = (int)(Math.random()*15)+16;
tmp = (int)(Math.random()*15)+31;
tmp = (int)(Math.random()*15)+46;
tmp = (int)(Math.random()*15)+61;
很容易看出它是如何变化的——它只是每次增加15。至于另一行,它只是每次增加1
一旦您意识到这一点,就可以很容易地编写一个带有空白区域的for循环,您需要在其中进行替换
for (int i = 0; i < _____; i++) {
for (int row = 0; row < card.length; row++) {
while (!valid) {
tmp = (int) (Math.random() * 15) + _____;
if (!alreadyUsed.contains(tmp)) {
valid = true;
alreadyUsed.add(tmp);
}
}
card[row][_____] = tmp;
valid = false;
}
}
for(int i=0;i<\u\u\u;i++){
for(int行=0;行
从这里,您可以填写空格。您可以以参数化方式指定tmp的值,并根据行号进行相应更改:
int aux = 0;
for(int row=0;row<card.length;row++){
while(!valid){
tmp = (int)(Math.random()*15) + 1 + 15 * aux;
if(!alreadyUsed.contains(tmp)){
valid = true;
alreadyUsed.add(tmp);
}
}
card[row][4]= tmp;
valid = false;
aux++;
}
intaux=0;
对于(int row=0;row,您可以以参数化方式指定tmp的值,并随行号相应更改:
int aux = 0;
for(int row=0;row<card.length;row++){
while(!valid){
tmp = (int)(Math.random()*15) + 1 + 15 * aux;
if(!alreadyUsed.contains(tmp)){
valid = true;
alreadyUsed.add(tmp);
}
}
card[row][4]= tmp;
valid = false;
aux++;
}
intaux=0;
对于(int row=0;row你绝对应该研究嵌套循环。它们是所有编程的关键组成部分。@Thatidotguy他已经在使用嵌套循环了,lolWell true,但他应该使用更多的东西。谢谢你的回答。我的循环中有很多嵌套循环,这就是我提出这个问题的原因。我不确定如何实现moRE for for循环,以便不破坏我的代码。你应该考虑发布这样的问题。你绝对应该查看嵌套循环。它们是所有编程的一个关键构建块。@ ToTIOTHOTHE他已经使用嵌套循环LoWoReTress了,但是他应该使用MuleHee。谢谢你的回复。我有很多嵌套循环。循环,这就是为什么我提出这个问题。我不确定如何执行更多的循环,以便不破坏我的代码。你应该考虑把这样的问题发布到Hi RGTTMAN。你能给我演示一下我应该如何做这个的例子吗?我在每个循环中都有很多嵌套的循环,所以如果我再往前走,我会有点困惑。我已经修改过了。我的答案包含了一个模板来指导你找到解决方案。第一个空白:i<4
第二个空白:+1+15*i
第三个空白:i
非常感谢!这很有效。嗨,Targetman。你能给我举个例子说明我应该怎么做吗?我在每个循环中都有许多嵌套的循环,所以我有点不太自信如果我再进一步的话,我会感到困惑。我已经修改了我的答案,加入了一个模板来指导你找到解决方案。第一个空格:I<4
第二个空格:+1+15*I
第三个空格:I
非常感谢!这很有效。对于第一个空格,我假设卡片[col]。长度,第二个空格是+(15)+1和卡[行][col+1]
。对吗?顺便说一句,谢谢你仔细的解释。这真的很有帮助。@TheGreenColla好吧,你没有一个名为col
的变量。但是,是的,外循环应该从0到4。至于第二个空格,如果你认为在每次迭代中它将等于16
。第一次是这样的,但你没有'不需要16,16,16,16,…您需要16,31,46,…所以您必须修改它。同样,对于第三个空格,您没有一个名为col的变量。(但是您有一个名为i
的变量)啊,我明白了。第一个空格:4
。第三个空格:I
。但是,对于第二个空格,我仍然不确定。第一个空格:I对于第一个空格,我假设card[col]。length
,第二个空格是+(15)+1
,和card[row][col 1]
。对吗?顺便说一句,谢谢你仔细的解释。这真的很有帮助。@TheGreenColla好吧,你没有一个名为col
的变量。但是是的,外循环应该从0到4。至于