Atölye › Amiral Battı › 6/35. adım
Her filoda uzunluğu 5, 4, 3, 3 ve 2 olan beş gemi var. Onları denize rastgele dizeceğiz. Klasik küçük bir
algoritma: her gemi için rastgele bir yön ve denize sığan rastgele bir başlangıç seç; önceki bir gemiyle çakışıyorsa
yeniden dene. Dolu kareleri bir taken (alındı) tablosunda işaretleriz.
100 karelik denizde gemiler yalnız 17 kare tuttuğu için boş bir yer birkaç denemede bulunur.
```js
const SHIPS = [5, 4, 3, 3, 2]
// A random fleet: each ship tries random spots until it fits on the sea without overlapping another.
function placeFleet() {
const taken = grid(false)
return SHIPS.map((length) => {
for (;;) {
const down = Math.random() < 0.5
const r = Math.floor(Math.random() * (down ? N - length + 1 : N))
const c = Math.floor(Math.random() * (down ? N : N - length + 1))
const cells = shipCells(r, c, length, down)
if (cells.some(([cr, cc]) => taken[cr][cc])) continue
for (const [cr, cc] of cells) taken[cr][cc] = true
return { cells }
}
})
}
```const SHIPS = [5, 4, 3, 3, 2] → gemi uzunlukları.const taken = grid(false) → hangi karelerin dolu olduğunu tutan tablo; başta hepsi boş.SHIPS.map((length) => { ... }) → her uzunluk için içerideki kodu çalıştırır ve sonuçlardan (gemilerden) liste yapar.for (;;) { ... } → koşulsuz, sonsuz bir döngü; return ile çıkılır.Math.random() < 0.5 → yarı yarıya true: gemi aşağı mı gidecek?Math.floor(Math.random() * (down ? N - length + 1 : N)) → 0'dan başlayan rastgele bir satır. Aşağı giden 5'lik
gemi sığsın diye 10 − 5 + 1 = 6 seçenek (0–5). Sütun için aynısı ters yönde.cells.some(([cr, cc]) => taken[cr][cc]) → karelerden en az biri dolu mu? [cr, cc] gelen iki elemanlı
listeyi açıp adlarını verir: satır ve sütun.continue → doluysa bu denemeyi bırak, baştan dene.for (const [cr, cc] of cells) taken[cr][cc] = true → gemi yerleşti: karelerini dolu işaretle.return { cells } → gemi: kapladığı karelerin listesi.const N = 10 satırının altına SHIPS sabitini yaz.function drawSea( satırının üstüne yorumuyla birlikte placeFleet fonksiyonunu yaz; altında bir boş satır
kalsın.Beceriler: Döngüler, Diziler ve nesneler
← Liste olarak ızgara ve gemi İki filo →