Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

169
Visualizações
¿Por qué mi algoritmo minimax de tic tac toe no bloquea ciertos movimientos diagonales?

Casi he completado la lógica de mi minimax de tres en raya y funciona bastante bien. Pero sigo encontrando algunos movimientos diagonales en los que la IA aparentemente se equivoca. Por ejemplo, si juegas al cuadrado 3, 6, 5 y 7, ganarás. No bloquea la esquina inferior por alguna razón.

Aquí está la llamada minimax obteniendo recursivamente la mejor puntuación que nuestra computadora puede hacer:

 let compMove; let bestScore = -Infinity; for (let i = 0; i < 9; i++) { if (gameBoard.array[i] == '') { gameBoard.array[i] = 'X'; let score = minimax(gameBoard.array, 0, true); gameBoard.array[i] = ''; if (score > bestScore) { bestScore = score; compMove = i; } } }

Aquí está la función minimax real en sí:

 let scores = { X: 10, O: -10, tie: 0 } const minimax = (board, depth, maximizingPlayer) => { let result = checkWinner(gameBoard.currentPlayer); if (result !== null) { return scores[result]; } if (maximizingPlayer) { let bestScore = -Infinity; for (let i = 0; i < 9; i++) { if (board[i] == '') { board[i] = 'O'; let score = minimax(board, depth + 1, true); board[i] = ''; if (score > bestScore) { bestScore = score; } } } return bestScore; } else { let bestScore = Infinity; for (let i = 0; i < 9; i++) { if (board[i] == '') { board[i] = 'X'; let score = minimax(board, depth + 1, false); board[i] = ''; if (score < bestScore) { bestScore = score; } } } return bestScore; } }

Si algo se le ocurre a alguien, se lo agradecería mucho. ¡Estoy perplejo!

Si desea probar el estado actual del juego, aquí está el codepen:

https://codepen.io/itswakana/pen/gOeMrym?editors=1111

about 4 years ago · Santiago Gelvez
1 Respostas
Responde à pergunta

0

Hay estos problemas:

  • Como la "computadora" juega con "O", el código donde configuraste compMove no debe moverse con "X", sino con "O". Entonces, el primer bloque de código que tienes en tu publicación debería ser:

     let compMove; let bestScore = Infinity; // <-- to minimize (positive) for (let i = 0; i < 9; i++) { if (gameBoard.array[i] == '') { gameBoard.array[i] = 'O'; // <-- not X let score = minimax(gameBoard.array, 0, true); gameBoard.array[i] = ''; if (score < bestScore) { // <-- minimize bestScore = score; compMove = i; } } }
  • checkWinner(gameBoard.currentPlayer) siempre verifica una victoria para el mismo jugador, ya que gameBoard.currentPlayer no se modifica durante la búsqueda minimax. Entonces esto perderá victorias para el oponente. De hecho, dejaría gameBoard.currentPlayer solo y pasaría un argumento que se basa en el argumento maximizingPlayer :

     let result = checkWinner("XO"[+maximizingPlayer]); // dynamically determine player
  • Siempre pasa el valor actual de maximizingPlayer a la llamada recursiva. Cuando es falso, pasa falso, y cuando es verdadero, pasa verdadero. Esto significa que nunca cambia (ver el siguiente punto).

  • Al maximizar el puntaje, su código permite que "O" haga movimientos, pero ese es el jugador que minimiza. Así que eso necesita ser cambiado.

     const minimax = (board, depth, maximizingPlayer) => { let result = checkWinner("XO"[+maximizingPlayer]); // <-- if (result !== null) { return scores[result]; } let bestMove; if (maximizingPlayer) { let bestScore = -Infinity; for (let i = 0; i < 9; i++) { if (board[i] == '') { board[i] = 'X'; // <-- let score = minimax(board, depth + 1, false); // <-- board[i] = ''; if (score > bestScore) { bestMove = i; bestScore = score; } } } return bestScore; } else { let bestScore = Infinity; for (let i = 0; i < 9; i++) { if (board[i] == '') { board[i] = 'O'; // <-- let score = minimax(board, depth + 1, true); // <-- board[i] = ''; if (score < bestScore) { bestMove = i; bestScore = score; } } } return bestScore; } }

Con esos cambios funcionará.

Comentario final: es una pena que en su código tenga al menos tres conceptos que corresponden a la noción de "jugador": maximizingPlayer es un booleano, Player es un objeto con un miembro del team , currentPlayer es una propiedad de carácter y el player el argumento también es el personaje. Esto debería armonizarse. Ciertamente, la propiedad currentPlayer apenas sirve para ningún propósito. Simplemente se establece aquí y allá en una "X" u "O" codificada y luego se pasa inmediatamente como argumento.

about 4 years ago · Santiago Gelvez Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda