Atölye › Sudoku › 21/28. adım
Şimdi bilgisayar bulmaca icat ediyor: önce rastgele dolu bir ızgara yap, sonra hücreleri rastgele sırayla boşalt. Her boşaltmadan sonra çözücüyle kontrol et: bulmacanın hâlâ tam bir çözümü var mı? İki çözümü olan sudoku adil değildir (oyuncu hangisinin istendiğini bilemez); o zaman rakamı geri koy. 50 hücre boşalınca dur.
```js
const HOLES = 50 // how many cells are emptied
const copy = (board) => board.map((row) => row.slice())
// A random full grid, then empty cells one by one, keeping only removals that leave exactly one solution.
function makePuzzle() {
const full = Array.from({ length: 9 }, () => Array(9).fill(0))
countSolutions(full, 1, true)
const puzzle = copy(full)
let removed = 0
for (const cell of shuffle([...Array(81).keys()])) {
if (removed === HOLES) break
const r = Math.floor(cell / 9)
const c = cell % 9
const digit = puzzle[r][c]
puzzle[r][c] = 0
if (countSolutions(copy(puzzle), 2) === 1) removed++
else puzzle[r][c] = digit // two solutions: put it back
}
return { puzzle, full }
}
```copy(board) → aynı rakamlarla yeni bir ızgara. Çözücü tahtayı değiştirdiği için ona hep kopya veriyoruz.countSolutions(full, 1, true) → boş tahtayı rastgele sırayla çöz: full artık dolu, rastgele bir ızgara.[...Array(81).keys()] → 0'dan 80'e sayıların listesi, her hücre için bir numara. shuffle ile rastgele sıra.Math.floor(cell / 9) satır, cell % 9 sütun.if (countSolutions(copy(puzzle), 2) === 1) removed++ → 2'ye kadar saymak yeter: 1 ise tek çözüm, boşaltma kalır.else puzzle[r][c] = digit → iki çözüm çıktı: rakamı geri koy.return { puzzle, full } → bulmaca ve çözümü birlikte.const TOP = 56 satırının altına HOLES satırını yaz.shuffle fonksiyonunun altına copy satırını, yorumu ve makePuzzle fonksiyonunu yaz.Beceriler: Fonksiyonlar, Döngüler
← Rastgele sıra Her oyunda yeni bulmaca →