Solver
Solver
class Cell:
'''Represents a cell within a game of Sudoku.'''
@property
def row(self):
'''Getter method for row.'''
return self._row
@row.setter
def row(self, row):
'''Setter method for row.'''
if row < 0 or row > 8:
raise AttributeError('Row must be between 0 and 8.')
else:
self._row = row
@property
def col(self):
'''Getter method for col.'''
return self._col
@col.setter
def col(self, col):
'''Setter method for col.'''
if col < 0 or col > 8:
raise AttributeError('Col must be between 0 and 8.')
else:
self._col = col
@property
def value(self):
'''Getter method for value.'''
return self._value
@property
def editable(self):
'''Getter method for editable.'''
return self._editable
def __repr__(self):
return f'{self.__class__.__name__}({self.value})'
@value.setter
def value(self, value):
'''Setter method for value.'''
if value is not None and (value < 1 or value > 9):
raise AttributeError('Value must be between 1 and 9.')
else:
self._value = value
class Sudoku:
'''Represents a game/board of Sudoku.'''
# Move is valid
return True
return possible_moves
def get_empty_cell(self):
'''Returns an empty cell. Returns False if all cells are filled in.'''
for row in range(9):
for col in range(9):
if self.board[row][col].value is None:
return self.board[row][col]
return False
def solve(self):
'''
Solves the game from it's current state with a backtracking algorithm.
Returns True if successful and False if not solvable.
'''
cell = self.get_empty_cell()
def get_board(self):
'''Returns a list of values that are in the Sudoku board.'''
return [[self.board[row][col].value for col in range(9)] for row in
range(9)]
def test_solve(self):
'''Checks if the current configuration is solvable.'''
current_board = self.get_board()
solvable = self.solve()
return solvable
def reset(self):
'''Resets the game to its starting state.'''
for row in self.board:
for cell in row:
if cell.editable:
cell.value = None
def __str__(self):
'''Returns a string representing the board.'''
board = ' -----------------------\n'
for row, line in enumerate(self.board):
board += '|'
for col, cell in enumerate(line):
if cell.value is None:
val = '-'
else:
val = cell.value
if col < 8:
board += f' {val}'
if (col + 1) % 3 == 0:
board += ' |'
else:
board += f' {val} |\n'
if row < 8 and (row + 1) % 3 == 0:
board += '|-------|-------|-------|\n'
board += ' -----------------------\n'
return board