Atölye › Sudoku › 21/28. adım

Bulmaca icat et

Ne yapıyoruz

Ş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 }
}
```

Ne işe yarıyor

Sıra sende

  1. const TOP = 56 satırının altına HOLES satırını yaz.
  2. shuffle fonksiyonunun altına copy satırını, yorumu ve makePuzzle fonksiyonunu yaz.
  3. Çalıştır. (Oyuna bağlamak sonraki adımda.)

Beceriler: Fonksiyonlar, Döngüler

Tüm adımlar

  1. Dokuza dokuz
  2. Çizgiler ve kutular
  3. Metinden bir bulmaca
  4. Bulmacanın kendi rakamları
  5. Çizmeye devam
  6. Seçili hücre
  7. Satırı, sütunu ve kutuyu aydınlat
  8. Her yerde aynı rakam
  9. Tıklayarak seç
  10. Oklarla gez
  11. Rakam yaz
  12. Tek döngüde üç kural
  13. Hataları göster
  14. Çözüldü!
  15. Saat
  16. Çözüldü mesajı
  17. Yeniden oyna
  18. En kolay hücre
  19. Çözücü
  20. Rastgele sıra
  21. Bulmaca icat et
  22. Her oyunda yeni bulmaca
  23. İpuçları
  24. En iyi süre
  25. Yeni bulmaca için N
  26. Rakam tuş takımı
  27. Tuş takımına dokun
  28. Kendin yap: geri al