Atölye › Sokoban › 16/29. adım
Oyunun bütün kuralı tek cümle: bir kutuyu itebilirsin, ama yalnızca bir tane ve asla duvara doğru değil. Gideceğin karede kutu varsa, aynı yönde bir kare daha ötesine bakarsın:
@ $ . → . @ $ kutunun arkası boş: kutu ilerler, sen de
@ $ # → olmaz kutunun arkasında duvar var
@ $ $ → olmaz arkasında başka kutu var: iki kutu itilemez
Ve kutuyu asla çekemezsin. Sokoban'ı bulmaca yapan bu: bir kutuyu köşeye itersen orada kalır.
```js
const box = boxAt(x, y)
if (box) {
const bx = x + dx
const by = y + dy
if (walls.has(key(bx, by)) || boxAt(bx, by)) return // a box cannot push into a wall or another box
box.x = bx
box.y = by
}
```const box = boxAt(x, y) → gidilecek karedeki kutu (yoksa undefined).if (box) { ... } → sadece kutu varsa içeri girer.const bx = x + dx, const by = y + dy → kutunun gideceği kare: oyuncunun gideceği karenin bir ötesi.walls.has(key(bx, by)) || boxAt(bx, by) → orada duvar veya başka kutu var mı? Varsa return: kutu da oyuncu
da yerinde kalır.box.x = bx, box.y = by → kutuyu ilerlet. box listedeki kutunun kendisi olduğu için boxes de değişir.if bloğundan sonra player = { x, y } çalışır: ya kutu yoktu, ya da kutu az önce yol açtı.move içindeki if (boxAt(x, y)) return // pushing comes in the next step satırını sil, yerine itme bloğunu yaz
(player = { x, y } satırının üstüne). Uzun if (walls.has(... satırını sonundaki yorumla birlikte yaz. Çalıştır,
oyuna tıkla ve sağ oka bas: kutu hedefe gitmeli.
Beceriler: Oyun durumları, Çarpışma tespiti
← Kutular yolu kapatır Hedefteki kutu yeşile döner →