Atölye › 15 Bulmacası › 17/27. adım
Bulmaca karışık başlamalı. Akla gelen ilk yol listeyi bir deste kart gibi karıştırmak; ama bu bir tuzak (bir sonraki adımda nedenini göreceğiz).
Güvenli yol: çözülmüş tahtadan başlayıp 200 kez rastgele gerçek bir kaydırma yapmak. Az önce yapılanı hemen geri almamaya dikkat ederiz, yoksa boşluk ileri geri gidip durur. Böyle ulaşılan her tahta, hamleleri tersinden oynayarak mutlaka çözülebilir.
```js
// Mix the tiles by making random slides, so the puzzle can always be solved.
function shuffle(count) {
let gap = tiles.indexOf(0)
let previous = -1
for (let n = 0; n < count; n++) {
const options = neighbors(gap).filter((i) => i !== previous) // do not undo the last slide
const i = options[Math.floor(Math.random() * options.length)]
tiles[gap] = tiles[i]
tiles[i] = 0
previous = gap
gap = i
}
}
tiles = solvedTiles()
shuffle(200)
```let gap = tiles.indexOf(0) → boşluğun yeri. let previous = -1 → boşluğun bir önceki yeri; başta hiçbir kareye
denk gelmeyen bir sayı ("önceki yok").for (let n = 0; n < count; n++) { ... } → bir döngü: n 0'dan başlar, count'tan küçük olduğu sürece tekrarlar,
her turda n++ ile 1 artar. shuffle(200) → 200 tur.neighbors(gap).filter((i) => i !== previous) → boşluğun komşularından, boşluğun az önce geldiği kare hariç
olanları tutar (filter süzer, !== "eşit değil").Math.random() → 0 ile 1 arasında rastgele bir sayı. * options.length ile çarpıp Math.floor ile aşağı yuvarlayınca
0 ile son sıra arasında rastgele bir sıra çıkar; options[...] o seçeneği verir.tiles[gap] = tiles[i], tiles[i] = 0 → seçilen taş boşluğa kayar (move gibi).previous = gap, gap = i → boşluk artık taşın eski yerinde; nereden geldiğini hatırlarız.reset içinde shuffle(200) → sıraya dizdikten hemen sonra karıştır.function reset() { satırının üstüne yorum satırını ve shuffle fonksiyonunu yaz; arada bir boş satır kalsın.reset içinde tiles = solvedTiles() satırının altına shuffle(200) yaz.Beceriler: Döngüler, Diziler ve nesneler
← Hamleleri say Hangi tahtalar çözülür? →