From fe31a0a7ed3dc60dfe3c59f15ec2c406335a978f Mon Sep 17 00:00:00 2001 From: PySimpleGUI Date: Mon, 16 Oct 2023 08:57:47 -0400 Subject: [PATCH] Fixed numpy deprecated problems. Checking in improvement made long ago buit forgot to check in --- DemoPrograms/Demo_Sudoku.py | 87 +++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 47 deletions(-) diff --git a/DemoPrograms/Demo_Sudoku.py b/DemoPrograms/Demo_Sudoku.py index 7e6ba67b..041faf96 100644 --- a/DemoPrograms/Demo_Sudoku.py +++ b/DemoPrograms/Demo_Sudoku.py @@ -2,18 +2,17 @@ import PySimpleGUI as sg, random import numpy as np from typing import List, Any, Union, Tuple, Dict - """ Sudoku Puzzle Demo - + How to easily generate a GUI for a Sudoku puzzle. The Window definition and creation is a single line of code. - + Code to generate a playable puzzle was supplied from: https://github.com/MorvanZhou/sudoku - + Copyright 2020 PySimpleGUI.com - + """ @@ -27,7 +26,7 @@ def generate_sudoku(mask_rate): """ while True: n = 9 - solution = np.zeros((n, n), np.int) + solution = np.zeros((n, n), np.int_) rg = np.arange(1, n + 1) solution[0, :] = np.random.choice(rg, n, replace=False) try: @@ -36,10 +35,11 @@ def generate_sudoku(mask_rate): col_rest = np.setdiff1d(rg, solution[:r, c]) row_rest = np.setdiff1d(rg, solution[r, :c]) avb1 = np.intersect1d(col_rest, row_rest) - sub_r, sub_c = r//3, c//3 - avb2 = np.setdiff1d(np.arange(0, n+1), solution[sub_r*3:(sub_r+1)*3, sub_c*3:(sub_c+1)*3].ravel()) + sub_r, sub_c = r // 3, c // 3 + avb2 = np.setdiff1d(np.arange(0, n + 1), solution[sub_r * 3:(sub_r + 1) * 3, sub_c * 3:(sub_c + 1) * 3].ravel()) avb = np.intersect1d(avb1, avb2) - solution[r, c] = np.random.choice(avb, size=1) + # solution[r, c] = np.random.choice(avb, size=1) + solution[r, c] = np.random.choice(avb, size=1)[0] break except ValueError: pass @@ -48,7 +48,6 @@ def generate_sudoku(mask_rate): return puzzle, solution - def check_progress(window, solution): """ Gives you a visual hint on your progress. @@ -65,38 +64,23 @@ def check_progress(window, solution): solved = True for r, row in enumerate(solution): for c, col in enumerate(row): - value = window[r,c].get() + value = window[r, c].get() if value: try: value = int(value) except: value = 0 if value != solution[r][c]: - window[r,c].update(background_color='red') + window[r, c].update(background_color='red') solved = False else: - window[r,c].update(background_color=sg.theme_input_background_color()) + window[r, c].update(background_color=sg.theme_input_background_color()) else: solved = False window[r, c].update(background_color='yellow') return solved -def create_and_show_puzzle(window): - # create and display a puzzle by updating the Input elements - rate = DEFAULT_MASK_RATE - if window['-RATE-'].get(): - try: - rate = float(window['-RATE-'].get()) - except: - pass - puzzle, solution = generate_sudoku(mask_rate=rate) - for r, row in enumerate(puzzle): - for c, col in enumerate(row): - window[r, c].update(puzzle[r][c] if puzzle[r][c] else '', background_color=sg.theme_input_background_color()) - return puzzle, solution - - def main(mask_rate=0.7): """" The Main GUI - It does it all. @@ -105,8 +89,19 @@ def main(mask_rate=0.7): addressing of the individual squares is via a key that's a tuple (0,0) to (8,8) """ - - + def create_and_show_puzzle(): + # create and display a puzzle by updating the Input elements + rate = mask_rate + if window['-RATE-'].get(): + try: + rate = float(window['-RATE-'].get()) + except: + pass + puzzle, solution = generate_sudoku(mask_rate=rate) + for r, row in enumerate(puzzle): + for c, col in enumerate(row): + window[r, c].update(puzzle[r][c] if puzzle[r][c] else '', background_color=sg.theme_input_background_color()) + return puzzle, solution # It's 1 line of code to make a Sudoku board. If you don't like it, then replace it. # Dude (Dudette), it's 1-line of code. If you don't like the board, write a line of code. @@ -114,16 +109,18 @@ def main(mask_rate=0.7): # Get an input element for a position using: window[row, col] # To get a better understanding, take it apart. Spread it out. You'll learn in the process. window = sg.Window('Sudoku', - [[sg.Frame('', [[sg.I(random.randint(1,9), justification='r', size=(3,1),enable_events=True, key=(fr*3+r,fc*3+c)) for c in range(3)] for r in range(3)]) for fc in range(3)] for fr in range(3)] + - [[sg.B('Solve'), sg.B('Check'), sg.B('Hint'), sg.B('New Game'), sg.T('Mask rate (0-1)'), sg.In(str(mask_rate), size=(3,1),key='-RATE-')],], finalize=True) + [[sg.Frame('', [[sg.I(random.randint(1, 9), justification='r', size=(3, 1), key=(fr * 3 + r, fc * 3 + c)) for c in range(3)] for r in range(3)]) for fc in + range(3)] for fr in range(3)] + + [[sg.B('Solve'), sg.B('Check'), sg.B('Hint'), sg.B('New Game')], [sg.T('Mask rate (0-1)'), sg.In(str(mask_rate), size=(3, 1), key='-RATE-')], ], + finalize=True) # create and display a puzzle by updating the Input elements - puzzle, solution = create_and_show_puzzle(window) - check_showing = False - while True: # The Event Loop + puzzle, solution = create_and_show_puzzle() + + while True: # The Event Loop event, values = window.read() - if event == sg.WIN_CLOSED: + if event is None: break if event == 'Solve': @@ -131,7 +128,6 @@ def main(mask_rate=0.7): for c, col in enumerate(row): window[r, c].update(solution[r][c], background_color=sg.theme_input_background_color()) elif event == 'Check': - check_showing = True solved = check_progress(window, solution) if solved: sg.popup('Solved! You have solved the puzzle correctly.') @@ -140,17 +136,14 @@ def main(mask_rate=0.7): try: elem.update(solution[elem.Key[0]][elem.Key[1]], background_color=sg.theme_input_background_color()) except: - pass # Likely because an input element didn't have focus + pass # Likely because an input element didn't have focus elif event == 'New Game': - puzzle, solution = create_and_show_puzzle(window) - elif check_showing: # an input was changed, so clear any background colors from prior hints - check_showing = False - for r, row in enumerate(solution): - for c, col in enumerate(row): - window[r, c].update(background_color=sg.theme_input_background_color()) + puzzle, solution = create_and_show_puzzle() + window.close() -if __name__ == "__main__": - DEFAULT_MASK_RATE = 0.7 # % Of cells to hide - main(DEFAULT_MASK_RATE) + +if __name__ == "__main__": + mask_rate = 0.7 # % Of cells to hide + main(mask_rate)