繁体   English   中英

使简单方法更有效

[英]Making a simple method more efficient

我目前正在开发实现minimax的TicTacToe游戏。 在该minimax算法中,我有一个名为canWin的方法,该方法大大减少了为了计算最佳下一步操作而需要采取的所需步骤数(对minimax方法的内部递归调用数)。 只是为了显示canWin对我的程序有多大影响,对于3x3游戏,没有canWin的代码需要大约2000步来计算移动,而对于4x4游戏则需要13810133步。 但是,使用canWin时,3x3只需要600左右,而4x4则只需要9246569。

现在,令人惊讶的问题变成了运行时。 奇怪的是,即使需要更多的步骤来完成计算,在没有添加canWin的情况下,minimax方法实际上运行得更快。 这使我相信canWin方法会严重降低它的速度。 哪种方法超出了它的目的,但鉴于它是一种非常糟糕的编写方法,因此可以理解。 因此,我需要帮助使canWin更加高效。 这个方法很长。 不必要地如此。 它的工作是查看棋盘的当前状态(包含X,O或-的char数组),并检查是否有潜在的获胜机会(例如XX-或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;
}

由于状态#小于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);
}

这应该是您需要的相当快的速度!

您用于检查胜利的所有重复都是不好的代码习惯-并可能导致很多混乱。 看看这个线程-当我创建第一个tic tac toe算法时,它对我有很大帮助。

确定井字游戏的算法

还提供一些有关如何使代码更具可读性的建议。

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函数的实现更具可读性,并且也将使调试更加容易。 当然,可以对整个代码进行更好的改进,但是此建议是基于阅读现有代码并尝试猜测当前技能的基础。

您还可以结合Wyatt Lowery的答案中的技巧。

暂无
暂无

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

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