Игра "Крестики-Нолики" алгоритм минимакс
Пробую разобраться с алгоритмом "минимакс", но что-то получается со скрипом. Не могу понять почему не работает код адекватно, очень часто дает выиграть сопернику, танцы с бубном не помогают.
Первым ходит всегда игрок и ставит "Х", далее устройство("О") пробует выиграть или сделать ничью
var bestMove = 0
var bestScore = 0
var score = 0
var AIbtns = Array(9,{""})
fun click_O_minimax(){
// делаю копию игрового поля и сохраняю в архив
val btns = arrayOf(btn0, btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8)
for (a in 0..8){
if(btns[a].text == "X"){AIbtns[a] = "X" }
if(btns[a].text == "O"){AIbtns[a] = "O" }
if(btns[a].text == "") {AIbtns[a] = "" }
}
bestScore = -1000
for (a in 0..8){
score = 0
if(AIbtns[a] == "") {AIbtns[a] = "O"
minimax(false)
AIbtns[a] = ""
if (score > bestScore){
bestScore = score
bestMove = a
}
}
}
btns[bestMove].text = "O"
click++
// проверяю состояние игрового поля и передаю ход игроку
checkWinner()
}
fun minimax( isMaximizing: Boolean){
// проверяю копию игрового поля
var winner = ""
if (AIbtns[0] == "X" && AIbtns[1] == "X" && AIbtns[2] == "X") { winner = "X win" }
if (AIbtns[3] == "X" && AIbtns[4] == "X" && AIbtns[5] == "X") { winner = "X win" }
if (AIbtns[1] == "X" && AIbtns[4] == "X" && AIbtns[7] == "X") { winner = "X win" }
if (AIbtns[6] == "X" && AIbtns[7] == "X" && AIbtns[8] == "X") { winner = "X win" }
if (AIbtns[0] == "X" && AIbtns[3] == "X" && AIbtns[6] == "X") { winner = "X win" }
if (AIbtns[2] == "X" && AIbtns[5] == "X" && AIbtns[8] == "X") { winner = "X win" }
if (AIbtns[0] == "X" && AIbtns[4] == "X" && AIbtns[8] == "X") { winner = "X win" }
if (AIbtns[2] == "X" && AIbtns[4] == "X" && AIbtns[6] == "X") { winner = "X win" }
if (AIbtns[0] == "O" && AIbtns[1] == "O" && AIbtns[2] == "O") { winner = "O win" }
if (AIbtns[3] == "O" && AIbtns[4] == "O" && AIbtns[5] == "O") { winner = "O win" }
if (AIbtns[1] == "O" && AIbtns[4] == "O" && AIbtns[7] == "O") { winner = "O win" }
if (AIbtns[6] == "O" && AIbtns[7] == "O" && AIbtns[8] == "O") { winner = "O win" }
if (AIbtns[0] == "O" && AIbtns[3] == "O" && AIbtns[6] == "O") { winner = "O win" }
if (AIbtns[2] == "O" && AIbtns[5] == "O" && AIbtns[8] == "O") { winner = "O win" }
if (AIbtns[0] == "O" && AIbtns[4] == "O" && AIbtns[8] == "O") { winner = "O win" }
if (AIbtns[2] == "O" && AIbtns[4] == "O" && AIbtns[6] == "O") { winner = "O win" }
if(winner == "X win") {score = -1; return}
if(winner == "O win") {score = 1; return }
var checkTIE = 0
for (a in 0..8){if(AIbtns[a] != ""){checkTIE++} }
if(winner == "" && checkTIE == 9) {score = 0; return }else{score = 0}
// если никто не выиграл продолжаем
if (isMaximizing){
val maxScore = -1000
for (a in 0..8){
if(AIbtns[a] == "") {AIbtns[a] = "O"
minimax(false)
AIbtns[a] = ""
}
}
score = maxOf(score,maxScore)
return
}
if (!isMaximizing){
val minScore = 1000
for (a in 0..8){
if(AIbtns[a] == "") {AIbtns[a] = "X"
minimax(true)
AIbtns[a] = ""
}
}
score = minOf(score,minScore)
return
}