के लिए मेरे मिनीमैक्स एल्गोरिदम के साथ क्या गलत है मैं एक मजेदार सीखने के अनुभव के लिए एक टिक टैक पैर खेल बना रहा हूं। मैं कंप्यूटर के लिए इष्टतम कदम वापस जाने के लिए एक अल्पमहिष्ठ एल्गोरिथ्म का निर्माण किया है, लेकिन किसी भी तरह मैं गलत जा रहा हूँ और इसtictactoe
TIC TAC TOE V1.0
---
---
---
Enter row, column of your move
1,1
---
-X-
---
...
0, 0: -1038
0, 1: -1470
0, 2: -1038
1, 0: -1470
1, 2: -1470
2, 0: -1038
2, 1: -1470
2, 2: -1038
O--
-X-
---
Enter row, column of your move
1,2
O--
-XX
---
...
0, 1: -15
0, 2: -9
1, 0: -10
2, 0: -1
2, 1: -29
2, 2: -41
O--
-XX
O--
Enter row, column of your move
1,0
O--
XXX
O--
WINNER: PLAYER
की तरह अजीब उत्पादन आप देख सकते हैं कि कंप्यूटर को काटने से निचले बाएँ कोने बल्कि चुना है मिल खिलाड़ी। मेरा कोड सभी संभव gamestates के माध्यम से मोड़ के बीच फ्लॉप फ्लिप करने का प्रयास करता है, प्रत्येक जीत या नुकसान के लिए स्कोर को संक्षेप में जोड़ता है, फिर अधिकतम स्कोर के साथ कदम देता है। प्रिंटआउट प्रत्येक मोड़ का स्कोर होने से पहले होता है (आप देख सकते हैं कि यह उच्चतम चुनता है), तो मैं खिलाड़ी को क्यों नहीं हटा रहा हूं? मैं इसे कैसे ठीक करूं? मेरा कोड यहाँ है।
int compMoveScoreRecursive(state_t **board, int dimension, int row, int col, state_t turn) {
board[row][col] = turn;
state_t winner = checkWinner(board, dimension);
if (winner == COMPUTER) {
return 1;
} else if (winner == PLAYER) {
return -1;
} else {
int score = 0;
state_t nextTurn = turn == COMPUTER ? PLAYER : COMPUTER;
for (int i = 0; i < dimension; i++) {
for (int j = 0; j < dimension; j++) {
if (board[i][j] == NIL) {
state_t **boardCopy = copyBoard(board, dimension);
score += compMoveScoreRecursive(boardCopy, dimension, i, j, nextTurn);
destroyBoard(boardCopy, dimension);
}
}
}
return score;
}
}
move_t optimalCompMove(state_t **board, int dimension) {
move_t optMove;
int optScore = INT_MIN;
for (int row = 0; row < dimension; row++) {
for (int col = 0; col < dimension; col++) {
if (board[row][col] == NIL) {
state_t **boardCopy = copyBoard(board, dimension);
int score = compMoveScoreRecursive(boardCopy, dimension, row, col, COMPUTER);
printf("%d, %d: %d\n", row, col, score);
if (score > optScore) {
optMove.row = row;
optMove.col = col;
optScore = score;
}
destroyBoard(boardCopy, dimension);
}
}
}
return optMove;
}
प्रत्येक रिकर्सन के दौरान संभावित बोर्ड प्रिंट करें। परिणाम आपको चौंका सकते हैं। – WhozCraig