所以,现在我有一个2D数组,根据用户输入(行和列)打印游戏字段。它用'.'
个字符填充数组。我现在需要的是使用第三个用户输入amountTreasure
来固定地图上的宝藏数量。
如何在这个2D阵列中循环并在随机位置放置3个宝藏。有趣的是,我需要防止计算机多次随机选择同一个地方。
我现在有这个代码。
public static char[][] createMatrix(int n, int m, int amountTreasure) {
Random rand = new Random();
char[][] matrix = new char[n][m];
for (char[] matrixList : matrix) {
Arrays.fill(matrixList, '.');
}
for (int v = 0; v < matrix.length; v++) { //Loop through matrix
for (int b = 0; b < matrix[v].length; b++) {
continue;
}
}
return matrix;
}
我试过像
这样的东西matrix[v][b] = (char) rand.nextInt('X')
但它不起作用。我是Java的新手,不知道该怎么做。
答案 0 :(得分:2)
不是循环遍历数组,而是计算随机位置并将宝藏放在那里。
Vec vector
答案 1 :(得分:1)
让Random
返回宝藏所在位置的坐标,而不是遍历数组。然后你只需要检查是否偶然产生了相同的坐标。
Random random = new Random();
for (int i = 0; i < amountTreasure; i++) {
int treasureX, treasureY;
do {
treasureX = random.nextInt(n);
treasureY = random.nextInt(m);
} while (matrix[treasureX][treasureY] == 'X');
matrix[treasureX][treasureY] = 'X';
}
答案 2 :(得分:1)
以下是使用HashSet
来防止重复的一种方法。它不会遍历矩阵来选择随机位置。
这是代码段:
public static char[][] createMatrix(int n, int m, int amountTreasure) {
Random rand = new Random();
char[][] matrix = new char[n][m];
for (char[] matrixList : matrix) {
Arrays.fill(matrixList, '.');
}
Set<String> hashSet = new HashSet<>();
/* Select At Random */
for(int iter = 0; iter < amountTreasure; iter++) {
String trs = null;
int randRow = -1;
int randCol = -1;
/* Generate New Random */
while(!hashSet.contains(trs) && trs == null) {
randRow = rand.nextInt(n);
randCol = rand.nextInt(m);
trs = new String(String.valueOf(n) + "," + String.valueOf(m));
}
/* Add In HashSet */
hashSet.add(trs);
matrix[randRow][randCol] = 'X';
}
/* Return Matrix */
return matrix;
}
输出:
. . . .
. . X .
X . X .
. . . .
答案 3 :(得分:1)
您可以查看2D数组并将“空”单元格位置保存在另一个列表中,然后从中随机选择。这样你就不能多次选择一个单元格。
如何保存细胞位置? 你可以为单元格制作额外的类:
class Cell {
int x, y;
public Cell(int x, y) {
this.x = x;
this.y = y;
}
}
然后制作单元格的ArrayList:
List<Cell> emptyCells = new ArrayList<Cell>();
浏览你的2D数组并在那里添加空单元格:
for (int v = 0; v < matrix.length; v++) { //Loop through matrix
for (int b = 0; b < matrix[v].length; b++) {
if(matrix[v][b] == '.') emptyCells.add(new Cell(v, b));
}
}
现在你可以随机选择。