这个问题已经在这里有一个答案:
我试图在目前阶段,生成的15游戏的模拟从1-15打印随机产生的数字的2D阵列。这可能是一个输出,其中,所述空的空间可以是阵列中的任何点的例子:
1 3 5 6
7 9 10 13
2 4 8 11
12 14 15
public class Game {
public static void main(String[] args) {
Set<Integer> set = new HashSet<>();
int gameboard[][] = new int[4][4];
while(set.size() != 4*4){
set.add((int)(1+Math.random() * 16));
}
List<Integer> list = new ArrayList<>(set);
for (int row=0; row < gameboard.length; row++) {
for (int col=0; col < gameboard[row].length; col++) {
gameboard[row][col] = list.get(row*gameboard.length + col);
System.out.printf("%-4d",gameboard[row][col]);
}
System.out.println();
}
}
}
但是,我当前的代码打印1-15升序排序是这样的:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
我应该如何让数字加密和每次运行不同,以及有是一个空元素(如上面的输出),所以号范围从1-15?
没有理由先存储在Set
的数字;您可以生成随机数,直接到你的二维数组。此外,你被16
而不是15
相乘,所以你得到的数字为1-16
代替1-15
的。
既然你需要的号码是唯一的,你可以存储已经生成的号码列表,检查列表中的每个迭代。此外,你的二维数组有16个插槽,但只能满足15个号码,所以你需要知道这一点。
如果你想空插槽是随机的,你可以简单地选择范围从1到16的随机数,并跳过不是跳过16而不是break
你虽然用continue
的,因为我们没有做填充二维数组如果空插槽是不是最后一个。
int[][] gameboard = new int[4][4];
ArrayList<Integer> used = new ArrayList<Integer>();
int emptySlot = (int) (1 + Math.random() * 16);
for(int row = 0; row < gameboard.length; row++) {
for(int col = 0; col < gameboard[row].length; col++) {
if(row*gameboard.length + col == emptySlot) {
System.out.print(" ");
continue; //skip empty slot
}
int number;
while(used.contains(number = (int) (1 + Math.random() * 15)));
used.add(number);
gameboard[row][col] = number;
System.out.printf("%-4d",gameboard[row][col]);
}
System.out.println();
}
我会使用:1和15之间ThreadLocalRandom.current().nextInt(1, 16)
这将返回一个(伪)随机整数生成号码