我创建了一个方法,使用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;
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();
}
示例输出:
B I N G O
14 23 31 49 66
13 29 45 52 65
15 20 0 60 64
5 21 33 54 63
6 16 40 57 71
我对缩小代码感兴趣,因为截至目前,它重复了五行。我能得到一些建议吗?谢谢。
答案 0 :(得分:2)
每当你想压缩代码时,你应该寻找模式。所以,让我们来看一部分代码:
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)+1;
和
card[row][0]= tmp;
那么让我们来看看这两条线是如何变化的。
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点。至于另一条线,它每次只增加一个。
一旦你意识到这一点,很容易编写一个带有空白区域的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;
}
}
从这里,你可以填补空白。
答案 1 :(得分:1)
您可以在参数fashon中指定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++;
}
现在你只能写一次。
答案 2 :(得分:0)
我会将一个for
循环嵌套在第二个外部for
循环中,循环遍历5列。现在可以使用此列索引计算您在每个for循环中添加的值(1,16等),并且可以直接在card
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;
}
}
可以使用[2][2]
控制控制if
的逻辑。我将此作为一种练习,将如何包含这种逻辑。