2015-02-20 2 views
0

Я создаю масштабируемую программу TicTacToe, и у меня возникает проблема при попытке проверить диагонали для строки.Проверьте масштабируемые диагонали матрицы для идентичной строки

Я был в состоянии проверить строки с помощью этого метода:

public boolean checkRowsForWin(String b){ 
    //Check all the rows for a winner 
    for(int y = 0; y < size; y++){ 
     for (int x = 0; x < size; x++){ 
      if (globalGrid[y][x].equals(b)){ 
       inRow++; 
       if (inRow >= neededToWin){ 
        return true; 
       } 
      }else{ 
       inRow = 0; 
      } 
     } 
     inRow = 0; 
    } 
    inRow = 0; 
    return false; 
} 

Я попытался комбинацию для петель и если заявления, и моя последняя модификация это ниже. Это сработало, если диагональ включала только верхний правый угол, когда мне нужно его проверить, даже если диагональ не находится в углу.

public boolean checkDiagForWin(String b, int c, int d){ 
    for (int x = c, y = d; x < size && y < size; x++, y++){ 
     if (globalGrid[y][x].equals(b)){ 
      inRow++; 
      if (inRow >= neededToWin){ 
       return true; 
      } 
     } 
     else{ 
      inRow = 0; 
     } 
     inRow = 0; 
     for (int x2 = size - 1, y2 = 0; x2 >=0 && y2 < size; x2--, y2++){ 
      if (globalGrid[y2][x2].equals(b)){ 
       inRow++; 
       if (inRow >= neededToWin){ 
        return true; 
       } 
      } 
      else{ 
       inRow = 0; 
      } 
     } 
     inRow = 0; 
    } 
    inRow = 0; 
    return false; 
} 

Сумма в строке и размер платы может изменяться, так что это не так просто, как проверка только два прилегающих к позиции.

ответ

1

Вы должны начать процесс, начиная с каждой возможной позиции, одна возможная реализация может быть:

функцию для запуска процесса проверки на каждой позиции:

public boolean checkDiagonals(String b) { 
    /* Check the diagonals starting in every position */ 
    for (int i = 0; i < size; i++) { 
     for (int j = 0; j < size; j++) { 
      if (checkDiagonalForWin(b, i, j) || checkOtherDiagonalForWin(b, i, j)) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 

Есть функции для проверки диагоналей, начинающихся в определенном положении:

public boolean checkDiagonalForWin(String b, int row, int col){ 

    for (int inRow = 0; row < size && col < size; row++, col++) { 
     //Check all the rows for a winner 
     if (globalGrid[row][col].equals(b)){ 
      inRow++; 
      if (inRow >= neededToWin){ 
       return true; 
      } 
     }else{ 
      inRow = 0; 
     } 
    } 
    return false; 
} 


public boolean checkOtherDiagonalForWin(String b, int row, int col){   
    for (int inRow = 0; row < size && col >= 0; row++, col--) { 
     //Check all the rows for a winner 
     if (globalGrid[row][col].equals(b)){ 
      inRow++; 
      if (inRow >= neededToWin){ 
       return true; 
      } 
     }else{ 
      inRow = 0; 
     } 
    } 
    return false; 
} 
+0

Это работает, однако оно проверяет только, находится ли оно в углу, в то время как диагональ может находиться где угодно на борту (для больших b например, 8). – Tanner

+0

@Tanner Я пропустил это требование, я обновил свой ответ соответственно. –