2016-07-21 2 views
-3

Что является лучшим оптимальным способом узнать победителя в игре 3x3 Tic tac toe, где доска представлена ​​матрицей? ПредложенияАлгоритм поиска победителя tic tac toe

+2

кучу сослагательного наклонения ... – user1121883

+0

Возможный дубликат [Tic Tac Toe java] (http://stackoverflow.com/questions/10961749/tic-tac-toe-java) –

ответ

2

Я предполагаю, что вы используете массив с двумя размерами Booleans. Так как булев может иметь три значения (null, true и false). Поскольку только 2 игрока могут играть в любой момент времени, вам нужны только три значения. undefined, player 1 и player 2.

Это метод, который будет работать с любым массивом Boolean, если размер больше, чем 1. Он вернет true, если true выиграл, false, если false выиграл и null, если еще нет победителя.

public static Boolean getWinner(Boolean[][] grid) { 
    if (grid == null) 
     return null; 
    int size = grid.length; 
    if (size == 0) 
     return null; 
    if (size == 1 && (grid[0][0] != null)) { 
     return grid[0][0]; 
    } 
    boolean flag = true; 
    // checks horizontal 
    for (int index = 0; index <= size - 1; index++) { 
     flag = true; 
     for (int i = 1; i <= size - 1; i++) { 
      if (grid[index][i] != grid[index][i - 1]) { 
       flag = false; 
       break; 
      } 
     } 
     if (flag) 
      return grid[index][0]; 
    } 
    // checks vertical 
    for (int index = 0; index <= size - 1; index++) { 
     flag = true; 
     for (int i = 1; i <= size - 1; i++) { 
      if (grid[i][index] != grid[i - 1][index]) { 
       flag = false; 
       break; 
      } 
     } 
     if (flag) 
      return grid[0][index]; 
    } 
    // checks diagonal 
    flag = true; 
    for (int index = 1; index <= size - 1; index++) { 
     if (grid[index][index] != grid[index - 1][index - 1]) { 
      flag = false; 
      break; 
     } 
    } 
    if (flag) 
     return grid[0][0]; 
    flag = true; 
    for (int index = 1; index <= size - 1; index++) { 
     if (grid[size - index - 1][index] != grid[size - index][index - 1]) { 
      flag = false; 
      break; 
     } 
    } 
    if (flag) 
     return grid[size - 1][0]; 
    return null; 
} 

Sidenote: Если вы используете Enum вместо Boolean, то вам нужно изменить только два Booleans на первой линии и все == с equals

+0

Спасибо, что я успешно его реализовал !! –

1

Эти функции должны это делать. Я использовал массив символов, когда сделал свой тик-так-палец.

int rowcheck(char ch[3][3]) 
{ 
    int i; 
    char ans; 
    for(i=0;i<3;i++) 
    { 
     if(ch[i][0]==ch[i][1] && ch[i][1]==ch[i][2]) 
     { 
      ans=ch[i][0]; 
      break; 
     } 
    } 
    if(ans=='O') 
    return 1; 
    else if(ans=='X') 
    return 2; 
    else 
    return 0; 
} 
int colcheck(char ch[3][3]) 
{ 
    int i; 
    char ans; 
    for(i=0;i<3;i++) 
    { 
     if(ch[0][i]==ch[1][i] && ch[1][i]==ch[2][i]) 
     { 
      ans=ch[0][i]; 
      break; 
     } 
    } 
    if(ans=='O') 
    return 1; 
    else if(ans=='X') 
    return 2; 
    else 
    return 0; 
} 
int diagcheck(char ch[3][3]) 
{ 
    char ans; 
    if(ch[0][0]==ch[1][1] && ch[1][1]==ch[2][2]) 
    ans=ch[0][0]; 
    if(ch[0][2]==ch[1][1] && ch[1][1]==ch[2][0]) 
    ans=ch[0][2]; 
    if(ans=='O') 
    return 1; 
    else if(ans=='X') 
    return 2; 
    else 
    return 0; 
} 

Игрок 1 выигрывает, если 1 возвращается еще 2 игрока. Проверить эту ссылку для получения дополнительной информации:

https://keepkoding.wordpress.com/2015/12/12/everybody-knows-tic-tac-toe/

заметь, это ссылка на C++, но логика проста для понимания.

+0

Да, я понял логику спасибо !!! –

+0

Но есть ли лучший способ, как с меньшей сложностью времени? –

+2

Если вам нужно проверить равенство, я не вижу лучшего способа, чем это. Кроме того, учитывая, что вы играете в Tic Tac Toe, я не вижу причин уменьшить временную сложность. Но если вам нужно, самым простым способом было бы не выполнять такие проверки, пока не было сделано по крайней мере 6 ходов. Учитывая, что можно сделать только 9 ходов, это уменьшает более 2/3 времени. Если вам понравился мой ответ, пожалуйста, поддержите его. –