Atölye › Amiral Battı › 24/35. adım
Bilgisayarı akıllı yapmanın yolu: yüzen gemilerinin senin denizinde durabileceği her yolu hayal etmek. Bir gemi bir karatavuk... değil, bir ıskaya denk geliyorsa o yol imkânsızdır, atlanır. Kalan her yol, üstünden geçtiği karelere 1 puan ekler. Sonunda her karenin bir puanı olur: buna ısı haritası denir. En sıcak kare, bir gemi olma ihtimali en yüksek karedir.
Bu adımda yalnız haritayı hesaplayan fonksiyonu yazıyoruz; kullanması sonraki adımda.
```js
// How many ways could the ships still afloat lie on the sea, given what the computer knows?
function heatMap() {
const heat = grid(0)
const afloat = myFleet.filter((s) => !sunk(s)).map((s) => s.cells.length)
for (const length of afloat) {
for (let r = 0; r < N; r++) {
for (let c = 0; c < N; c++) {
for (const down of [false, true]) {
const cells = shipCells(r, c, length, down)
if (cells.some(([cr, cc]) => cr >= N || cc >= N)) continue
if (cells.some(([cr, cc]) => theirShots[cr][cc] === 'miss')) continue
for (const [cr, cc] of cells) heat[cr][cc] += 1
}
}
}
}
for (let r = 0; r < N; r++) for (let c = 0; c < N; c++) if (theirShots[r][c]) heat[r][c] = 0
return heat
}
```grid(0) → her karesi 0 olan bir ızgara: puan tablosu.afloat → henüz batmamış gemilerinin uzunlukları: filter batmayanları seçer, map her gemiyi uzunluğuna
çevirir.down yanlışsa yatay,
doğruysa dikey). Hepsi birlikte her olası yerleşim.shipCells(r, c, length, down) → o yerleşimin kareleri (yerleşimde zaten kullandığımız fonksiyon).cr >= N || cc >= N → denizden taşıyorsa continue: bu yerleşimi atla, sıradakine geç.theirShots[cr][cc] === 'miss' → bir ıskaya denk geliyorsa orada gemi olamaz: atla.heat[cr][cc] += 1 → kalan her yerleşim kendi karelerine 1 puan ekler.playerShoots fonksiyonunun altına (yani computerShoots'un üstüne) bir boş satır bırakıp yorumu ve heatMap fonksiyonunu yaz. Çalıştır.
Beceriler: Döngüler, Diziler ve nesneler
← Kaybetmek de var En sıcak kareye ateş →