Преобразование 1D массива в 2D массив относительно циклов FOR Обработка - PullRequest
0 голосов
/ 12 декабря 2018

Я работаю над игрой в крестики-нолики на уроке информатики, используя обработку.В моей программе я кодирую проверку 3 в строке, и я пытаюсь закодировать это, используя код двумерного массива, так как мой массив был инициализирован как двумерный массив при кодировании X / O. Кроме того, мой учитель дал нампример выполнения этого кода, но в одномерном массиве, и поэтому я не знаю, как преобразовать его пример относительно циклов FOR в 2D, чтобы он мог работать в моей программе.Я преобразовал код массива, чтобы применить его к моей программе, и он работает, но код (цикл FOR) относительно того, выиграл ли кто-то, не работает.Кто-нибудь может мне помочь?

void onlyX() { //views only X pieces, runs checker for onlyX (attempted to 
convert to 2D array form)
    for (int i=0; i<3; i++) {
      for (int j=0; j<3; j++) {
        if (boardPiece[i][j] == "X") {
          onlyXPiece[i][j] = "X";
        }
      }
    }
  }

  /*void onlyX() { //1D Form 
    for (int i=0; i<numberOfBoardPieces; i++) {
      if (boardPiece[i] == "X") {
        onlyXPiece[i] = "X";
      }
    }
  }*/

void onlyO() { //views only O pieces, runs checker for onlyO (attempted to 
convert to 2D array form)
   for (int i=0; i<3; i++) {
     for (int j=0; j<3; j++) {
       if (boardPiece[i][j] == "O") {
         onlyOPiece[i][j] = "O";
        }
      }
    }
  }

  /*void onlyO() { //1D form
    for (int i=0; i<numberOfBoardPieces; i++) {
      if (boardPiece[i] == "O") {
        onlyOPiece[i] = "O";
      }
    }
  }*/

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Чтобы проверить, выиграл ли кто-то игру, вы должны проверить столбцы, ряды и диагонали.Напишите функцию checkBoard с одним параметром, где вы можете указать тип фрагмента ("X" pr "O"), который вы хотите проверить:

boolean checkBoard(String p) {

    boolean won = false;

    // check rows and columns
    for (int i=0; !won && i<3; i++) {
        boolean eqRow = true;
        boolean eqCol = true;
        for (int j=0; j<3; j++) {
            eqRow = eqRow && boardPiece[i][j] == p;
            eqCol = eqCol && boardPiece[j][i] == p;
        }
        won = eqRow || eqCol;
    }

    // check diagonals
    if ( !won )
    {
        boolean d1 = true;
        boolean d2 = true;
        for (int i=0; !won && i<3; i++) {
            d1 = d1 && boardPiece[i][i] == p;
            d2 = d2 && boardPiece[2-i][i] == p;
        }
        won = d1 || d2;
    }

    return won;
}
0 голосов
/ 12 декабря 2018

Ваш цикл 2D-массива FOR (обычно называемый двойным циклом FOR LOOP) кажется нормальным, хотя я не совсем понимаю, почему вы поместили X и O в отдельные 2D-массивы.Есть несколько способов проверить условие выигрыша, но это кажется слишком сложным.

Я адаптировал двойной цикл for в верхней части вашего кода, чтобы выполнить проверку выигрыша, которая проста для понимания и пригодна для обоих Xи О. Не забывайте, что вы также должны проверить вертикальные и диагональные выигрыши.

String[][] boardPiece = {{"X", "", "O"}, 
                         {"O", "O","O"}, 
                         {"X", "", "X"}};

void setup() {
  println("X wins = "+ str(checkRows("X")));
  println("O wins = "+ str(checkRows("O")));
}

boolean checkRows(String XorO) { 
  for (int i=0; i<3; i++) { //for every row
    boolean win = true;     //set win to true
    for (int j=0; j<3; j++) { //for every column    
      if (boardPiece[i][j] != XorO) {  //if the column does not equal the sign that you are checking
        win = false;                   // meaning its the other, or it's empty, then set win to false
      }                                
    }
    if (win) {
      return true;    //if win is true, then there are 3 X's or 3 O's in this row, so return true
    }
  }
  return false;      // if none of the rows contain 3 equal, return false
}
...