Сделать простой метод более эффективным

В настоящее время я разрабатываю игру TicTacToe, которая реализует минимакс. В этом минимаксном алгоритме у меня есть метод canWin, который значительно сокращает количество необходимых шагов (количество внутренних рекурсивных вызовов минимаксного метода), необходимых для вычисления наилучшего следующего шага. Чтобы показать, насколько canWin влияет на мою программу, код без canWin для игры 3x3 требует около 2000 шагов для расчета хода, а для игры 4x4 - 13810133 шага. Однако для canWin требуется всего около 600 для 3x3 и 9246569 для 4x4.

Удивительной проблемой теперь становится время выполнения. Странная вещь в том, что минимаксный метод на самом деле работает быстрее, без добавления canWin, хотя для завершения расчета требуется намного больше шагов. Что заставляет меня верить, что метод canWin сильно его тормозит. Что-то лучше, чем его цель, но это понятно, учитывая, что это очень плохо написанный метод. Поэтому мне нужна помощь, чтобы сделать canWin более эффективным. Этот метод очень длинный. Излишне так. Его работа состоит в том, чтобы просмотреть текущее состояние доски (который является массивом символов, содержащим X, O или -) и проверить, доступен ли потенциальный выигрыш (например, X X - или O - O). Сначала он проверяет размер доски, а затем проверяет, чей это ход. Тот, кто имеет ход, проверяет, есть ли у него шанс на победу. Если есть шанс, он использует его, заполняя необходимое место. В противном случае он проверяет, есть ли у его противника шанс на победу. Если у его противника есть шанс выиграть, он блокирует его, заполняя необходимый слот. Метод возвращает слот (номер слота), который необходимо заполнить, чтобы получить потенциальный выигрыш или заблокировать потенциальный проигрыш.

Вот оно, я знаю, что это ужасно, но помогите мне здесь:

