菜鸟编程。 我正在尝试编写Bingo游戏,但我遇到了两个我不知道该如何处理的艰巨挑战。 -如何用非重复整数填充2d数组。 -如何在宾果卡(矩阵)的中间留出空白。那就是应该的样子。
这是我用来填充矩阵值的函数
public static void fillBoard(int [][] pBoard){
Random rand = new Random();
for (int[] pBoard1 : pBoard) {
for (int j = 0; j < pBoard1.length; j++) {
pBoard1[j] = rand.nextInt(100);
}
}
}
这是我初始化矩阵的方式
public static int [] [] defineBoard(){
int [] [] board = {{1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5},
{1,2,3,4,5},};
return board;
}
我以这种方式打印
public static void printBoard(int [][] pBoard){
for(int [] rows : pBoard)
{
for(int column : rows)
{
System.out.print("| " + column + " ");
}
System.out.println("|");
}
}
这是我的输出示例
| 34 | 43 | 6 | 22 | 61 |
| 18 | 95 | 43 | 75 | 53 |
| 40 | 10 | 34 | 38 | 66 |
| 43 | 74 | 77 | 77 | 34 |
| 95 | 69 | 48 | 29 | 38 |
再一次,我的问题是:我不知道如何在中间(3d行,3d列)中留出空白,并且我无法使值不重复。 谢谢!
答案 0 :(得分:2)
Java平台中有一些类可以使完成此任务更加简单。正如GBloggett所指出的,在Java Collections Framework中定义了HashSet
类,以便该集合不能包含重复的值。尝试将现有值添加到HashSet
会导致该集合未被修改。利用此合同,您可以通过以下方式生成25个唯一的随机数:
Set<Integer> grid = new HashSet<Integer>();
Random rand = new Random();
while (grid.size() < 25) {
Integer val = rand.nextInt(100);
grid.add(val);
}
请注意,Java Collections Frameworks类是通用类型。声明new HashSet<Integer>()
只是通知编译器您的Set
实例只能包含Integer
实例。
打印网格不需要矩阵。您可以直接从HashSet
实例获得线性数组,然后利用一些逻辑:即网格行等于(array_index / 5)
,网格列等于(array_index % 5)
。对于您的用例来说也是如此,网格的“中间”总是(row,column)=(2,2),因此您可以利用它来制定一个硬编码的解决方案,以在中间获得一个空白空间:
Integer[] gridInts = grid.toArray(new Integer[0]);
StringBuilder output = new StringBuilder();
for (int index = 0; index < gridInts.length; index++) {
int row = index / 5;
int col = index % 5;
String cell = (row == 2 && col == 2) ? "--" : gridInts[index].toString();
output.append(" | ").append(cell);
if (col == 4) output.append(" |" + "\\n"); // causes a new line to start
// after the last column in the grid
}
String result = output.toString(); // gets String from StringBuilder
System.out.println(result); // sends grid to standard output
这些代码段应满足您的需求。请注意,三元运算符用于确定是否在输出中生成空白点。这只是一个内联的if-then-else表达式。还要注意,StringBuilder
实例用于在构造输出时保留输出。并非绝对必要,可以使用字符串串联运算符代替(它可能更易读)
答案 1 :(得分:0)
重复号码:
我认为您应该创建一个int[]
存储所有以前使用过的数字,然后进行一个while()
循环,在该循环中您将不断重复直到未使用随机数,例如:伪代码)
int[] usedNumbers = new int[24];
for(int i=0; i<24; i++) {
boolean isNotRepeated = false;
int numberToFill = rand.nextInt(100);
while(!isNotRepeated) {
for(int n=0; n<usedNumbers.length; n++) {
if(usedNumbers[n] == numberToFill)
numberToFill = rand.nextInt(100)
if(n==23 && usedNumbers[n] != numberToFill)
isNotRepeated = true;
}
usedNumbers[i] = numberToFill;
}
空位:
使用此int[]
打印出以下内容:(伪代码)
for(int i=0; i<usedNumbers.length+1; i++) {
if(i==13 /** the middle */) {
System.out.println("| " + " " + " ");
} else if(i<13) { // before the middle
System.out.println("| " + usedNumbers[i] + " ");
} else if(i>13) { // after the middle
System.out.println("| " + usedNumbers[i-1] + " ");
}
}
我还没有测试过,但是应该有效。
这是与您其他代码不同的样式,但它应该可以工作并且足够简单。
编辑:
我注意到您的'6'值(以及其他任何一位数字的值)看起来像:| x |
,而其他值看起来像| xx |
,所以我建议您制作一个{{ 1}} 伪代码(都不以这种方式居中)。