0

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()
64rl0
  • 29
  • 5
  • 1
    Please explain your problem: what is your program doing? How is that different to what is supposed to do? "It's not a sudoku" is too broad, be specific. Also, create a [mre] of the problem. – Ignatius Reilly Feb 24 '23 at 20:59
  • Why all the use of `globals()` and `locals()`? You seem to know about lists. – Emanuel P Feb 24 '23 at 21:00
  • That's a lot of code. I would suggest looking for inspiration here: https://stackoverflow.com/a/56581709/5237560 – Alain T. Feb 25 '23 at 02:56

0 Answers0