public int canWin3(){
        int pot=-1;
        if(n==3){
            if(turn=='O'){

                //O win gets priority
                //Check if 0 is free and potential winning spot for O
                if(((state[1] == 'O' && state[2] == 'O')  || 
                        (state[3] == 'O' && state[6]=='O')
                         || (state[4] == 'O' && state[8]=='O'))&&
                         (state[0]=='-')){
                        pot=0;
                }
                //Check if 1 is free and potential winning spot for O
                else if(((state[0] == 'O' && state[2] == 'O')  || 
                        (state[4] == 'O' && state[7]=='O'))&&
                        (state[1]=='-')){
                       pot=1;
                }
                //Check if 2 is free and potential winning spot for O
                else if(((state[0] == 'O' && state[1] == 'O')  || 
                        (state[4] == 'O' && state[6]=='O')
                         || (state[5] == 'O' && state[8]=='O'))&&
                         (state[2]=='-')){
                    pot=2;
                }
                //Check if 3 is free and potential winning spot for O   
                else if(((state[0] == 'O' && state[6] == 'O')  || 
                        (state[4] == 'O' && state[5]=='O'))&&
                        (state[3]=='-')){
                    pot=3;
                }
                //Check if 4 is free and potential winning spot for O
                else if(((state[0] == 'O' && state[8] == 'O')  || 
                        (state[1] == 'O' && state[7]=='O') ||
                          (state[2] == 'O' && state[6]=='O') || 
                         (state[3] == 'O' && state[5] == 'O'))&&
                         (state[4]=='-')){
                    pot=4;
                }
                //Check if 5 is free and potential winning spot for O
                else if(((state[2] == 'O' && state[8] == 'O')  || 
                        (state[3] == 'O' && state[4]=='O'))&&
                        (state[5]=='-')){
                    pot=5;
                }
                //Check if 6 is free and potential winning spot for O
                else if(((state[0] == 'O' && state[3] == 'O')  || 
                        (state[4] == 'O' && state[2]=='O')  ||
                          (state[7] == 'O' && state[8]=='O'))&&
                          (state[6]=='-')){
                    pot=6;
                }
                //Check if 7 is free and potential winning spot for O
                else if(((state[1] == 'O' && state[4] == 'O')  || 
                        (state[6] == 'O' && state[8]=='O'))&&
                        (state[7]=='-')){
                    pot=7;
                }
                //Check if 8 is free and potential winning spot for O
                else if(((state[0] == 'O' && state[4] == 'O')  || 
                        (state[2] == 'O' && state[5]=='O')  || 
                         (state[6] == 'O' && state[7]=='O'))&&
                         (state[8]=='-')){
                    pot=8;
                }

                //Check for possible X win if there are no potential O wins
                //Check if 0 is free and potential winning spot for X
                else if(((state[1] == 'X' && state[2] == 'X')  || 
                        (state[3] == 'X' && state[6]=='X')   || 
                         (state[4] == 'X' && state[8]=='X'))&&
                         (state[0]=='-')){
                    pot=0;
                }
                //Check if 1 is free and potential winning spot for X
                else if(((state[0] == 'X' && state[2] == 'X')  || 
                        (state[4] == 'X' && state[7]=='X'))&&
                        (state[1]=='-')){
                    pot=1;
                }
                //Check if 2 is free and potential winning spot for X
                else if(((state[0] == 'X' && state[1] == 'X')  || 
                        (state[4] == 'X' && state[6]=='X')   || 
                         (state[5] == 'X' && state[8]=='X'))&&
                         (state[2]=='-')){
                    pot=2;
                }
                //Check if 3 is free and potential winning spot for X
                else if(((state[0] == 'X' && state[6] == 'X')  || 
                        (state[4] == 'X' && state[5]=='X'))&&
                        (state[3]=='-')){
                    pot=3;
                }
                //Check if 4 is free and potential winning spot for X
                else if(((state[0] == 'X' && state[8] == 'X')  || 
                        (state[1] == 'X' && state[7]=='X')   || 
                         (state[2] == 'X' && state[6]=='X') || 
                         (state[3] == 'X' && state[5] == 'X'))&&
                         (state[4]=='-')){
                    pot=4;
                }
                //Check if 5 is free and potential winning spot for X
                else if(((state[2] == 'X' && state[8] == 'X')  || 
                        (state[3] == 'X' && state[4]=='X'))&&
                        (state[5]=='-')){
                    pot=5;
                }
                //Check if 6 is free and potential winning spot for X
                else if(((state[0] == 'X' && state[3] == 'X')  || 
                        (state[4] == 'X' && state[2]=='X')   || 
                         (state[7] == 'X' && state[8]=='X'))&&
                         (state[6]=='-')){
                    pot=6;
                }
                //Check if 7 is free and potential winning spot for X
                else if(((state[1] == 'X' && state[4] == 'X')  || 
                        (state[6] == 'X' && state[8]=='X'))&&
                        (state[7]=='-')){
                    pot=7;
                }
                //Check if 8 is free and potential winning spot for X
                else if(((state[0] == 'X' && state[4] == 'X')  || 
                        (state[2] == 'X' && state[5]=='X')  || 
                         (state[6] == 'X' && state[7]=='X'))&&
                         (state[8]=='-')){
                    pot=8;
                }
            }
            //X win gets priority
            //Check if 0 is free and potential winning spot for X
            else {
                if(((state[1] == 'X' && state[2] == 'X')  || 
                        (state[3] == 'X' && state[6]=='X')  || 
                         (state[4] == 'X' && state[8]=='X'))&&
                         (state[0]=='-')){
                    pot=0;
                }
                //Check if 1 is free and potential winning spot for X
                else if(((state[0] == 'X' && state[2] == 'X')  || 
                        (state[4] == 'X' && state[7]=='X'))&&
                        (state[1]=='-')){
                    pot=1;
                }
                //Check if 2 is free and potential winning spot for X
                else if(((state[0] == 'X' && state[1] == 'X')  || 
                        (state[4] == 'X' && state[6]=='X')   || 
                         (state[5] == 'X' && state[8]=='X'))&&
                         (state[2]=='-')){
                    pot=2;
                }
                //Check if 3 is free and potential winning spot for X
                else if(((state[0] == 'X' && state[6] == 'X')  || 
                        (state[4] == 'X' && state[5]=='X'))&&
                        (state[3]=='-')){
                    pot=3;
                }
                //Check if 4 is free and potential winning spot for X
                else if(((state[0] == 'X' && state[8] == 'X')  || 
                        (state[1] == 'X' && state[7]=='X')   ||
                          (state[2] == 'X' && state[6]=='X') ||
                         (state[3] == 'X' && state[5] == 'X'))&&
                         (state[4]=='-')){
                    pot=4;
                }
                //Check if 5 is free and potential winning spot for X
                else if(((state[2] == 'X' && state[8] == 'X')  || 
                        (state[3] == 'X' && state[4]=='X'))&&
                        (state[5]=='-')){
                    pot=5;
                }
                //Check if 6 is free and potential winning spot for X
                else if(((state[0] == 'X' && state[3] == 'X')  || 
                        (state[4] == 'X' && state[2]=='X')  ||
                          (state[7] == 'X' && state[8]=='X'))&&
                         (state[6]=='-')){
                    pot=6;
                }
                //Check if 7 is free and potential winning spot for X
                else if(((state[1] == 'X' && state[4] == 'X')  || 
                        (state[6] == 'X' && state[8]=='X'))&&
                        (state[7]=='-')){
                    pot=7;
                }
                //Check if 8 is free and potential winning spot for X
                else if(((state[0] == 'X' && state[4] == 'X')  || 
                        (state[2] == 'X' && state[5]=='X')  || 
                         (state[6] == 'X' && state[7]=='X'))&&
                         (state[8]=='-')){
                    pot=8;
                }

                //Check for possible O win if there are no X wins
                //Check if 0 is free and potential winning spot for O
                else if(((state[1] == 'O' && state[2] == 'O')  || 
                        (state[3] == 'O' && state[6]=='O')   ||
                          (state[4] == 'O' && state[8]=='O'))&&
                         (state[0]=='-')){
                        pot=0;
                }
                //Check if 1 is free and potential winning spot for O
                else if(((state[0] == 'O' && state[2] == 'O')  || 
                        (state[4] == 'O' && state[7]=='O'))&&
                        (state[1]=='-')){
                       pot=1;
                }
                //Check if 2 is free and potential winning spot for O
                else if(((state[0] == 'O' && state[1] == 'O')  || 
                        (state[4] == 'O' && state[6]=='O')   ||
                         (state[5] == 'O' && state[8]=='O'))&&
                         (state[2]=='-')){
                    pot=2;
                }
                //Check if 3 is free and potential winning spot for O
                else if(((state[0] == 'O' && state[6] == 'O')  || 
                        (state[4] == 'O' && state[5]=='O'))&&
                        (state[3]=='-')){
                    pot=3;
                }
                //Check if 4 is free and potential winning spot for O
                else if(((state[0] == 'O' && state[8] == 'O')  || 
                        (state[1] == 'O' && state[7]=='O')   || 
                         (state[2] == 'O' && state[6]=='O') || 
                         (state[3] == 'O' && state[5] == 'O'))&&
                         (state[4]=='-')){
                    pot=4;
                }
                //Check if 5 is free and potential winning spot for O
                else if(((state[2] == 'O' && state[8] == 'O')  || 
                        (state[3] == 'O' && state[4]=='O'))&&
                        (state[5]=='-')){
                    pot=5;
                }
                //Check if 6 is free and potential winning spot for O
                else if(((state[0] == 'O' && state[3] == 'O')  || 
                        (state[4] == 'O' && state[2]=='O')   || 
                         (state[7] == 'O' && state[8]=='O'))&&
                         (state[6]=='-')){
                    pot=6;
                }
                //Check if 7 is free and potential winning spot for O
                else if(((state[1] == 'O' && state[4] == 'O')  ||
                        (state[6] == 'O' && state[8]=='O'))&&
                        (state[7]=='-')){
                    pot=7;
                }
                //Check if 8 is free and potential winning spot for O
                else if(((state[0] == 'O' && state[4] == 'O')  ||
                        (state[2] == 'O' && state[5]=='O')  || 
                         (state[6] == 'O' && state[7]=='O'))&&
                         (state[8]=='-')){
                    pot=8;
                }
            }
        }
        else {
                if(turn=='O'){
                    //potential O win gets priority
                    //Check if 0 is free and potential winning spot for O
                    if(((state[1] == 'O' && state[2] == 'O' && state[3]=='O')  ||
                            (state[4] == 'O' && state[8]=='O' && state[12]=='O') ||
                            (state[5] == 'O' && state[10]=='O' && state[15]=='O'))&&
                            (state[0]=='-')){
                        pot=0;
                    }
                    //Check if 1 is free and potential winning spot for O
                    else if(((state[0] == 'O' && state[2] == 'O' && state[3]=='O') ||
                            (state[5] == 'O' && state[9]=='O' && state[13]=='O'))&&
                            (state[1]=='-')){
                        pot=1;
                    }
                    //Check if 2 is free and potential winning spot for O
                    else if(((state[0] == 'O' && state[1] == 'O' && state[3]=='O') ||
                            (state[6] == 'O' && state[10]=='O' && state[14]=='O'))&&
                            (state[2]=='-')){
                        pot=2;
                    }
                    //Check if 3 is free and potential winning spot for O
                    else if(((state[0] == 'O' && state[1] == 'O' && state[2]=='O') ||
                            (state[7] == 'O' && state[11] =='O' && state[15]=='O') ||
                            (state[12] == 'O' && state[9] == 'O' && state[6] == 'O')) &&
                            (state[3]=='-')){
                        pot=3;
                    }
                    //Check if 4 is free and potential winning spot for O
                    else if(((state[0] == 'O' && state[8] == 'O' && state[12]=='O') ||
                            (state[5] == 'O' && state[6] =='O' && state[7]=='O')) &&
                            (state[4]=='-')){
                        pot=4;
                    }
                    //Check if 5 is free and potential winning spot for O
                    else if(((state[1] == 'O' && state[9] == 'O' && state[13]=='O') ||
                            (state[4] == 'O' && state[6] =='O' && state[7]=='O')) &&
                            (state[5]=='-')){
                        pot=5;
                    }
                    //Check if 6 is free and potential winning spot for O
                    else if(((state[2] == 'O' && state[10] == 'O' && state[14]=='O') ||
                            (state[4] == 'O' && state[5] =='O' && state[7]=='O')) &&
                            (state[6]=='-')){
                        pot=6;
                    }
                    //Check if 7 is free and potential winning spot for O
                    else if(((state[3] == 'O' && state[11] == 'O' && state[15]=='O') ||
                            (state[4] == 'O' && state[6] =='O' && state[5]=='O')) &&
                            (state[7]=='-')){
                        pot=7;
                    }
                    //Check if 8 is free and potential winning spot for O
                    else if(((state[9] == 'O' && state[10] == 'O' && state[11]=='O') ||
                            (state[0] == 'O' && state[4] =='O' && state[12]=='O')) &&
                            (state[8]=='-')){
                        pot=8;
                    }
                    //Check if 9 is free and potential winning spot for O
                    else if(((state[8] == 'O' && state[10] == 'O' && state[11]=='O') ||
                            (state[1] == 'O' && state[5] =='O' && state[13]=='O')) &&
                            (state[9]=='-')){
                        pot=9;
                    }
                    //Check if 10 is free and potential winning spot for O
                    else if(((state[8] == 'O' && state[9] == 'O' && state[11]=='O') ||
                            (state[2] == 'O' && state[6] =='O' && state[14]=='O')) &&
                            (state[10]=='-')){
                        pot=10;
                    }
                    //Check if 11 is free and potential winning spot for O
                    else if(((state[8] == 'O' && state[9] == 'O' && state[10]=='O') ||
                            (state[2] == 'O' && state[6] =='O' && state[14]=='O')) &&
                            (state[11]=='-')){
                        pot=11;
                    }
                    //Check if 12 is free and potential winning spot for O
                    else if(((state[13] == 'O' && state[14] == 'O' && state[15]=='O') ||
                            (state[0] == 'O' && state[4] =='O' && state[8]=='O') ||
                            (state[9] == 'O' && state[6] =='O' && state[3]=='O')) &&
                            (state[12]=='-')){
                        pot=12;
                    }
                    //Check if 13 is free and potential winning spot for O
                    else if(((state[12] == 'O' && state[14] == 'O' && state[15]=='O') ||
                            (state[1] == 'O' && state[5] =='O' && state[9]=='O')) &&
                            (state[13]=='-')){
                        pot=13;
                    }
                    //Check if 14 is free and potential winning spot for O
                    else if(((state[12] == 'O' && state[13] == 'O' && state[15]=='O') ||
                            (state[2] == 'O' && state[6] =='O' && state[10]=='O')) &&
                            (state[14]=='-')){
                        pot=14;
                    }
                    //Check if 15 is free and potential winning spot for O
                    else if(((state[12] == 'O' && state[13] == 'O' && state[14]=='O') ||
                            (state[3] == 'O' && state[7] =='O' && state[11]=='O') ||
                            (state[10] == 'O' && state[5] =='O' && state[0]=='O')) &&
                            (state[15]=='-')){
                        pot=15;
                    }
                    //Check if 0 is free and potential winning spot for X
                    else if(((state[1] == 'X' && state[2] == 'X' && state[3]=='X')  ||
                            (state[4] == 'X' && state[8]=='X' && state[12]=='X') ||
                            (state[5] == 'X' && state[10]=='X' && state[15]=='X'))&&
                            (state[0]=='-')){
                        pot=0;
                    }
                    //Check if 1 is free and potential winning spot for X
                    else if(((state[0] == 'X' && state[2] == 'X' && state[3]=='X') ||
                            (state[5] == 'X' && state[9]=='X' && state[13]=='X'))&&
                            (state[1]=='-')){
                        pot=1;
                    }
                    //Check if 2 is free and potential winning spot for X
                    else if(((state[0] == 'X' && state[1] == 'X' && state[3]=='X') ||
                            (state[6] == 'X' && state[10]=='X' && state[14]=='X'))&&
                            (state[2]=='-')){
                        pot=2;
                    }
                    //Check if 3 is free and potential winning spot for X
                    else if(((state[0] == 'X' && state[1] == 'X' && state[2]=='X') ||
                            (state[7] == 'X' && state[11] =='X' && state[15]=='X') ||
                            (state[12] == 'X' && state[9] == 'X' && state[6] == 'X')) &&
                            (state[3]=='-')){
                        pot=3;
                    }
                    //Check if 4 is free and potential winning spot for X
                    else if(((state[0] == 'X' && state[8] == 'X' && state[12]=='X') ||
                            (state[5] == 'X' && state[6] =='X' && state[7]=='X')) &&
                            (state[4]=='-')){
                        pot=4;
                    }
                    //Check if 5 is free and potential winning spot for X
                    else if(((state[1] == 'X' && state[9] == 'X' && state[13]=='X') ||
                            (state[4] == 'X' && state[6] =='X' && state[7]=='X')) &&
                            (state[5]=='-')){
                        pot=5;
                    }
                    //Check if 6 is free and potential winning spot for X
                    else if(((state[2] == 'X' && state[10] == 'X' && state[14]=='X') ||
                            (state[4] == 'X' && state[5] =='X' && state[7]=='X')) &&
                            (state[6]=='-')){
                        pot=6;
                    }
                    //Check if 7 is free and potential winning spot for X
                    else if(((state[3] == 'X' && state[11] == 'X' && state[15]=='X') ||
                            (state[4] == 'X' && state[6] =='X' && state[5]=='X')) &&
                            (state[7]=='-')){
                        pot=7;
                    }
                    //Check if 8 is free and potential winning spot for X
                    else if(((state[9] == 'X' && state[10] == 'X' && state[11]=='X') ||
                            (state[0] == 'X' && state[4] =='X' && state[12]=='X')) &&
                            (state[8]=='-')){
                        pot=8;
                    }
                    //Check if 9 is free and potential winning spot for X
                    else if(((state[8] == 'X' && state[10] == 'X' && state[11]=='X') ||
                            (state[1] == 'X' && state[5] =='X' && state[13]=='X')) &&
                            (state[9]=='-')){
                        pot=9;
                    }
                    //Check if 10 is free and potential winning spot for X
                    else if(((state[8] == 'X' && state[9] == 'X' && state[11]=='X') ||
                            (state[2] == 'X' && state[6] =='X' && state[14]=='X')) &&
                            (state[10]=='-')){
                        pot=10;
                    }
                    //Check if 11 is free and potential winning spot for X
                    else if(((state[8] == 'X' && state[9] == 'X' && state[10]=='X') ||
                            (state[2] == 'X' && state[6] =='X' && state[14]=='X')) &&
                            (state[11]=='-')){
                        pot=11;
                    }
                    //Check if 12 is free and potential winning spot for X
                    else if(((state[13] == 'X' && state[14] == 'X' && state[15]=='X') ||
                            (state[0] == 'X' && state[4] =='X' && state[8]=='X') ||
                            (state[9] == 'X' && state[6] =='X' && state[3]=='X')) &&
                            (state[12]=='-')){
                        pot=12;
                    }
                    //Check if 13 is free and potential winning spot for X
                    else if(((state[12] == 'X' && state[14] == 'X' && state[15]=='X') ||
                            (state[1] == 'X' && state[5] =='X' && state[9]=='X')) &&
                            (state[13]=='-')){
                        pot=13;
                    }
                    //Check if 14 is free and potential winning spot for X
                    else if(((state[12] == 'X' && state[13] == 'X' && state[15]=='X') ||
                            (state[2] == 'X' && state[6] =='X' && state[10]=='X')) &&
                            (state[14]=='-')){
                        pot=14;
                    }
                    //Check if 15 is free and potential winning spot for X
                    else if(((state[12] == 'X' && state[13] == 'X' && state[14]=='X') ||
                            (state[3] == 'X' && state[7] =='X' && state[11]=='X') ||
                            (state[10] == 'X' && state[5] =='X' && state[0]=='X')) &&
                            (state[15]=='-')){
                        pot=15;
                    }
                }
                else {
                    //potential O win gets priority
                    //Check if 0 is free and potential winning spot for X
                    if(((state[1] == 'X' && state[2] == 'X' && state[3]=='X')  ||
                            (state[4] == 'X' && state[8]=='X' && state[12]=='X') ||
                            (state[5] == 'X' && state[10]=='X' && state[15]=='X'))&&
                            (state[0]=='-')){
                        pot=0;
                    }
                    //Check if 1 is free and potential winning spot for X
                    else if(((state[0] == 'X' && state[2] == 'X' && state[3]=='X') ||
                            (state[5] == 'X' && state[9]=='X' && state[13]=='X'))&&
                            (state[1]=='-')){
                        pot=1;
                    }
                    //Check if 2 is free and potential winning spot for X
                    else if(((state[0] == 'X' && state[1] == 'X' && state[3]=='X') ||
                            (state[6] == 'X' && state[10]=='X' && state[14]=='X'))&&
                            (state[2]=='-')){
                        pot=2;
                    }
                    //Check if 3 is free and potential winning spot for X
                    else if(((state[0] == 'X' && state[1] == 'X' && state[2]=='X') ||
                            (state[7] == 'X' && state[11] =='X' && state[15]=='X') ||
                            (state[12] == 'X' && state[9] == 'X' && state[6] == 'X')) &&
                            (state[3]=='-')){
                        pot=3;
                    }
                    //Check if 4 is free and potential winning spot for X
                    else if(((state[0] == 'X' && state[8] == 'X' && state[12]=='X') ||
                            (state[5] == 'X' && state[6] =='X' && state[7]=='X')) &&
                            (state[4]=='-')){
                        pot=4;
                    }
                    //Check if 5 is free and potential winning spot for X
                    else if(((state[1] == 'X' && state[9] == 'X' && state[13]=='X') ||
                            (state[4] == 'X' && state[6] =='X' && state[7]=='X')) &&
                            (state[5]=='-')){
                        pot=5;
                    }
                    //Check if 6 is free and potential winning spot for X
                    else if(((state[2] == 'X' && state[10] == 'X' && state[14]=='X') ||
                            (state[4] == 'X' && state[5] =='X' && state[7]=='X')) &&
                            (state[6]=='-')){
                        pot=6;
                    }
                    //Check if 7 is free and potential winning spot for X
                    else if(((state[3] == 'X' && state[11] == 'X' && state[15]=='X') ||
                            (state[4] == 'X' && state[6] =='X' && state[5]=='X')) &&
                            (state[7]=='-')){
                        pot=7;
                    }
                    //Check if 8 is free and potential winning spot for X
                    else if(((state[9] == 'X' && state[10] == 'X' && state[11]=='X') ||
                            (state[0] == 'X' && state[4] =='X' && state[12]=='X')) &&
                            (state[8]=='-')){
                        pot=8;
                    }
                    //Check if 9 is free and potential winning spot for X
                    else if(((state[8] == 'X' && state[10] == 'X' && state[11]=='X') ||
                            (state[1] == 'X' && state[5] =='X' && state[13]=='X')) &&
                            (state[9]=='-')){
                        pot=9;
                    }
                    //Check if 10 is free and potential winning spot for X
                    else if(((state[8] == 'X' && state[9] == 'X' && state[11]=='X') ||
                            (state[2] == 'X' && state[6] =='X' && state[14]=='X')) &&
                            (state[10]=='-')){
                        pot=10;
                    }
                    //Check if 11 is free and potential winning spot for X
                    else if(((state[8] == 'X' && state[9] == 'X' && state[10]=='X') ||
                            (state[2] == 'X' && state[6] =='X' && state[14]=='X')) &&
                            (state[11]=='-')){
                        pot=11;
                    }
                    //Check if 12 is free and potential winning spot for X
                    else if(((state[13] == 'X' && state[14] == 'X' && state[15]=='X') ||
                            (state[0] == 'X' && state[4] =='X' && state[8]=='X') ||
                            (state[9] == 'X' && state[6] =='X' && state[3]=='X')) &&
                            (state[12]=='-')){
                        pot=12;
                    }
                    //Check if 13 is free and potential winning spot for X
                    else if(((state[12] == 'X' && state[14] == 'X' && state[15]=='X') ||
                            (state[1] == 'X' && state[5] =='X' && state[9]=='X')) &&
                            (state[13]=='-')){
                        pot=13;
                    }
                    //Check if 14 is free and potential winning spot for X
                    else if(((state[12] == 'X' && state[13] == 'X' && state[15]=='X') ||
                            (state[2] == 'X' && state[6] =='X' && state[10]=='X')) &&
                            (state[14]=='-')){
                        pot=14;
                    }
                    //Check if 15 is free and potential winning spot for X
                    else if(((state[12] == 'X' && state[13] == 'X' && state[14]=='X') ||
                            (state[3] == 'X' && state[7] =='X' && state[11]=='X') ||
                            (state[10] == 'X' && state[5] =='X' && state[0]=='X')) &&
                            (state[15]=='-')){
                        pot=15;
                    }
                    //Check if 0 is free and potential winning spot for O
                    if(((state[1] == 'O' && state[2] == 'O' && state[3]=='O')  ||
                            (state[4] == 'O' && state[8]=='O' && state[12]=='O') ||
                            (state[5] == 'O' && state[10]=='O' && state[15]=='O'))&&
                            (state[0]=='-')){
                        pot=0;
                    }
                    //Check if 1 is free and potential winning spot for O
                    else if(((state[0] == 'O' && state[2] == 'O' && state[3]=='O') ||
                            (state[5] == 'O' && state[9]=='O' && state[13]=='O'))&&
                            (state[1]=='-')){
                        pot=1;
                    }
                    //Check if 2 is free and potential winning spot for O
                    else if(((state[0] == 'O' && state[1] == 'O' && state[3]=='O') ||
                            (state[6] == 'O' && state[10]=='O' && state[14]=='O'))&&
                            (state[2]=='-')){
                        pot=2;
                    }
                    //Check if 3 is free and potential winning spot for O
                    else if(((state[0] == 'O' && state[1] == 'O' && state[2]=='O') ||
                            (state[7] == 'O' && state[11] =='O' && state[15]=='O') ||
                            (state[12] == 'O' && state[9] == 'O' && state[6] == 'O')) &&
                            (state[3]=='-')){
                        pot=3;
                    }
                    //Check if 4 is free and potential winning spot for O
                    else if(((state[0] == 'O' && state[8] == 'O' && state[12]=='O') ||
                            (state[5] == 'O' && state[6] =='O' && state[7]=='O')) &&
                            (state[4]=='-')){
                        pot=4;
                    }
                    //Check if 5 is free and potential winning spot for O
                    else if(((state[1] == 'O' && state[9] == 'O' && state[13]=='O') ||
                            (state[4] == 'O' && state[6] =='O' && state[7]=='O')) &&
                            (state[5]=='-')){
                        pot=5;
                    }
                    //Check if 6 is free and potential winning spot for O
                    else if(((state[2] == 'O' && state[10] == 'O' && state[14]=='O') ||
                            (state[4] == 'O' && state[5] =='O' && state[7]=='O')) &&
                            (state[6]=='-')){
                        pot=6;
                    }
                    //Check if 7 is free and potential winning spot for O
                    else if(((state[3] == 'O' && state[11] == 'O' && state[15]=='O') ||
                            (state[4] == 'O' && state[6] =='O' && state[5]=='O')) &&
                            (state[7]=='-')){
                        pot=7;
                    }
                    //Check if 8 is free and potential winning spot for O
                    else if(((state[9] == 'O' && state[10] == 'O' && state[11]=='O') ||
                            (state[0] == 'O' && state[4] =='O' && state[12]=='O')) &&
                            (state[8]=='-')){
                        pot=8;
                    }
                    //Check if 9 is free and potential winning spot for O
                    else if(((state[8] == 'O' && state[10] == 'O' && state[11]=='O') ||
                            (state[1] == 'O' && state[5] =='O' && state[13]=='O')) &&
                            (state[9]=='-')){
                        pot=9;
                    }
                    //Check if 10 is free and potential winning spot for O
                    else if(((state[8] == 'O' && state[9] == 'O' && state[11]=='O') ||
                            (state[2] == 'O' && state[6] =='O' && state[14]=='O')) &&
                            (state[10]=='-')){
                        pot=10;
                    }
                    //Check if 11 is free and potential winning spot for O
                    else if(((state[8] == 'O' && state[9] == 'O' && state[10]=='O') ||
                            (state[2] == 'O' && state[6] =='O' && state[14]=='O')) &&
                            (state[11]=='-')){
                        pot=11;
                    }
                    //Check if 12 is free and potential winning spot for O
                    else if(((state[13] == 'O' && state[14] == 'O' && state[15]=='O') ||
                            (state[0] == 'O' && state[4] =='O' && state[8]=='O') ||
                            (state[9] == 'O' && state[6] =='O' && state[3]=='O')) &&
                            (state[12]=='-')){
                        pot=12;
                    }
                    //Check if 13 is free and potential winning spot for O
                    else if(((state[12] == 'O' && state[14] == 'O' && state[15]=='O') ||
                            (state[1] == 'O' && state[5] =='O' && state[9]=='O')) &&
                            (state[13]=='-')){
                        pot=13;
                    }
                    //Check if 14 is free and potential winning spot for O
                    else if(((state[12] == 'O' && state[13] == 'O' && state[15]=='O') ||
                            (state[2] == 'O' && state[6] =='O' && state[10]=='O')) &&
                            (state[14]=='-')){
                        pot=14;
                    }
                    //Check if 15 is free and potential winning spot for O
                    else if(((state[12] == 'O' && state[13] == 'O' && state[14]=='O') ||
                            (state[3] == 'O' && state[7] =='O' && state[11]=='O') ||
                            (state[10] == 'O' && state[5] =='O' && state[0]=='O')) &&
                            (state[15]=='-')){
                        pot=15;
                    }
                }
        }
        return pot;
}

