# Learn Classes and Objects by Building a Sudoku Solver - Step 51

### Tell us what’s happening:

Hi all!

This looked like a trivial step but I got stuck… I think I just need to write an else statement but it looks like it’s not working… any hints on what might I have missed?

``````class Board:
def __init__(self, board):
self.board = board

def __str__(self):
upper_lines = f'\n╔═══{"╤═══"*2}{"╦═══"}{"╤═══"*2}{"╦═══"}{"╤═══"*2}╗\n'
middle_lines = f'╟───{"┼───"*2}{"╫───"}{"┼───"*2}{"╫───"}{"┼───"*2}╢\n'
lower_lines = f'╚═══{"╧═══"*2}{"╩═══"}{"╧═══"*2}{"╩═══"}{"╧═══"*2}╝\n'
board_string = upper_lines
for index, line in enumerate(self.board):
row_list = []
for square_no, part in enumerate([line[:3], line[3:6], line[6:]], start=1):
row_square = '|'.join(str(item) for item in part)
row_list.extend(row_square)
if square_no != 3:
row_list.append('║')

row = f'║ {" ".join(row_list)} ║\n'
row_empty = row.replace('0', ' ')
board_string += row_empty

if index < 8:
if index % 3 == 2:
board_string += f'╠═══{"╪═══"*2}{"╬═══"}{"╪═══"*2}{"╬═══"}{"╪═══"*2}╣\n'
else:
board_string += middle_lines
else:
board_string += lower_lines

return board_string

def find_empty_cell(self):
for row, contents in enumerate(self.board):
try:
col = contents.index(0)
return row, col
except ValueError:
pass
return None

def valid_in_row(self, row, num):
return num not in self.board[row]

def valid_in_col(self, col, num):
return all(
self.board[row][col] != num
for row in range(9)
)

# User Editable Region

def valid_in_square(self, row, col, num):
row_start = (row // 3) * 3
col_start=(col // 3) * 3
for row_no in range(row_start, row_start + 3):
for col_no in range(col_start, col_start + 3):
if self.board[row_no][col_no] == num:
return False
else:
return True

# User Editable Region

``````

User Agent is: `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36`