【问题标题】:Boolean board game in javajava中的布尔棋盘游戏
【发布时间】:2020-10-07 21:42:28
【问题描述】:

程序应该打印出 array1 中的给定值,并将第二个数组打印为真或假。

Array1 代表一个棋盘游戏,其中角色可以站在不同的位置。整数表示站在每个位置的危险程度。

如果角色发现自己位于 int 3,则将其宣布为死亡。 如果将每个邻居(不包括当前位置)的值相加,并且总和等于或大于15,也将被宣布死亡。

死=假(F) 活着=真(T)

因此,如果当前位置为 2 或 1,并且每个邻居的总值小于 15,则角色存活。数组边缘缺失的邻居记为 0。

我如何以与 array1 相同的方式打印它,但使用 T 或 F 的布尔值?

totalavGrannar 是应该添加所有邻居总值的变量。

到目前为止我的代码:

     import java.util.Arrays;
     public class uppg10{
      public static void main(String[] args){


      int [][] array1 = {{1,1,2,3,3},
                         {2,1,1,2,3},
                         {3,2,2,1,2},
                         {3,3,3,3,3}};

      boolean [][] array2 = new boolean [4][5];

      int rows = array1.length;
      int cols = array1[0].length;

      int totalavGrannar = 0;

      array2 = new boolean[rows][cols];

      for (int row=0; row<rows; row++) {
       for (int col=0; col<cols; col++) {

       System.out.print(String.format("%4d", array1[row][col]));

        if ( ( (col+1) % cols ==0) && (col > 0))

        System.out.println();
       }
      }

      for (int row=0; row<rows; row++) {
       for (int col=0; col<cols; col++) {

       boolean trueorFalse;

       if (array1[row][col]<3) {
        trueorFalse = true;
        array2[row][col] = trueorFalse;
       }
       else{
         trueorFalse = false;
       }

       row = 1;
       col = 1;

       for(int offsetRow=row-1; offsetRow<=row+1; offsetRow++){
        for(int offsetCol=col-1; offsetCol<=col+1; offsetCol++){

           totalavGrannar += array1[offsetRow][offsetCol];

           boolean trueorFalse2;

           if (totalavGrannar<15) {
             trueorFalse2 = true;
             array2[row][col] = trueorFalse2;
           }

           else{
             trueorFalse2 = false;

           }

         }
        }

       }
      }

      for (int row=0; row<array2.length; row++) {
       for (int col=0; col<array2[row].length; col++) {

       System.out.print(String.format("%8s" , array2[row][col] ? "T" : "F"));

       if ( ( (col+1) % cols ==0) && (col > 0))

       System.out.println();

       }
      }

} }

【问题讨论】:

    标签: java arrays for-loop boolean operators


    【解决方案1】:

    如何以与 array1 相同的方式打印它,但使用 T 或 F 的布尔值?

    对于您的问题,您在代码中做得正确。 您的代码不起作用,因为您几乎没有其他问题:

    1. 在第二个循环中,即使为 false(死),您也会覆盖 array2 值。 你让他活着(设置为真)

      if (totalavGrannar<15) {
          trueorFalse2 = true;
          array2[row][col] = trueorFalse2;
      }
      

      此外,您将位置与所有邻居相加(总共 9 个单元格,而不是只有 8 个邻居)

    --> 在解决方案中,我设置条件以排除职位本身。

    1. 另一个问题是,当您对邻居求和时,您会检查每次添加的相等性为 15 以进行更新 (T/F)。这是浪费。 --> 您需要对所有内容求和,然后才更新值(T/F)。

    2. 在第二个循环中,您将循环条件重置为“1”,这样您就有了无限循环。 --> 我删除了那些行。

    3. 您忘记重置 totalavGrannar 我建议的一个简短修复: (我也去掉了一些多余的行)

        import java.util.Arrays;
      
        public class uppg10 {
        public static void main(String[] args) {
       int[][] array1 = {{1, 1, 2, 3, 3},
               {2, 1, 1, 2, 3},
               {3, 2, 2, 1, 2},
               {3, 3, 3, 3, 3}};
      
       int rows = array1.length;
       int cols = array1[0].length;
      
       boolean[][] array2 = new boolean[rows][cols];
      
       int totalavGrannar = 0;
       //Print array1
       for (int row = 0; row < rows; row++) {
           for (int col = 0; col < cols; col++) {
               System.out.print(String.format("%4d", array1[row][col]));
               if (((col + 1) % cols == 0) && (col > 0))
                   System.out.println();
           }
       }
      
       for (int row = 0; row < rows; row++) {
           for (int col = 0; col < cols; col++) {
      
               if (array1[row][col] < 3)
                   array2[row][col] = true;
               //Iterate neighbors to sum values
               for (int offsetRow = row - 1; offsetRow <= row + 1; offsetRow++) {
                   for (int offsetCol = col - 1; offsetCol <= col + 1; offsetCol++) {
      
                       if (offsetRow >= 0 && offsetCol >= 0)   //0-bounds check
                           /*if (offsetRow < array1.length && offsetCol < array1.length) //edges-bounds check
                               if (offsetRow != row && offsetCol != col) {      //exclude position from sum
                                   totalavGrannar += array1[offsetRow][offsetCol];
                               }*/
                           if (offsetRow < array1.length && offsetCol < array1[0].length) //edges-bounds check
                               if (offsetRow != row || offsetCol != col) {      //exclude position from sum
                                   totalavGrannar += array1[offsetRow][offsetCol];
                               }
                   }
               }
               if (totalavGrannar >= 15)
                   array2[row][col] = false;
               totalavGrannar = 0;
           }
       }
       for (int row = 0; row < array2.length; row++) {
           for (int col = 0; col < array2[row].length; col++) {
      
               System.out.print(String.format("%8s", array2[row][col] ? "T" : "F"));
               if (((col + 1) % cols == 0) && (col > 0))
      
                   System.out.println();
      
           }
       }
      

      } }

    【讨论】:

    • 你先生,是国宝!我有一个问题。对于示例 array1[3][4[ 不应该在给定条件下打印为 F 吗? if (totalavGrannar >= 15) array2[row][col] = false;
    • 是的,你说得对!我在代码中添加了修复。查看代码中 /*comment*/ 中的差异
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 2020-03-19
    • 2010-11-27
    • 1970-01-01
    相关资源
    最近更新 更多