これが機能しない理由を理解するのを手伝ってください。コードにバグがあるのか、アルゴリズムに根本的な論理的な欠陥があるのか どうかはわかりません。
私のアルゴリズムは minimax に基づいていますが、より単純な手法のためにヒューリスティック評価関数を使用しませんでした。単純な 3x3 tic tac toe は単純であるため、考えられる手ごとに考えられるすべてのゲーム結果を計算し、「スコア」が最も高いものを選択したいと思います。有効な動きの「トップ レベル」のベクトルと、対応する「スコア」の一致するサイズのベクトルを作成します。つまり、その動きに続くすべての可能な結果について、勝ちの場合は ++、損失の場合は -- です。
しかし、移動スコアのベクトルが奇妙な非対称値を取得しています。コードが機能したとしても、論理的には、最大の勝利と最小の損失につながるように計算された動きが、フォークなどの単純な戦術に盲目になる可能性はありますか? 私の本能はイエスと言っていますが、詳細な計算はしていません。
char board [9] = { '.','.','.','.','.','.','.','.','.' };
int com_turn(int turn)
{
char player=COM; // keeps track of current player
cout<<"Computer turn. \n";
vector<int> moves = get_valid_moves(board); // top level move list
vector<int> m_scores (moves.size(), 0); // top level move scores
for (int m=0; m < moves.size(); m++) // eval each top level move
{
board[moves[m]] = player; // do move
evaluate(board, turn, &m_scores[m], player);
cout<< m_scores[m] <<' '; // for debugging
board[moves[m]]='.'; // undo move
}
int bestmove;
for (int i=0; i < moves.size(); i++) // find best score
{
bestmove = max(bestmove, m_scores[i]);
}
for (int i=0; i < moves.size(); i++) // match to best move
{
if (bestmove == m_scores[i])
{
bestmove = moves[i];
break;
}
}
board[bestmove]=COM; // finally make com move
print_board();
}
vector<int> get_valid_moves(char *board)
{
vector<int> vmoves;
for (int i=0; i < 9; i++)
{
if (board[i]=='.') vmoves.push_back(i);
}
return vmoves;
}
void evaluate(char *board, int turn, int *mscore, char player)
{
if (check_win(board))
{
(player==HUMAN)? *mscore -= 1: *mscore += 1;
return;
}
if (turn > 9) return;
vector<int> child_moves = get_valid_moves(board);
if (child_moves.size() < 1) return;
(player==COM)? player=HUMAN: player=COM; // switch player
for (int m=0; m < child_moves.size(); m++)
{
board[child_moves[m]] = player; // do move
evaluate(board, ++turn, mscore, player);
board[child_moves[m]]='.'; // undo move
}
}