Pažljivo proučite ovaj kod i otkrijte pametan način korištenja rekurzije za rješavanje tih lukavih sudoku zagonetki.

Sudoku je popularna slagalica brojeva koja se sastoji od mreže 9x9 sa znamenkama od 1 do 9. Slagalica uključuje kombinaciju brojeva i nekoliko praznih mjesta koja trebate popuniti.

Prilikom popunjavanja praznih mjesta, svaki redak, stupac i podmreža 3x3 trebaju sadržavati sve znamenke od 1 do 9.

Jednostavna Python skripta može vam pomoći u rješavanju Sudoku zagonetke. Može analizirati sva prazna mjesta na Sudoku ploči i pronaći mogući broj za popunjavanje svakog praznog mjesta.

Kako izraditi i prikazati Sudoku ploču

Unutar Python skripte morat ćete upotrijebiti popis nizova za pohranjivanje vrijednosti neriješene Sudoku zagonetke.

Kod korišten u ovom projektu dostupan je u ovom GitHub repo pod licencom MIT-a.

  1. Unutar nove Python skripte pod nazivom sudoku.py, pohranite sve vrijednosti za mrežu 9x9. Svaki redak i stupac predstavljaju devet brojeva duž Sudoku slagalice. Dodajte 0 za predstavljanje prostora koje treba riješiti:
    instagram viewer
    ploča = [
    [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. Unutar nove funkcije pod nazivom print_board, koristite for petlju za obradu svakog reda u mreži:
    deftiskana_ploča(odbor):
    za red u raspon (9):
  3. Da biste svaki red podijelili na trećine, provjerite je li red djeljiv s tri i dodajte redak:
    ako red % 3 == 0i red != 0:
    ispis("- - - - - - - - - - - - - - ")
  4. Unutar svakog retka, prođite kroz svaki stupac. Također možete podijeliti stupce na trećine tako da provjerite je li stupac djeljiv s tri:
    za kol u raspon (9):
    ako stupac % 3 == 0i stupac != 0:
    ispis(" | ", kraj="")
  5. Ispišite vrijednost broja pohranjenu u mreži. Ako je stupac posljednji stupac za taj određeni redak, dodajte prijelomni redak tako da se sljedeći redak pojavi u novom retku:
    ako stupac == 8:
    ispis (ploča[red][kol])
    drugo:
    ispis (str (ploča[red][kol]) + " ", kraj="")
  6. Pozovite funkciju za ispis ploče:
    print_board (ploča)
  7. U naredbenom retku idite do mape u koju ste pohranili svoju python skriptu, na primjer:
    cd radna površina
  8. Upotrijebite naredbu python za pokretanje Sudoku skripte. Pogledaj zagonetku ispisanu na ekranu:
    python sudoku.py

Kako identificirati prazna mjesta za rješavanje

Možete proći kroz popise kako biste pronašli razmake koji se sastoje od nula. Oni određuju koje prostore je potrebno riješiti.

  1. U novoj funkciji koja se zove find_empty(), prođite kroz svaki redak i stupac na ploči:
    defpronaći_prazno(odbor):
    za red u raspon (9):
    za kol u raspon (9):
  2. Ako je vrijednost trenutne ćelije 0, vrati trenutni položaj prazne ćelije:
    ako ploča[red][kol] == 0:
    povratak (redak, stupac)
  3. Ako skripta dođe do kraja funkcije, to znači da skripta nije mogla pronaći nijednu ćeliju s vrijednošću 0. U ovom slučaju ne vraćajte ništa:
    povratakNijedan
  4. U novoj funkciji koja se zove solve(), upotrijebite funkciju find za pronalaženje prvog praznog mjesta na ploči:
    defriješiti(odbor):
    pronaći = find_empty (ploča)
  5. Funkcija find_empty() vraća položaj ćelije u formatu torke, na primjer (0, 2). Spremite ove vrijednosti odvojeno u red i kol varijable. U suprotnom vratite true da označite da nema praznih mjesta za rješavanje:
    akone pronaći:
    povratakPravi
    drugo:
    redak, stupac = pronađi

Kako riješiti zagonetku za svaki redak, stupac i mrežu 3x3

Sada kada možete identificirati prvi prazan prostor za rješavanje, morat ćete pokušati pronaći odgovarajući broj da ispunite taj prostor i riješite zagonetku.

Korištenje rekurzije, pozovite funkciju solve() unutar sebe kako biste isprobali sve moguće kombinacije vrijednosti i za sve ostale prostore.

  1. Unutar funkcije solve(), nakon pronalaska prvog praznog mjesta, prođite kroz svaki broj od 1 do 9. Ovi brojevi predstavljaju moguće brojeve koji bi mogli ispuniti neriješeni prostor:
    za br u raspon (1, 10):
  2. Unesite ploču, mogući broj i položaj prazne ćelije u novu funkciju. Nova funkcija vratit će true ako je taj broj važeći broj koji može riješiti taj prazan prostor. Ako je valjan, dodijelite taj broj ćeliji na ploči:
    ako is_valja (ploča, broj, (red, stupac)):
    ploča[red][kol] = br
  3. Stvorite funkciju is_valid() s odgovarajućim parametrima:
    defje_važeći(ploča, broj, pos):
  4. Pomoću ove funkcije provjerite krši li postavljanje broja na tu poziciju neka pravila Sudoku igre. Prvo provjerite postoji li taj broj već u retku ili stupcu ćelije:
    za kol u raspon (9):
    ako ploča[pos[0]][col] == br i pos [1] != stupac:
    povrataklažno

    za red u raspon (9):
    ako ploča[red][poz[1]] == br i pos [0] != red:
    povrataklažno

  5. Nabavite mrežu 3x3 kojoj ćelija pripada. To možete učiniti dijeljenjem položaja ćelije s tri:
     box_row = pos[0] // 3
    box_col = pos[1] // 3
  6. Za svaki redak i stupac u toj mreži 3x3 provjerite postoji li broj već. Ako ima, vrati false:
    za red u raspon (box_row*3, box_row*3 + 3):
    za kol u raspon (box_col*3, box_col*3 + 3):
    ako ploča[red][kol] == br i (redak, stupac) != pos:
    povrataklažno
  7. Ako skripta dođe do kraja funkcije, to znači da nijedno Sudoku pravilo nije uspjelo. Vrati točno:
    povratakPravi
  8. Funkcija is_valid() samo provjerava je li položaj broja valjan, ali to ne znači da je to točan odgovor na cjelokupno rješenje. Unutar funkcije solve(), ponovno pozovite funkciju solve() s ažuriranom pločom. Funkcija solve() može doći u stanje u kojem više ne može koristiti brojeve za popunjavanje razmaka. U ovom slučaju cijela funkcija vraća false, resetira tu ćeliju natrag na 0 i vraća se unatrag. Funkcija solve() vraća vrijednost true samo ako skripta može popuniti sva mjesta:
    za br u raspon (1, 10):
    ako is_valja (ploča, broj, (red, stupac)):
    ploča[red][kol] = br

    ako riješiti (ploča):
    povratakPravi

    ploča[red][kol] = 0

    povrataklažno

  9. Da biste započeli rješavati zagonetku, pozovite funkciju solve() s originalnom pločom, na dnu skripte, nakon deklaracije funkcije solve():
    riješiti (ploča)
  10. Ispiši konačni rezultat:
    ispis("Riješeno:")
    print_board (ploča)
  11. U naredbenom retku upotrijebite naredbu python za ponovno pokretanje skripte. Pogledajte riješenu zagonetku ispisanu na ekranu:
    python sudoku.py

Stvaranje igara pomoću Pythona

Sudoku je samo jedna od mnogih igara koje možete kreirati i riješiti pomoću Pythona. Možete koristiti Python za stvaranje raznih drugih igara, kao što je zbrka riječi, tekstualna avanturistička igra ili igra boja, da spomenemo samo neke.