# Create a Program to Create Sudoku Game in Python Assignment Solution.

## Instructions

Objective
Write a Python homework to create a Sudoku game in the Python language is an exciting and engaging task that will undoubtedly enhance your programming skills. Developing a Sudoku game involves implementing logic to generate puzzles, validating user inputs, and ensuring an enjoyable user experience. By completing this assignment, you will gain valuable experience in data structures, loops, and conditional statements. Don't hesitate to refer to online resources and tutorials to deepen your understanding and overcome any challenges you encounter. Remember, practice makes perfect, and this Python homework will undoubtedly contribute to your growth as a proficient programmer.

## Requirements and Specifications

Source Code

puzzle = []

with open(filename, 'r') as f:

for line in data:

token_strings = line.split(" ")

row = map(int, token_strings)

token_ints = [i for i in row]

puzzle.append(token_ints)

return puzzle

"""## Display Puzzle"""

def display_puzzle(puzzle):

row_counter = 0

for idx, tokens in enumerate(puzzle):

if idx in [0, 3, 6]:

print('+-------+-------+-------+')

row = "| "

for e_idx, element in enumerate(tokens):

if element == 0:

row += '. '

else:

row += str(element) + " "

if e_idx in [2, 5, 8]:

row += '| '

print(row)

print('+-------+-------+-------+')

"""## Get Next"""

def get_next(row, col):

if col < 8:

return row, col+1

if col == 8 and row < 8:

return row+1, 0

if col == 8 and row == 8:

return None, None

"""## Copy Puzzle"""

def copy_puzzle(puzzle):

new_puzzle = []

for row in puzzle:

row_copy = row.copy()

new_puzzle.append(row_copy)

return new_puzzle

"""## Get Options"""

def get_options(puzzle, row, col):

if puzzle[row][col] > 0:

return None

else:

# get valid values

# Scan row first

used = []

for col_ in range(0, 9):

if puzzle[row][col_] != 0:

used.append(puzzle[row][col_])

# Scan column

for row_ in range(0, 9):

if puzzle[row_][col] != 0:

used.append(puzzle[row_][col])

# Now, scan block

start_row = 3*int(row/3)

start_col = 3*int(col/3)

for row_ in range(start_row, start_row+3):

for col_ in range(start_col, start_col+3):

if puzzle[row_][col_] != 0:

used.append(puzzle[row_][col_])

# Now, get all values that are not in the row or the column

options = []

for i in range(1, 10):

if i not in used:

options.append(i)

return options

"""## Solve"""

def solve(puzzle, row = 0, col = 0):

if puzzle[row][col] != 0: # cell is not blank

next_row, next_col = get_next(row,col)

if next_row is None:

return puzzle

else:

return solve(puzzle, next_row, next_col)

else: # cell is blank

options = get_options(puzzle, row, col)

if len(options) == 0: # options is empty

return None

else: # options is not empty

for digit in options:

new_puzzle = copy_puzzle(puzzle)

new_puzzle[row][col] = digit

result = solve(new_puzzle, row, col)

if result != None: # solution found

return result