Atölye › XOX › 28/33. adım
En önemli kural: şimdi kazanabiliyorsan kazan. Bilgisayar bunu nasıl bilecek? Her boş kutuya O koymayı dener ve "bu çizgiyi tamamlıyor mu?" diye sorar.
Ama denemeyi gerçek tahtada yaparsa tahta bozulur. Bu yüzden tahtanın bir kopyasında dener: fotokopi üzerinde
karalama yapmak gibi. winningLine'ın tahtayı parametre olarak almasının sebebi tam da buydu.
```js
// A free cell that would complete a line for `mark`, if there is one.
const completes = (mark) =>
free.find((index) => {
const copy = [...cells]
copy[index] = mark
return winningLine(copy)
})
const random = free[Math.floor(Math.random() * free.length)]
return completes('O') ?? (cells[4] === '' ? 4 : random)
```const completes = (mark) => ... → bir fonksiyonu bir sabitte saklıyoruz; completes('O') diye çağrılır. Ok
(=>) işaretinden sonra süslü parantez yoksa, sağdaki şeyin sonucu doğrudan geri verilir.free.find((index) => { ... }) → 18. adımdaki find: testi geçen ilk boş kutuyu ver, yoksa undefined.const copy = [...cells] → üç nokta (...) dizinin elemanlarını yeni bir dizinin içine döker: bir kopya.
Kopyayı değiştirmek gerçek tahtayı bozmaz.copy[index] = mark → hamleyi kopyada dene. return winningLine(copy) → çizgi tamamlandı mı?completes('O') ?? (...) → ?? "soldaki yoksa (null ya da undefined ise) sağdakini kullan". Yani: kazanan
kutu varsa o, yoksa eski kural (orta ya da rastgele).|| değil? Çünkü 0 geçerli bir kutu numarası ve || 0'ı "hiçbir şey" sayar. ?? yalnız
null/undefined'ı atlar.computerMove içinde const random = ... satırının üstüne yorum satırını ve completes fonksiyonunu yaz.return satırını return completes('O') ?? (cells[4] === '' ? 4 : random) yap. Parantezlere dikkat.Beceriler: Fonksiyonlar, Diziler ve nesneler
← Birinci kural: ortayı al Üçüncü kural: rakibi engelle →