【问题标题】:How can I fill this 2D array with X characters?如何用 X 字符填充这个二维数组?
【发布时间】:2021-05-04 08:35:39
【问题描述】:

我现在正在制作我自己的游戏(我知道它的 java),我对如何用 x 的值填充我的二维数组有点困惑。

到目前为止,它只显示 null 而不是值。我如何随机化,然后在二维数组的值中使用字符 b 隐藏 3 个“炸弹”和使用字符 T 隐藏 1 个“宝藏”?

我希望它在随机化后隐藏起来,我对如何做到这一点的想法为零。也许回调另一个二维数组来显示?

class Main {
    public static void main(String[] args) {
        import java.util.Arrays;
        String[][] grid1 = new String[8][8];
        for (int n = 0; n <= grid1.length; n++) {
            System.out.print(n + "\t");
        }
        System.out.println();

        for (int r = 0; r < grid1.length; r++) {
            System.out.print(r + 1 + "\t");
            for (int c = 0; c < grid1[r].length; c++)
                System.out.print(grid1[r][c] + "\t");
        }

        arrays.fill(grid1[0], so);
        System.out.println();
    }
}

如您所见,我已经尝试过import java.util.arrays,但它给了我错误。所以arrays.fill 也不起作用。

添加几行代码后会发生以下情况:

0   1   2   3   4   5   6   7   8
1   null    null    null    null    null    null    null    null2   null    null    null    null    null    null    null    null3   null    null    null    null    null    null    null    null4   null    null    null    null    null    null    null    null5   null    null    null    null    null    null    null    null6   null    null    null    null    null    null    null    null7   null    null    null    null    null    null    null    null8   null    null    null    null    null    null    null    null
x   x   x   x   x   x   x   x
null    null    null    null    null    null    null    null
null    null    null    null    null    null    null    null
null    null    null    null    null    null    null    null
null    null    null    null    null    null    null    null
null    null    null    null    null    null    null    null
null    null    null    null    null    null    null    null
null    null    null    null    null    null    null    null

我知道顶部看起来很奇怪,但是当将窗口移动到某个位置时它会对齐。

【问题讨论】:

  • grud[r][c] = "x" 在内部循环中
  • 所以当它说:System.out.print(r+1+"\t"); for (int c=0; c&lt;grid1[r].length; c++) System.out.print(grid1[r][c]+"\t"); 我会把 grid1[r][c]="x" 放在哪里?
  • for (int c=0; c&lt;grid1[r].length; c++){ grud[r][c] = "x" }

标签: java arrays multidimensional-array


【解决方案1】:

要填充二维数组的第一行,请使用Arrays.fill,要填充其余行,请使用Arrays.copyOf

接下来,最好实现不同的方法来执行不同的任务:

  1. 创建并填充网格
  2. 打印网格
static String[][] fillGrid(int rows, int cols, String cell) {
    String[][] grid = new String[rows][cols];

    String[] row = new String[cols];
    Arrays.fill(row, cell);
    grid[0] = row;
    for (int i = 1; i < rows; i++) {
        grid[i] = Arrays.copyOf(row, cols);
    }
    
    return grid;
}

static void printGrid(String[][] grid) {
    
    for (int i = 0; i < grid.length; i++) {
        if (i == 0) {
            System.out.print("   ");
            for (int j = 0; j < grid[0].length; j++) {
                System.out.printf("%2d ", j + 1);
            }
            System.out.println();
        }
        for (int j = 0; j < grid[i].length; j++) {
            if (j == 0) {
                System.out.printf("%2d:", i + 1);
            }
            System.out.printf("%2s ", grid[i][j]);
        }
        System.out.println();
    }
}

那么他们可能会被这样测试:

public static void main(String ... args) {
    String[][] grid = fillGrid(8, 8, "x");
    printGrid(grid);
}

输出如下:

    1  2  3  4  5  6  7  8 
 1: x  x  x  x  x  x  x  x 
 2: x  x  x  x  x  x  x  x 
 3: x  x  x  x  x  x  x  x 
 4: x  x  x  x  x  x  x  x 
 5: x  x  x  x  x  x  x  x 
 6: x  x  x  x  x  x  x  x 
 7: x  x  x  x  x  x  x  x 
 8: x  x  x  x  x  x  x  x 

【讨论】:

  • 我应该把这个放在哪里,因为我只是用了这个,没有任何改变
  • 非常感谢!您对如何将东西随机插入其中有任何提示吗?例如我帖子中的炸弹/宝藏?
  • 使用grid[random.nextInt(rows)][random.nextInt(cols)] = "B";,可能需要检查网格单元是否包含"x"(免费)。
【解决方案2】:

