在随机位置填充具有固定数量宝藏的2D char数组

时间:2016-02-20 11:22:31

标签: java arrays random

所以,现在我有一个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的新手,不知道该怎么做。

4 个答案:

答案 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));
    }
}

现在你可以随机选择。