使一个简单的方法更有效

时间:2015-08-14 01:13:01

标签: java algorithm performance tic-tac-toe minimax

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

令人惊讶的问题现在变成了运行时间。奇怪的是,minimax方法实际上运行得更快,没有添加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 个答案:

答案 0 :(得分:0)

由于州#小于16,而且每个&#34;否则如果&#34;条件是固定的,您可以使用查找表(只需使用位掩码将每个条件组合到<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css" rel="stylesheet"/> <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" /> <div class="container-fluid"> <nav class="navbar navbar-fixed-top navbar-default"> <div class="navbar-header"> <button data-toggle="collapse-side" data-target=".side-collapse" type="button" class="navbar-toggle"><span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="#">Brand</a> </div> <div class="navbar-default side-collapse in"> <nav role="navigation" class="navbar-collapse"> <ul class="nav navbar-nav"> <li class="active"><a href="#">Link <span class="sr-only">(current)</span></a> </li> <li><a href="#">Link</a> </li> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <i class="fa fa-chevron-down"></i></a> <ul class="dropdown-menu"> <li><a href="#">Link</a> </li> <li><a href="#">Link</a> </li> <li><a href="#">Link</a> </li> <li role="separator" class="divider"></li> <li><a href="#">Link</a> </li> <li role="separator" class="divider"></li> <li><a href="#">Link</a> </li> </ul> </li> </ul> <form class="navbar-form navbar-left" role="search"> <div class="form-group"> <input type="text" class="form-control" placeholder="Search" /> </div> <button type="submit" class="btn btn-default">Submit</button> </form> <ul class="nav navbar-nav navbar-right"> <li><a href="#">Link</a> </li> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <i class="fa fa-chevron-down"></i></a> <ul class="dropdown-menu"> <li><a href="#">Link</a> </li> <li><a href="#">Link</a> </li> <li><a href="#">Link</a> </li> <li role="separator" class="divider"></li> <li><a href="#">Link</a> </li> <li role="separator" class="divider"></li> <li><a href="#">Link</a> </li> </ul> </li> </ul> </nav> </div> </nav> <div class="side-collapse-container"> <div class="alert alert-info alert-dismissible" role="alert"> <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span> </button> <strong>Warning!</strong> This is an Off-Canvas Mobile Menu</div> </div> </div>,并在需要时返回其映射值)。

unsigned short int

这应该非常快,因为你需要!

答案 1 :(得分:0)

你在那里重复检查获胜的重复是错误的代码练习 - 并且可能导致很多混乱。看看这个帖子 - 当我创建我的第一个tic tac toe算法时,它对我帮助很大。

Algorithm for Determining Tic Tac Toe Game Over

答案 2 :(得分:0)

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

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的答案中的技巧。