Studer denne koden nøye og oppdag en smart måte å bruke rekursjon for å løse de vanskelige sudoku-oppgavene.
Sudoku er et populært tallpuslespill som består av et 9x9 rutenett med sifre fra 1 til 9. Puslespillet inneholder en kombinasjon av tall og noen tomme områder, som du må fylle.
Når du fyller ut de tomme plassene, skal hver rad, kolonne og 3x3 underrutenett inneholde alle sifre fra 1 til 9.
Et enkelt Python-skript kan hjelpe deg med å løse et Sudoku-puslespill. Den kan analysere alle de tomme plassene på Sudoku-brettet, og finne et mulig nummer å fylle ut hver tom plass.
Hvordan lage og vise Sudoku Board
Inne i et Python-skript må du bruke en liste over arrays for å lagre verdiene til det uløste Sudoku-puslespillet.
Koden som brukes i dette prosjektet er tilgjengelig i denne GitHub repo under MIT-lisensen.
- Inne i et nytt Python-skript kalt sudoku.py, lagrer du alle verdiene for 9x9-rutenettet. Hver rad og kolonne representerer de ni tallene på tvers og nedover i Sudoku-puslespillet. Legg til 0-er for å representere mellomrommene som må løses:
bord = [
[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]
] - Inne i en ny funksjon kalt print_board, bruk en for loop for å behandle hver rad i rutenettet:
defprint_board(borde):
til rad i område(9): - For å dele hver rad i tredjedeler, sjekk om raden er delelig med tre, og legg til en linje:
hvis rad % 3 == 0og rad != 0:
skrive ut("- - - - - - - - - - - - - - ") - Innenfor hver rad går du gjennom hver kolonne. Du kan også dele kolonner i tredjedeler ved å sjekke om kolonnen er delelig med tre:
til kol i område(9):
hvis col % 3 == 0og col != 0:
skrive ut(" | ", slutt="") - Skriv ut tallverdien som er lagret i rutenettet. Hvis kolonnen er den siste kolonnen for den bestemte raden, legg til en bruddlinje, slik at følgende rad vises på en ny linje:
hvis col == 8:
print (tavle[rad][kol])
ellers:
print (str (tavle[rad][kol]) + " ", slutt="") - Kall funksjonen for å skrive ut tavlen:
print_board (tavle)
- På en kommandolinje, naviger til mappen der du lagret python-skriptet ditt, for eksempel:
cd skrivebord
- Bruk python-kommandoen til å kjøre Sudoku-skriptet. Se puslespillet skrevet ut på skjermen:
python sudoku.py
Hvordan identifisere de tomme områdene som skal løses
Du kan gå gjennom listene for å finne mellomrommene som består av 0-er. Disse bestemmer hvilke områder som må løses.
- I en ny funksjon kalt find_empty(), går du gjennom hver rad og kolonne på brettet:
deffinn_tom(borde):
til rad i område(9):
til kol i område(9): - Hvis verdien til den gjeldende cellen er 0, returner den nåværende posisjonen til den tomme cellen:
hvis tavle[rad][kol] == 0:
komme tilbake (rad, kolonne) - Hvis skriptet når slutten av funksjonen, betyr det at skriptet ikke kunne finne noen celler med verdien 0. I dette tilfellet må du ikke returnere noe:
komme tilbakeIngen
- I en ny funksjon kalt solve(), bruk finn-funksjonen for å finne den første tomme plassen på brettet:
defløse(borde):
finn = finn_tom (tavle) - Finn_empty()-funksjonen returnerer celleposisjonen i tuppelformat, for eksempel (0, 2). Lagre disse verdiene separat i rad og kol variabler. Ellers, returner sant for å angi at det ikke er noen tomme mellomrom igjen å løse:
hvisikke finne:
komme tilbakeekte
ellers:
rad, kol = finn
Hvordan løse gåten for hver rad, kolonne og 3x3 rutenett
Nå som du kan identifisere den første tomme plassen du skal løse, må du prøve å finne et passende tall for å fylle plassen og løse gåten.
Bruker rekursjon, kall opp solve()-funksjonen i seg selv for å prøve alle mulige kombinasjoner av verdier for alle de andre mellomrommene også.
- Inne i solve()-funksjonen, etter å ha funnet det første tomme rommet, går du gjennom hvert tall fra 1 til 9. Disse tallene representerer de mulige tallene som kan fylle det uløste rommet:
til num i område(1, 10):
- Skriv inn tavlen, det mulige tallet og posisjonen til den tomme cellen i en ny funksjon. Den nye funksjonen vil returnere sann hvis det tallet er et gyldig tall som kan løse det tomme rommet. Hvis det er gyldig, tilordne det nummeret til cellen på tavlen:
hvis is_valid (tavle, num, (rad, col)):
tavle[rad][kol] = antall - Opprett funksjonen is_valid() med samsvarende parametere:
defer gyldig(brett, antall, pos):
- Bruk funksjonen til å sjekke om det å plassere nummeret i den posisjonen bryter med noen regler i Sudoku-spillet. Kontroller først om dette nummeret allerede finnes i raden eller kolonnen i cellen:
til kol i område(9):
hvis styre[pos[0]][col] == num og pos[1] != col:
komme tilbakeFalsktil rad i område(9):
hvis tavle[rad][pos[1]] == antall og pos[0] != rad:
komme tilbakeFalsk - Få 3x3 rutenettet som cellen tilhører. Du kan gjøre dette ved å dele cellens posisjon med tre:
box_row = pos[0] // 3
box_col = pos[1] // 3 - For hver rad og kolonne i det 3x3 rutenettet, sjekk om nummeret allerede eksisterer. Hvis den gjør det, returner false:
til rad i område (boks_rad*3, box_row*3 + 3):
til kol i område (boks_kolonne*3, box_col*3 + 3):
hvis bord[rad][kol] == num og (rad, kolonne) != pos:
komme tilbakeFalsk - Hvis skriptet når slutten av funksjonen, betyr det at ingen av Sudoku-reglene mislyktes. Returner sann:
komme tilbakeekte
- Funksjonen is_valid() sjekker bare om nummerplasseringen er gyldig, men det betyr ikke at det er riktig svar på den generelle løsningen. Innenfor solve()-funksjonen kaller du solve()-funksjonen igjen med det oppdaterte brettet. solve()-funksjonen kan nå en tilstand der den ikke lenger kan bruke noen tall for å fylle mellomrom. I dette tilfellet returnerer hele funksjonen usann, tilbakestiller den bestemte cellen til 0 og går tilbake. solve()-funksjonen returnerer bare sant når skriptet kan fylle alle mellomrom:
til num i område(1, 10):
hvis is_valid (tavle, num, (rad, col)):
tavle[rad][kol] = antall
hvis løse (bord):
komme tilbakeekte
tavle[rad][kol] = 0komme tilbakeFalsk
- For å begynne å løse gåten, kall opp solve()-funksjonen med det originale brettet, nederst i skriptet, etter å ha erklært solve()-funksjonen:
løse (bord)
- Skriv ut det endelige resultatet:
skrive ut("Løst:")
print_board (tavle) - På kommandolinjen bruker du python-kommandoen til å kjøre skriptet på nytt. Se det løste puslespillet skrevet ut på skjermen:
python sudoku.py
Lage spill ved hjelp av Python
Sudoku er bare ett av de mange spillene du kan lage og løse ved hjelp av Python. Du kan bruke Python til å lage forskjellige andre spill, for eksempel et ordblanding, et tekstbasert eventyrspill eller et fargespill, for bare å nevne noen.