Tic-Tac-Toe MiniMax uygulaması her zaman ilk serbest nokta döndürür

oy
0

Ben en iyi hareket ettiremeyecek js tic-tac-toe her bir dönüşü bulmak için Minimax uygulamaya çalışıyorum.

0,0 ve bu noktada üzerinde 0,1 ve böylece alındığında: Ancak, her zaman ilk serbest nokta döndürür. Bu miniMax işlev her zaman 1 değerini döndürür çıkıyor.

let board = [
    ['', '', ''],
    ['', '', ''],
    ['', '', '']
];

const p1 = 'X';
const p2 = 'O';
const scores = {
    'X': 1,
    'O': -1
}

function bestMove(board, isMaximizing, player, turns) {
    let bestScore = isMaximizing ? -Infinity : Infinity;
    let bestMove;
    let score;

    for (let i = 0; i < 3; i++) {
        for (let j = 0; j < 3; j++) {
            if (board[i][j] == '') {
                board[i][j] = player;
                score = miniMax(board, !isMaximizing, isMaximizing ? p2 : p1, turns + 1);
                board[i][j] = '';
                if (isMaximizing) {
                    if (score > bestScore) {
                        bestScore = score;
                        bestMove = [i, j];
                    }
                }
                else {
                    if (score < bestScore) {
                        bestScore = score;
                        bestMove = [i, j];
                    }
                }

            }
        }
    }
    return bestMove;
}

function miniMax(board, isMaximizing, player, turns) {
    let winner = checkForWinner(board);
    if (winner != null)
        return scores[winner];
    if (turns > 9)
        return 0;

    let bestScore = isMaximizing ? -Infinity : Infinity;
    let score;

    for (let i = 0; i < 3; i++) {
        for (let j = 0; j < 3; j++) {
            if (board[i][j] == '') {
                board[i][j] = player;
                score = miniMax(board, !isMaximizing, isMaximizing ? p2 : p1, turns + 1);
                board[i][j] = '';
                if (isMaximizing)
                    bestScore = Math.max(score, bestScore);
                else
                    bestScore = Math.min(score, bestScore);
            }
        }
    }

    return bestScore;
}

Ben Tic-Tac-Toe için Minimax diğer insanların uygulanması bakarak denedim ama benim başarısız kılan anlayamadık.

Neyi yanlış yaptım?

Oluştur 13/01/2020 saat 22:03
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
1

Ben senin minimaxlar (negamax) kodu ile 2 sorunları bkz:

'1. senin minimaks işlevinde yapmak için en iyi hareket bulma her karenin geçiyor. Ancak sadece en iyi hamle, skor dönüyor. Eğer kazanan bir hamle bulursanız, o zaman bu yazın:

return None, 1

Sonra minimaks özyinelemeli arama yazdığınız:

miniMax(board, !isMaximizing, isMaximizing ? p2 : p1, turns + 1)[1]

Alt dönüş azından yazın:

return bestMove, bestScore

Eğer bestScore karar Nereye ayrıca, bestMove güncellemek için SADECE maksimum / minimum puanı değişiklikleri gerekir. Eğer bestMove işlevinde ne benzer.

'2. senin bestMove işlevinde size TEKRAR tüm kareler geçiyor. Bu tekrar tekrar aynı kare dönmek kılan budur. senin minimaks iyi hamleyi bulacaksınız yana sadece ilk arama yapmak gerekir:

bestMove, bestScore = miniMax(board, !isMaximizing, isMaximizing ? p2 : p1, turns + 1)

Aksi takdirde bu nedenle (bakılmaksızın hamleyi başlangıç) pozisyonu için en iyi hamleyi bulma, birinci kareye gidip komple minimax yapacağız. en iyi hareket daha iyi hamleyi bulmak asla bu yana, ilk olası kareden daha başka bir şey için bestMove güncelleme olmayacaktır.

İngilizce benim ana dil değildir ve sadece Python kodlama alışkınım ben bir anlam yapıyorum Umut :)

Cevap 15/01/2020 saat 08:50
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more