Atölye › XOX › 31/33. adım
Oyun bitmediyse puanı nasıl bulacağız? Satranç oyuncusu gibi düşünerek: "Buraya oynarsam o şuraya oynar, sonra ben..."
score, sırası gelen oyuncu için her boş kutuyu dener, çıkan tahtayı yine score ile puanlar ve hamleyi geri
alır. İki tarafın da en iyi oynadığını varsayar: O en büyük puanı, X en küçük puanı seçer. Bu yönteme
minimax denir. XOX küçük olduğu için bilgisayar bütün olasılıkları göz açıp kapayıncaya kadar tarar.
```js
if (end === 'draw') return 0
const scores = []
for (let index = 0; index < 9; index++) {
if (cells[index] !== '') continue
cells[index] = turn
scores.push(score(cells, turn === 'O' ? 'X' : 'O'))
cells[index] = ''
}
return turn === 'O' ? Math.max(...scores) : Math.min(...scores)
}
```const scores = [] → her denemenin puanını toplayacağımız boş liste.for (let index = 0; index < 9; index++) → 4. adımdaki döngü: index 0'dan 8'e her kutu.if (cells[index] !== '') continue → continue "bu turu atla, döngünün sıradaki turuna geç". Dolu kutular denenmez.cells[index] = turn → hamleyi dene.scores.push(score(cells, turn === 'O' ? 'X' : 'O')) → çıkan tahtayı sıra öbür oyuncudayken puanla ve listeye
ekle. score kendi içinde yine score'u çağırıyor: kendini çağıran fonksiyona özyinelemeli (recursive) denir.
İç içe Rus bebekleri gibi: her bebeğin içinde biraz daha küçüğü, en sonda açılmayan küçük bir bebek.return). Her çağrıda bir kutu daha
dolduğu için oraya mutlaka varılır.cells[index] = '' → hamleyi geri al. Dene, derinleş, geri al: buna geri izleme (backtracking) denir. Geri
almayı unutursan tahta bozulur.Math.max(...scores) → dizideki en büyük sayı, Math.min en küçüğü. ... (28. adımdaki üç nokta) dizinin
elemanlarını tek tek verir. Sıra O'daysa en büyüğü, X'teyse en küçüğü seç.score içinde if (end === 'draw') return 0 satırının altına yeni satırları yaz.} işareti en altta kalsın.score'u bir sonraki adımda kullanacak); kontroller birkaç saniye sürebilir.Beceriler: Fonksiyonlar, Döngüler
← Biten oyuna puan ver Hiç kaybetmeyen bir bilgisayar →