“import java.util.arrays”需要在文件顶部的类定义之上。

【讨论】:

    【解决方案3】:

    好的,首先需要在程序的最顶部输入所有导入,因此将import java.util.Arrays; 放在class Main 上方。

     import java.util.Arrays;
    
     class Main {
         public static void main(String[] args) {
             String[][] grid1=new String[8][8];
             for (int n=0; n<=grid1.length; n++) {
                 System.out.print(n+"\t");
             }
             System.out.println();
    
             for (String[] row: grid1) {
                 Arrays.fill(row, "x");
             }
            
             for (int r=0; r<grid1.length; r++) {
                 System.out.print(r+1+"\t");
                 for (int c=0; c<grid1[r].length; c++)
                     System.out.print(grid1[r][c]+"\t");
                 System.out.println();
             }
         }
     }
    

    完成填充的代码块

     for (String[] row: grid1) {
         Arrays.fill(row, "x");
     }
    

    是一个增强的 for 循环。它的作用是从二维数组中取出每一行,将其存储在局部变量row 中,然后用值“x”填充它(行)。

    至于您问题的另一部分,我想您可以使用随机数生成器来生成炸弹所在的行和列,并将该数字存储在一组中。这样程序就会知道玩家什么时候踩到了炸弹或宝藏,但玩家在它发生之前不会意识到这一点。

    【讨论】:

    • 我将如何将它存储在一个集合中?抱歉,我对整个 java 有点陌生
    • 集合就像一个列表,但它们不能有重复的值。您可以将坐标值配对(您可以为此创建一个新类,其中存储行和列索引)并将该类的对象存储在集合中。你可以在这里阅读更多关于集合的信息tutorials.jenkov.com/java-collections/set.html
    【解决方案4】:

    您可以使用Arrays#setAll 方法填充一个多维数组,并在其中为每一行使用Arrays#fill 方法。

    public static void main(String[] args) {
        int n = 8;
        // create a new empty 2d array filled with nulls
        String[][] grid = new String[n][n];
        // set all array elements to 'X'
        Arrays.setAll(grid, i -> {
            Arrays.fill(grid[i], "X");
            return grid[i];
        });
        // output
        printGrid(grid);
    }
    
    public static void printGrid(String[][] grid) {
        // upper row with numbers
        IntStream.range(0, grid.length + 1).forEach(i -> System.out.print(i + " "));
        System.out.println();
        // grid contents with left column of numbers
        IntStream.range(0, grid.length).forEach(i -> {
            // left column with numbers
            System.out.print((i + 1) + " ");
            // grid contents line by line
            Arrays.stream(grid[i]).forEach(str -> System.out.print(str + " "));
            System.out.println();
        });
    }
    

    输出:

    0 1 2 3 4 5 6 7 8 
    1 X X X X X X X X 
    2 X X X X X X X X 
    3 X X X X X X X X 
    4 X X X X X X X X 
    5 X X X X X X X X 
    6 X X X X X X X X 
    7 X X X X X X X X 
    8 X X X X X X X X 
    

    另见:How do I return such an multi-dimensional array?

    【讨论】:

      【解决方案5】:

      import 语句总是定义在整个程序之上,从而导入预构建函数和类

      import java.util.Arrays;
      

      这将是定义 Main 类之前程序的第一行。

      arrays.fill(grid1[0],so);
      

      这里由于so不是变量,所以好像是字符串“so”,最好先定义或者做成字符串为“so” 这段代码可能会提供一些关于如何使用它的想法。

      import java.util.Arrays;
      
      public class Main {
          public static void main(String[] args) {
              String[][] grid1 = new String[8][8];
      
              for (int r = 0; r < grid1.length; r++) {
                  for (int c = 0; c < grid1[r].length; c++)
                      System.out.print(grid1[r][c] + "\t");
                  System.out.println();
              }
      
              Arrays.fill(grid1[0], "so");
              System.out.println("\nAfter the array is: ");
      
              for (int r = 0; r < grid1.length; r++) {
                  for (int c = 0; c < grid1[r].length; c++)
                      System.out.print(grid1[r][c] + "\t");
                  System.out.println();
              }
          }
      }
      

      【讨论】:

      • 谢谢!我确实有 1 个问题。当你把 System.out.println("\nArray 后面是:");你什么意思?
      • 请不要硬编码for循环约束(clength属性。
      • 当我进行这些更改时,它会添加到另一个由 x 分隔的数组中
      • @dracobatman From System.out.println("数组后是:"); .. 我的意思是在 Array.fill() 之后数组的第一行发生了变化,因此更新后的数组是 .
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 2018-01-27
      • 2021-02-10
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      相关资源
      最近更新 更多