Atölye › Satranç › 42/48. adım
İyi bir hamle bulmak için bilgisayar ileriyi düşünecek: her hamleyi dener, her birine rakibin verebileceği her cevabı dener, onlara kendi cevaplarını dener... Ve iki tarafın da en iyisini oynadığını varsayar.
Bunun güzel bir kısayolu var: negamax. Puanı her zaman sırası gelen taraf açısından söyleriz. Benim için iyi olan rakip için kötüdür; yani bir hamlemin değeri = eksi (o hamleden sonra rakibin alabileceği en iyi puan).
Fonksiyon bunu hesaplamak için kendini çağırır, her seferinde bir hamle daha az derinlikle. Buna özyineleme
(recursion) denir. depth 0 olunca durur ve pozisyonu evaluate ile puanlar.
```js
// Negamax: the best score the side to move can force, looking `depth` moves ahead.
function search(depth) {
const moves = legalMoves()
if (moves.length === 0) return inCheck(turn) ? -100000 - depth : 0
if (depth === 0) return evaluate() * (turn === 'w' ? 1 : -1)
let best = -Infinity
for (const m of moves) {
const undo = makeMove(m)
const score = -search(depth - 1)
undoMove(undo)
if (score > best) best = score
}
return best
}
```const moves = legalMoves() → sırası gelenin yasal hamleleri.-100000), pat ise 0. - depth daha erken matı
daha değerli yapar: kalan derinlik büyükse mat daha yakındır.if (depth === 0) → daha ileri bakmayacağız: pozisyonu puanla. evaluate beyaz açısından; sıra siyahtaysa -1
ile çarpıp sırası gelenin açısına çeviririz.let best = -Infinity → -Infinity (eksi sonsuz) her sayıdan küçüktür; ilk puan onu mutlaka geçer.search(depth - 1) rakibin o pozisyondaki en iyi puanı (onun
açısından). Başındaki - onu bizim açımıza çevirir.undoMove(undo) → tahtayı geri al; sonraki hamleyi aynı pozisyondan dene.return best → bulunan en iyi puan.const same = ... satırının üstüne (yani evaluate'in altına) yorumu ve search fonksiyonunu yaz; altında
bir boş satır kalsın.search'ü deneyecek.Beceriler: Fonksiyonlar
← Pozisyona bir puan En iyi hamleyi seç →