电脑总是在第一个空的地方播放,我不知道为什么。当我在第1个位置玩时,电脑在第2个位置玩,以此类推。如果minimax函数总是返回1,不会改变任何事情。发生了什么事?
注意:我的黑板是1比9。如果电脑赢了,check_win给我10,如果人类赢了,10,如果平局,0,如果比赛没有结束;false";。
#!/bin/bash
best_move(){
local best_score=-1000
for (( i=1; i<=${#board[@]}; i++ ))
do
if [[ ${board[$i]} =~ $re_isnumber ]]; then
board[$i]=$computer
local score=$(minimax 0 "false")
if [ $score -gt $best_score ]; then
best_score=$score
local move=$i
fi
board[$i]=$i
fi
done
board[$move]=$computer
current_player=$human
}
minimax(){
result=$(check_winner)
if [[ $result == 10 ]]; then
echo result
return
fi
if [[ $result == -10 ]]; then
echo $result
return
fi
if [[ $result == 0 ]]; then
echo $result
return
fi
if [[ $3 == "true" ]]; then
maximize
else
minimize
fi
}
maximize(){
local best_score=-800
for (( i=0; i<${#board[@]}; i++ ))
do
if [[ ${board[$i]} =~ $re_isnumber ]]; then
board[$i]=$computer
local score=$( minimax $(($2+1)) "false" )
if [ $score -gt $best_score ]; then
best_score=$score
fi
board[$i]=$i
fi
done
echo $best_score
}
minimize(){
local best_score=800
for (( i=0; i<${#board[@]}; i++ ))
do
if [[ ${board[$i]} =~ $re_isnumber ]]; then
board[$i]=$human
local score=$(minimax $(($2+1)) "true")
if [ $score -lt $best_score ]; then
best_score=$score
fi
board[$i]=$i
fi
done
echo $best_score
}
如果您的程序返回第一个位置,那是因为它找不到比这更好的移动。我不会为您调试整个程序,但它这样做的最常见原因是因为您发回了错误的评估分数。我不熟悉你的语言,但如果你从check_winner中得到某个结果,你似乎总是发回10/-10的分数。发回的分数需要取决于轮到谁。例如,如果"O"获胜,则需要发回10分的获胜分数,如果是"O"回合,则需要传回10分。如果"O"获胜,并且轮到"X",你需要发回-10的比分。