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()
3
  • 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 minimal reproducible example of the problem. Commented Feb 24, 2023 at 20:59
  • Why all the use of globals() and locals()? You seem to know about lists. Commented Feb 24, 2023 at 21:00
  • That's a lot of code. I would suggest looking for inspiration here: stackoverflow.com/a/56581709/5237560 Commented Feb 25, 2023 at 2:56

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.