我正在尝试模拟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?
答案 0 :(得分:0)
没有理由先将数字存储在Set
中;您可以直接向2D数组生成随机数。此外,您乘以16
而不是15
,所以得到的数字范围是1-16
而不是1-15
。
由于您需要数字是唯一的,因此可以将已经生成的数字存储在列表中,并在每次迭代时检查列表。此外,您的2D数组有16个插槽,但是您只能容纳15个数字,因此您也需要注意这一点。
如果您希望空插槽是随机的,则只需选择一个1到16之间的随机数,然后跳过该数字即可,而不是跳过16。不过,您可以使用break
代替continue
,因为如果空插槽不是最后一个插槽,我们就无法填充2D数组。
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 :(得分:0)
我将使用:ThreadLocalRandom.current().nextInt(1, 16)
,它将返回一个介于1到15之间的(伪)随机整数来生成数字