I have been learning python for a couple of months now and I wanted to build my own Sudoku.
I know that there are plenty of videos os YouTube on how to do it but I started out with my own thinking, and now I got to a point where I am completely stuck!
I looked up some solution online and I noticed that some part of the code are very similar to mine, which makes me feel better, however I cannot get it to work.
I just want to ask some help to find out if I can adjust some of my code and make it work or whether I am completely off route.
Here is my code.
Thanks :)
# FUNCTIONS
def exclude_used_numbers():
# exclude numbers already used in the same column
for ii in range(1, sudoku + 1):
for jj in range(sudoku):
if globals()["row_" + str(ii)][jj] == 0:
continue
else:
value_to_remove = globals()["row_" + str(ii)][jj]
try:
globals()["available_numbers_for_index_" + str(jj)].remove(value_to_remove)
except ValueError:
continue
# exclude numbers already used in the same row
for iii in range(1, sudoku + 1):
for jjj in range(sudoku):
if globals()["row_" + str(iii)][jjj] != 0:
value_to_remove = globals()["row_" + str(iii)][jjj]
try:
globals()["available_numbers_for_row_" + str(iii)].remove(value_to_remove)
except ValueError:
continue
# exclude numbers already used in the same square
for iiii in range(1, sudoku + 1):
for jjjj in range(squares_per_row):
for k in range(globals()["square_" + str(jjjj + 1)][0], globals()["square_" + str(jjjj + 1)][1]):
if globals()["row_" + str(iiii)][k] != 0:
value_to_remove = globals()["row_" + str(iiii)][k]
multiplier = ((iiii - 1) // 3) * squares_per_row
try:
globals()["available_numbers_for_square_" + str(jjjj + 1 + multiplier)].remove(value_to_remove)
except ValueError:
continue
def list_of_available_nums():
# intersection of available numbers for columns and rows
for a in range(1, sudoku + 1):
for b in range(sudoku):
if globals()["row_" + str(a)][b] == 0:
temp_list = list(set(globals()["available_numbers_for_row_" + str(a)]).intersection(globals()["available_numbers_for_index_" + str(b)]))
globals()["row_" + str(a)][b] = list(set(temp_list).intersection(globals()["available_numbers_for_square_" + str(b + 1)]))
sudoku = 9
rows = []
# create square ranges
squares = int((sudoku / 3) ** 2)
squares_per_row = int(sudoku / 3)
for i in range(squares_per_row):
locals()["square_" + str(i+1)] = [i*3, (i*3)+3]
# create row lists
for i in range(1, sudoku+1):
locals()["row_" + str(i)] = []
for j in range(1, sudoku+1):
locals()["row_" + str(i)].append(0)
rows.append(locals()["row_" + str(i)])
# create available numbers for columns
for i in range(sudoku):
locals()["available_numbers_for_index_" + str(i)] = []
for j in range(1, sudoku+1):
locals()["available_numbers_for_index_" + str(i)].append(j)
# create available numbers for rows
for i in range(1, sudoku+1):
locals()["available_numbers_for_row_" + str(i)] = []
for j in range(1, sudoku+1):
locals()["available_numbers_for_row_" + str(i)].append(j)
# create available numbers for squares
for i in range(1, squares+1):
locals()["available_numbers_for_square_" + str(i)] = []
for j in range(1, 10):
locals()["available_numbers_for_square_" + str(i)].append(j)
row_1[0] = 2
row_2[1] = 1
row_3[2] = 5
row_4[3] = 4
row_5[4] = 5
row_6[5] = 6
def solve():
exclude_used_numbers()
list_of_available_nums()
for i in range(1, sudoku+1):
for j in range(sudoku):
if isinstance(globals()["row_" + str(i)][j], int):
continue
elif isinstance(globals()["row_" + str(i)][j], list) and globals()["row_" + str(i)][j]:
for n in globals()["row_" + str(i)][j]:
globals()["row_" + str(i)][j] = n
for k in range(1, sudoku + 1):
for y in range(sudoku):
if isinstance(globals()["row_" + str(k)][y], list):
globals()["row_" + str(k)][y] = 0
print("=== GAME ===")
for z in range(1, sudoku + 1):
print(f"row_{z} :", end="")
print(globals()["row_" + str(z)])
solve()
if __name__ == '__main__':
solve()