简体   繁体   English

使简单方法更有效

[英]Making a simple method more efficient

I'm currently developing a TicTacToe game which implements minimax. 我目前正在开发实现minimax的TicTacToe游戏。 Within that minimax algorithm I have a method called canWin which greatly reduces the number of required steps(number of internal recursive calls to the minimax method) needed to be taken in order to calculate the best next move. 在该minimax算法中,我有一个名为canWin的方法,该方法大大减少了为了计算最佳下一步操作而需要采取的所需步骤数(对minimax方法的内部递归调用数)。 Just to show how greatly canWin affects my program, the code without canWin for a 3x3 game requires about 2000 steps to calculate the move and for a 4x4 game 13810133 steps. 只是为了显示canWin对我的程序有多大影响,对于3x3游戏,没有canWin的代码需要大约2000步来计算移动,而对于4x4游戏则需要13810133步。 With canWin however it needs only about 600 for 3x3 and 9246569 for 4x4. 但是,使用canWin时,3x3只需要600左右,而4x4则只需要9246569。

The surprising problem now becomes run time. 现在,令人惊讶的问题变成了运行时。 The weird thing is that the minimax method actually runs faster WITHOUT the addition of canWin even though it requires a lot more steps to finish calculating. 奇怪的是,即使需要更多的步骤来完成计算,在没有添加canWin的情况下,minimax方法实际上运行得更快。 Which leads me to believe that the canWin method slows it down hard. 这使我相信canWin方法会严重降低它的速度。 Which kinda beats it's purpose but is understandable given that it's a very badly written method. 哪种方法超出了它的目的,但鉴于它是一种非常糟糕的编写方法,因此可以理解。 So I need help making canWin more efficient. 因此,我需要帮助使canWin更加高效。 This method is very long. 这个方法很长。 Unnecessarily so. 不必要地如此。 It's job is to look through the current state of the board(which is a char array containing X, O or - )and check if a potential win is available(for example XX -, or O - O). 它的工作是查看棋盘的当前状态(包含X,O或-的char数组),并检查是否有潜在的获胜机会(例如XX-或O-O)。 First it checks the size of the board, then it checks whose turn it is. 首先,它检查棋盘的大小,然后检查棋盘的位置。 Whoever has the turn checks if there is a chance for him to win. 轮到谁的人都会检查他是否有获胜的机会。 If there is a chance he takes it by filling the required slot. 如果有机会,他可以通过填补所需的位置来解决。 Otherwise he checks if his opponent has a chance to win. 否则,他会检查对手是否有获胜的机会。 If his opponent has a chance to win he blocks it by filling the required slot. 如果对手有机会获胜,他可以通过填补所需的位置来阻止对手。 The method returns the slot(number of the slot) needed to be filled in order to make a potential win or block a potential loss. 该方法返回需要填充的插槽(插槽号),以赢得或阻止潜在的损失。

Here it is, I know it's terrible but help me out here: 在这里,我知道这很糟糕,但是请在这里帮助我:

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;
}

Since state # is less than 16, and each "else if" condition is fixed, you could use a lookup table (just combine each condition to an unsigned short int using bitmask, and when needed just return its mapped value). 由于状态#小于16,并且每个“ else if”条件都是固定的,因此可以使用查找表(只需使用位掩码将每个条件组合为一个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);
}

This should be quite fast as you need! 这应该是您需要的相当快的速度!

All that repetition you have there for checking for wins is bad code practice- and can lead to a lot of confusion. 您用于检查胜利的所有重复都是不好的代码习惯-并可能导致很多混乱。 Check out this thread- it helped me a lot when I created my first tic tac toe algorithm. 看看这个线程-当我创建第一个tic tac toe算法时,它对我有很大帮助。

Algorithm for Determining Tic Tac Toe Game Over 确定井字游戏的算法

Also some suggestions on how you could make your code more readable. 还提供一些有关如何使代码更具可读性的建议。

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]=='-'));
}

That will make the implementation of canWin3 function more readable and will make it easier to debug too. 这将使canWin3函数的实现更具可读性,并且也将使调试更加容易。 Of course the whole code could be improved better but this suggestion is based upon reading your existing code and trying to guess your current level of skill. 当然,可以对整个代码进行更好的改进,但是此建议是基于阅读现有代码并尝试猜测当前技能的基础。

You can also combine techniques from Wyatt Lowery's answer. 您还可以结合Wyatt Lowery的答案中的技巧。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM