Bu kodu dikkatlice çalışın ve bu zorlu sudoku bulmacalarını çözmek için özyinelemeyi kullanmanın akıllı bir yolunu keşfedin.

Sudoku, 1'den 9'a kadar rakamlardan oluşan 9x9'luk bir ızgaradan oluşan popüler bir sayı bulmacasıdır. Bulmaca, doldurmanız gereken sayıların ve bazı boş alanların bir kombinasyonunu içerir.

Boş alanları doldururken her satır, sütun ve 3x3 alt ızgara 1'den 9'a kadar tüm rakamları içermelidir.

Basit bir Python betiği, bir Sudoku bulmacasını sizin için çözmenize yardımcı olabilir. Sudoku tahtasındaki tüm boş alanları analiz edebilir ve her boş alanı doldurmak için olası bir sayı bulabilir.

Sudoku Tahtası Nasıl Oluşturulur ve Görüntülenir

Bir Python betiğinin içinde, çözülmemiş Sudoku bulmacasının değerlerini saklamak için bir dizi listesi kullanmanız gerekecek.

Bu projede kullanılan kod burada mevcuttur. GitHub deposu MIT lisansı altında.

  1. Sudoku.py adlı yeni bir Python betiğinin içinde, 9x9 ızgarasının tüm değerlerini saklayın. Her satır ve sütun, Sudoku bulmacasındaki dokuz sayıyı temsil eder. Çözülmesi gereken boşlukları temsil etmek için 0 ekleyin:
    instagram viewer
    tahta = [
    [5, 3, 0, 0, 7, 0, 0, 0, 0],
    [6, 0, 0, 1, 9, 5, 0, 0, 0],
    [0, 9, 8, 0, 0, 0, 0, 6, 0],
    [8, 0, 0, 0, 6, 0, 0, 0, 3],
    [4, 0, 0, 8, 0, 3, 0, 0, 1],
    [7, 0, 0, 0, 2, 0, 0, 0, 6],
    [0, 6, 0, 0, 0, 0, 2, 8, 0],
    [0, 0, 0, 4, 1, 9, 0, 0, 5],
    [0, 0, 0, 0, 8, 0, 0, 7, 9]
    ]
  2. print_board adlı yeni bir işlevin içinde, for döngüsü kullan kılavuzdaki her satırı işlemek için:
    kesinprint_board(pano):
    için sıra içinde menzil(9):
  3. Her satırı üçe ayırmak için satırın üçe bölünebilir olup olmadığını kontrol edin ve bir satır ekleyin:
    eğer sıra % 3 == 0Ve sıra != 0:
    Yazdır("- - - - - - - - - - - - - - ")
  4. Her satırda, her sütunda döngü yapın. Sütunun üçe bölünebilir olup olmadığını kontrol ederek sütunları da üçe bölebilirsiniz:
    için sütun içinde menzil(9):
    eğer sütun % 3 == 0Ve sütun != 0:
    Yazdır(" | ", bitiş="")
  5. Izgarada saklanan sayı değerini yazdırın. Sütun söz konusu satırın son sütunuysa, aşağıdaki satırın yeni bir satırda görünmesi için bir kesme satırı ekleyin:
    eğer sütun == 8:
    yazdır (tahta[sıra][sütun])
    başka:
    print (str (tahta[satır][sütun]) + " ", bitiş="")
  6. Tahtayı yazdırmak için işlevi çağırın:
    print_board (tahta)
  7. Bir komut satırında, python betiğinizi sakladığınız klasöre gidin, örneğin:
    cd Masaüstü
  8. Sudoku betiğinizi çalıştırmak için python komutunu kullanın. Ekrana yazdırılan bulmacayı görüntüleyin:
    piton sudoku.py

Çözülecek Boş Alanlar Nasıl Belirlenir?

0'lardan oluşan boşlukları bulmak için listeler arasında gezinebilirsiniz. Bunlar, hangi alanların çözülmesi gerektiğini belirler.

  1. find_empty() adlı yeni bir işlevde, panodaki her satır ve sütun arasında geçiş yapın:
    kesinbul_boş(pano):
    için sıra içinde menzil(9):
    için sütun içinde menzil(9):
  2. Geçerli hücrenin değeri 0 ise, boş hücrenin geçerli konumunu döndürür:
    eğer tahta[sıra][sütun] == 0:
    geri dönmek (satır, sütun)
  3. Komut dosyası işlevin sonuna ulaşırsa bu, komut dosyasının 0 değerine sahip herhangi bir hücre bulamadığı anlamına gelir. Bu durumda, hiçbir şey döndürmeyin:
    geri dönmekHiçbiri
  4. Solde() adlı yeni bir işlevde, panodaki ilk boş alanı bulmak için find işlevini kullanın:
    kesinçözmek(pano):
    find = find_empty (pano)
  5. find_empty() işlevi, hücre konumunu veri grubu biçiminde döndürür, örneğin, (0, 2). Bu değerleri ayrı ayrı kaydedin. sıra Ve sütun değişkenler. Aksi takdirde, çözülecek boş alan kalmadığını belirtmek için true değerini döndürün:
    eğerOlumsuz bulmak:
    geri dönmekDoğru
    başka:
    satır, col = bul

Her Satır, Sütun ve 3x3 Izgara İçin Bulmaca Nasıl Çözülür?

Artık çözülecek ilk boş alanı belirleyebildiğinize göre, bu alanı doldurmak ve bulmacayı çözmek için uygun bir sayı bulmaya çalışmanız gerekecek.

özyineleme kullanma, diğer tüm boşluklar için de olası her değer kombinasyonunu denemek için kendi içinde çöz() işlevini çağırın.

  1. çöz() işlevinin içinde, ilk boş alanı bulduktan sonra, 1'den 9'a kadar her sayı arasında döngü yapın. Bu sayılar, çözülmemiş alanı doldurabilecek olası sayıları temsil eder:
    için sayı içinde menzil(1, 10):
  2. Tahtayı, olası sayıyı ve boş hücrenin konumunu yeni bir işleve girin. Bu sayı, o boş alanı çözebilecek geçerli bir sayıysa, yeni işlev true değerini döndürür. Geçerliyse, panodaki hücreye bu numarayı atayın:
    eğer is_valid (tahta, sayı, (satır, sütun)):
    tahta[sıra][sütun] = sayı
  3. Eşleşen parametrelerle is_valid() işlevini oluşturun:
    kesingeçerli değil(tahta, sayı, konum):
  4. Sayıyı o konuma yerleştirmenin Sudoku oyununun herhangi bir kuralını ihlal edip etmediğini kontrol etmek için işlevi kullanın. İlk önce, bu sayının hücrenin satırında veya sütununda zaten var olup olmadığını kontrol edin:
    için sütun içinde menzil(9):
    eğer tahta[konum[0]][col] == sayı Ve konum[1] != sütun:
    geri dönmekYANLIŞ

    için sıra içinde menzil(9):
    eğer pano[sıra][konum[1]] == sayı Ve konum[0] != satır:
    geri dönmekYANLIŞ

  5. Hücrenin ait olduğu 3x3 ızgarayı alın. Bunu, hücrenin konumunu üçe bölerek yapabilirsiniz:
     box_row = konum[0] // 3
    box_col = konum[1] // 3
  6. Bu 3x3 ızgaradaki her satır ve sütun için sayının mevcut olup olmadığını kontrol edin. Varsa, false döndürün:
    için sıra içinde aralık (box_row*3, box_row*3 + 3):
    için sütun içinde aralık (box_col*3, box_col*3 + 3):
    eğer tahta[sıra][sütun] == sayı Ve (satır, sütun) != konum:
    geri dönmekYANLIŞ
  7. Komut dosyası işlevin sonuna ulaşırsa, bu, Sudoku kurallarının hiçbirinin başarısız olduğu anlamına gelir. Doğru döndür:
    geri dönmekDoğru
  8. is_valid() işlevi yalnızca sayı yerleşiminin geçerli olup olmadığını kontrol eder, ancak bu, genel çözüm için doğru yanıt olduğu anlamına gelmez. çöz() işlevi içinde, güncellenmiş tahta ile çöz() işlevini tekrar çağırın. çöz() işlevi, boşlukları doldurmak için artık herhangi bir sayı kullanamayacağı bir duruma gelebilir. Bu durumda, tüm işlev false döndürür, söz konusu hücreyi 0'a sıfırlar ve geri izler. solution() işlevi, yalnızca komut dosyası tüm boşlukları doldurabildiğinde true değerini döndürür:
    için sayı içinde menzil(1, 10):
    eğer is_valid (tahta, sayı, (satır, sütun)):
    tahta[sıra][sütun] = sayı

    eğer çözmek (tahta):
    geri dönmekDoğru

    tahta[sıra][sütun] = 0

    geri dönmekYANLIŞ

  9. Bulmacayı çözmeye başlamak için, çöz() işlevini bildirdikten sonra betiğin altındaki orijinal tahtayla çöz() işlevini çağırın:
    çözmek (tahta)
  10. Nihai sonucu yazdırın:
    Yazdır("Çözüldü:")
    print_board (tahta)
  11. Komut satırında, betiği yeniden çalıştırmak için python komutunu kullanın. Ekrana yazdırılan çözülmüş bulmacayı görüntüleyin:
    piton sudoku.py

Python Kullanarak Oyun Oluşturma

Sudoku, Python kullanarak oluşturabileceğiniz ve çözebileceğiniz birçok oyundan sadece biridir. Python'u kelime karmaşası, metin tabanlı macera oyunu veya renkli oyun gibi çeşitli başka oyunlar oluşturmak için kullanabilirsiniz.