Atölye › Bomberman Tarzı Arena › 8/42. adım
Oyuncu kasalarla çevrili başlasaydı ilk bombasından kaçacak yeri olmazdı. Bu yüzden başlangıç köşelerinin yanındaki kareler hep zemin olacak: oyuncunun köşesi (1. satır, 1. sütun) ve düşmanların üç köşesi.
"Yanında" demek: satır farkı ile sütun farkının toplamı en fazla 1 (köşenin kendisi ve dört komşusu). Bu uzaklığa Manhattan uzaklığı denir: sokakları dik kesişen bir şehirde yürür gibi.
```js
const ENEMY_STARTS = [[ROWS - 2, COLS - 2], [1, COLS - 2], [ROWS - 2, 1]]
const near = (r, c, spots) => spots.some(([sr, sc]) => Math.abs(sr - r) + Math.abs(sc - c) <= 1)
// Walls all round, a pillar on every even row and column, and crates on about half of the rest,
// but never next to where the player and the enemies start.
function makeGrid() {
else if (near(r, c, [[1, 1], ...ENEMY_STARTS]) || Math.random() > 0.55) grid[r].push(' ')
```const ENEMY_STARTS = [[ROWS - 2, COLS - 2], [1, COLS - 2], [ROWS - 2, 1]] → düşmanların üç köşesi, [satır, sütun]
olarak: sağ alt, sağ üst, sol alt (duvarların hemen içi).const near = (r, c, spots) => ... → kısa bir fonksiyon (ok fonksiyonu): (r, c) noktası, listedeki noktalardan
birine yakın mı?spots.some(...) → "noktalardan en az biri için doğru mu?"([sr, sc]) → her nokta iki elemanlı bir dizi; bu yazım onu açıp iki ada koyar.Math.abs(sr - r) + Math.abs(sc - c) <= 1 → satır farkı + sütun farkı en fazla 1. Math.abs eksiyi atar.[[1, 1], ...ENEMY_STARTS] → ... (yayma) ENEMY_STARTS'ın üç elemanını açıp [1, 1]'in yanına koyar: dört
noktalık tek liste.near(...) || Math.random() > 0.55 → köşeye yakınsa her zaman zemin; değilse eskisi gibi rastgele.makeGrid'in bütün kuralını özetliyor.const TOP = ... satırının altına ENEMY_STARTS satırını yaz.let grid satırının altında bir boş satır bırakıp const near = ... satırını yaz.function makeGrid() { satırının üstüne iki yorum satırını yaz.makeGrid içinde Math.random() > 0.55'in önüne near(r, c, [[1, 1], ...ENEMY_STARTS]) || ekle.Beceriler: Diziler ve nesneler, Fonksiyonlar