3 ответа

Все эти повторения, которые у вас есть для проверки на выигрыш, являются плохой практикой кода и могут привести к путанице. Посмотрите эту ветку - она ​​мне очень помогла, когда я создал свой первый алгоритм Tic Tac Toe.

Алгоритм определения игры Tic Tac Toe закончен

Так как состояние # меньше 16, и каждое условие "иначе, если" зафиксировано, вы можете использовать таблицу поиска (просто объедините каждое условие в unsigned short int используя битовую маску, а при необходимости просто возвращайте ее отображенное значение).

const int base = 16;
const int maxn = 16;

int hv[256];
int state[maxn];

void preprocess() 
{
    hv['O'] = 0;
    hv['X'] = 1;
    hv['-'] = 2;
    ...
}

// may instead use std::map<int,int>
int mapt() 
{
    switch(hashkey) {
        case ..: return 0;
        ...
    }
}

int hash(char *st) {
    int ret = 0;
    for (int i = 0; i < maxn; ++i) {
        ret = ret*base + hv[ st[i] ];
    }
    return mapt(ret);
}

int GetPot()
{
    ...
    return hash(state);
}

Это должно быть достаточно быстро, как вам нужно!

Также несколько советов о том, как сделать код более читабельным.

public int canWin3(){
    int pot=-1;

    if(n != 3 && turn !='O') {
        return pot; // or something meaning full
    } elseif (zeroIsFree()) {
        pot = 0;
    } else if (oneIsFree()) {
        pot =1;
    } ...

    return pot;

}

private function zeroIsFree() {
    return ((state[1] == 'O' && state[2] == 'O')  || 
           (state[3] == 'O' && state[6]=='O') || 
           (state[4] == 'O' && state[8]=='O')) &&
           (state[0]=='-'));
}

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

Вы также можете комбинировать приемы из ответа Уайетта Лоури.

Другие вопросы по тегам