[英]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.