I'm trying to implement an algorithm called minimax, but I'm having trouble recursively, it goes into a loop which I can not figure out why. The depth of the algorithm should vary according to the moves that are tested, but the depth that occurs is: 5, 4, 3, 2, 1, 0, 0, 0, 0, ... It should return and exit the depth 0, returning to 1, and so on, but persists in 0.
By default the starting depth will always be 5.
The verificar_jogadas_possiveis()
function is used to create a threaded list with all the possible plays of the player passed as a parameter.
Jogadas *minimax(int tabuleiro[TAM][TAM], int depth, int Player, Jogadas* novaJogada){
//Fiz esse trecho apenas para checar se o loop persiste
printf("%d\n", depth);
Sleep(100);
// Copy the board for don't change it
int i, j, copia[TAM][TAM];
for(i=0; i<=9; i++){
for(j=0; j<=9; j++){
copia[i][j] = tabuleiro[i][j];
}
}
copia[novaJogada->lin_dps][novaJogada->col_dps] = copia[novaJogada->lin_atual][novaJogada->col_atual];
copia[novaJogada->lin_atual][novaJogada->col_atual] = 0;
if(depth == 0){
return novaJogada;
}
Lista_ia *Moves = inicializarLista();
verificar_jogadas_possiveis(copia, Moves, Player);
Jogadas *tmp;
// Simulating the current Player 2 (Computer) move
if(Player == 2){
novaJogada->pontuacao = -9999;
for(tmp = Moves->head; tmp != NULL; tmp = tmp->prox){
Jogadas *BestMove = minimax(copia, depth - 1, 1, tmp);
if(BestMove->pontuacao > novaJogada->pontuacao){
novaJogada->pontuacao = BestMove->pontuacao;
}
}
LiberarMemoria(Moves);
return novaJogada;
}
// Simulating the best Player 1 move
else{
novaJogada->pontuacao = 9999;
for(tmp = Moves->head; tmp != NULL; tmp = tmp->prox){
Jogadas *BestMove = minimax(copia, depth - 1, 2, tmp);
if(BestMove->pontuacao < novaJogada->pontuacao){
novaJogada->pontuacao = BestMove->pontuacao;
}
}
LiberarMemoria(Moves);
return novaJogada;
}
}
Does anyone help me figure out the error?