def generate_sudoku(self): """make a sudoku game, according to Level in settings, and save it in a file""" minimum_limit_of_dots = int(self.current_settings["min"]) maximum_limit_of_dots = int(self.current_settings["max"]) generator = SudokuGenerator(minimum_limit_of_dots, maximum_limit_of_dots) sudoku_generated = generator.generate_sudoku() self.writer.save_to_file(sudoku_generated, "../custom_games/sudoku_generated") self.menu.status = self.go_main_menu_option
def setUp(self): self.gen = SudokuGenerator() self.quad = self.gen.gen_quad() self.bad_quad1 = np.array([[3, 4, 3], [0, 6, 0], [1, 5, 8]]) self.bad_quad2 = np.array([[3, 4, 3], [7, 6, 2], [1, 5, 8]]) self.bad_quad3 = np.array([[0, 0, 5], [0, 0, 0], [5, 0, 0]]) self.zer_quad = np.zeros((3, 3)).astype("int") pass
def execute_generate_sudoku_option(self, generate_opts): """Executes the action selected by the user save sudoku on TXT file or diplay in console Keyword arguments: generate_opts -- takes one of the two options, generated sudoku could be displayed in console, or in a file """ if generate_opts in ['1', '2']: complexity = self.configuration.get_complexity() min_holes = self.configuration.get_min_holes_by_complexity( complexity) max_holes = self.configuration.get_max_holes_by_complexity( complexity) empty_spot_char = self.configuration.get_empty_spot_char() sudoku_generator = SudokuGenerator() sudoku_generator.generate_sudoku_pattern_by_complexity( min_holes, max_holes, empty_spot_char) if generate_opts == "1": # save sudoku generated in file name_sudoku = "sudoku_generated_" + time.strftime("%Y-%m-%dT%H-%M-%S",\ time.localtime(time.time())) + ".txt" if self.export_sudoku.export_sudoku( sudoku_generator.sudoku_pattern, 'txt', "../results/", name_sudoku) is True: print "\nSudoku was saved to: '", name_sudoku, "'" self.display_main_menu() else: print "\nFailed to save in TXT file. Try again...!" self.display_generate_sudoku_menu() if generate_opts == "2": # display generate sudoku in console print "\nGenerated Sudoku:\n" self.export_sudoku.export_sudoku(sudoku_generator.sudoku_pattern, 'cmd line', '', '') self.display_main_menu() if generate_opts == "3": self.display_main_menu()
def execute_generate_sudoku_option(self, generate_opts): """Executes the action selected by the user save sudoku on TXT file or diplay in console Keyword arguments: generate_opts -- takes one of the two options, generated sudoku could be displayed in console, or in a file """ if generate_opts in ['1', '2']: complexity = self.configuration.get_complexity() min_holes = self.configuration.get_min_holes_by_complexity(complexity) max_holes = self.configuration.get_max_holes_by_complexity(complexity) empty_spot_char = self.configuration.get_empty_spot_char() sudoku_generator = SudokuGenerator() sudoku_generator.generate_sudoku_pattern_by_complexity(min_holes, max_holes, empty_spot_char) if generate_opts == "1": # save sudoku generated in file name_sudoku = "sudoku_generated_" + time.strftime("%Y-%m-%dT%H-%M-%S",\ time.localtime(time.time())) + ".txt" if self.export_sudoku.export_sudoku(sudoku_generator.sudoku_pattern, 'txt', "../results/", name_sudoku) is True: print "\nSudoku was saved to: '",name_sudoku,"'" self.display_main_menu() else: print "\nFailed to save in TXT file. Try again...!" self.display_generate_sudoku_menu() if generate_opts == "2": # display generate sudoku in console print "\nGenerated Sudoku:\n" self.export_sudoku.export_sudoku(sudoku_generator.sudoku_pattern, 'cmd line', '', '') self.display_main_menu() if generate_opts == "3": self.display_main_menu()
class TestSudokuGenerator(unittest.TestCase): def setUp(self): self.gen = SudokuGenerator() self.quad = self.gen.gen_quad() self.bad_quad1 = np.array([[3, 4, 3], [0, 6, 0], [1, 5, 8]]) self.bad_quad2 = np.array([[3, 4, 3], [7, 6, 2], [1, 5, 8]]) self.bad_quad3 = np.array([[0, 0, 5], [0, 0, 0], [5, 0, 0]]) self.zer_quad = np.zeros((3, 3)).astype("int") pass def test_gen_quad(self): self.assertTrue( np.count_nonzero(np.unique(self.quad)) == np.count_nonzero( self.quad)) def test_sec_valid(self): self.assertFalse(self.gen.quad_valid(self.bad_quad1)) self.assertFalse(self.gen.quad_valid(self.bad_quad2)) self.assertFalse(self.gen.quad_valid(self.bad_quad3)) self.assertTrue(self.gen.quad_valid(self.zer_quad)) self.assertTrue(self.gen.quad_valid(self.quad))
class TestGenerator(unittest.TestCase): def setUp(self): self.minimum_limit = 30 self.maximum_limit = 40 self.generator = SudokuGenerator(self.minimum_limit, self.maximum_limit) self.generator.fill_board() self.generator.fill_puzzle_with_dots() def test_generate_empty_board(self): expected_easy_puzzle = None self.assertEqual(expected_easy_puzzle, self.generator.clean_board()) def test_parsed_puzzle(self): expected_result = self.generator.create_board_to_txt() self.assertTrue(re.match('0123456789+-_|', expected_result))
def setUp(self): self.test_generator = SudokuGenerator()
class TestSudokuGenerator(unittest.TestCase): def setUp(self): self.test_generator = SudokuGenerator() def test_is_valid_row_returns_false_when_duplicated_in_the_row_0(self): self.test_generator.board_list =[[1, 4, 4, 3, 5, 6, 7, 8, 9], [2, 3, 5, 4, 6, 7, 8, 9, 1], [3, 5, 6, 7, 4, 8, 9, 1, 2], [4, 6, 7, 8, 9, 1, 2, 3, 5], [5, 7, 8, 9, 1, 2, 3, 4, 6], [6, 8, 9, 1, 2, 3, 4, 5, 7], [7, 9, 1, 2, 3, 4, 5, 6, 8], [8, 1, 2, 3, 4, 5, 6, 7, 9], [9, 2, 3, 4, 5, 6, 7, 8, 1]] self.assertFalse(self.test_generator.is_valid_row(0)) def test_is_valid_row_returns_false_when_duplicated_in_middle_row(self): self.test_generator.board_list =[[1, 2, 4, 3, 5, 6, 7, 8, 9], [2, 3, 5, 4, 6, 7, 8, 9, 1], [3, 5, 6, 7, 4, 8, 9, 1, 2], [4, 6, 7, 8, 9, 1, 2, 3, 5], [5, 7, 8, 9, 1, 2, 5, 4, 6], [6, 8, 9, 1, 2, 3, 4, 5, 7], [7, 9, 1, 2, 3, 4, 5, 6, 8], [8, 1, 2, 3, 4, 5, 6, 9, 9], [9, 2, 3, 4, 5, 6, 8, 8, 1]] self.assertFalse(self.test_generator.is_valid_row(4)) def test_is_valid_row_returns_true_when_no_duplicate_in_row_0(self): self.test_generator.board_list =[[1, 2, 3, 4, 5, 6, 7, 8, 9], [2, 3, 5, 4, 6, 7, 8, 9, 1], [3, 5, 6, 7, 4, 8, 9, 1, 2], [4, 6, 7, 8, 9, 1, 2, 3, 5], [5, 7, 8, 9, 1, 2, 5, 4, 6], [6, 8, 9, 1, 2, 3, 4, 5, 7], [7, 9, 1, 2, 3, 4, 5, 6, 8], [8, 1, 2, 3, 4, 5, 6, 9, 9], [9, 2, 3, 4, 5, 6, 8, 8, 1]] self.assertTrue(self.test_generator.is_valid_row(0)) def test_is_valid_row_returns_true_when_no_duplicate_in_last_row(self): self.test_generator.board_list =[[1, 2, 3, 4, 5, 6, 7, 8, 9], [2, 3, 5, 4, 6, 7, 8, 9, 1], [3, 5, 6, 7, 4, 8, 9, 1, 2], [4, 6, 7, 8, 9, 1, 2, 3, 5], [5, 7, 8, 9, 1, 2, 5, 4, 6], [6, 8, 9, 1, 2, 3, 4, 5, 7], [7, 9, 1, 2, 3, 4, 5, 6, 8], [8, 1, 2, 3, 4, 5, 6, 9, 9], [9, 2, 3, 4, 5, 6, 8, 7, 1]] self.assertTrue(self.test_generator.is_valid_row(8)) def test_is_valid_col_returns_false_when_duplicate_in_col_0(self): self.test_generator.board_list =[[9, 2, 3, 4, 5, 6, 7, 8, 9], [2, 3, 5, 4, 6, 7, 8, 9, 1], [3, 5, 6, 7, 4, 8, 9, 1, 2], [4, 6, 7, 8, 9, 1, 2, 3, 5], [5, 7, 8, 9, 1, 2, 5, 4, 6], [6, 8, 9, 1, 2, 3, 4, 5, 7], [7, 9, 1, 2, 3, 4, 5, 6, 8], [8, 1, 2, 3, 4, 5, 6, 9, 9], [9, 2, 3, 4, 5, 6, 8, 7, 1]] self.assertFalse(self.test_generator.is_valid_col(0)) def test_is_valid_col_returns_false_when_duplicate_in_last_col(self): self.test_generator.board_list =[[9, 2, 3, 4, 5, 6, 7, 8, 3], [2, 3, 5, 4, 6, 7, 8, 9, 1], [3, 5, 6, 7, 4, 8, 9, 1, 2], [4, 6, 7, 8, 9, 1, 2, 3, 5], [5, 7, 8, 9, 1, 2, 5, 4, 6], [6, 8, 9, 1, 2, 3, 4, 5, 7], [7, 9, 1, 2, 3, 4, 5, 6, 1], [8, 1, 2, 3, 4, 5, 6, 9, 9], [9, 2, 3, 4, 5, 6, 8, 7, 8]] self.assertFalse(self.test_generator.is_valid_col(8)) def test_is_valid_col_returns_true_when_no_duplicate_in_col_0(self): self.test_generator.board_list =[[9, 2, 3, 4, 5, 6, 7, 8, 3], [2, 3, 5, 4, 6, 7, 8, 9, 1], [3, 5, 6, 7, 4, 8, 9, 1, 2], [4, 6, 7, 8, 9, 1, 2, 3, 5], [5, 7, 8, 9, 1, 2, 5, 4, 6], [6, 8, 9, 1, 2, 3, 4, 5, 7], [7, 9, 1, 2, 3, 4, 5, 6, 1], [8, 1, 2, 3, 4, 5, 6, 9, 9], [1, 2, 3, 4, 5, 6, 8, 7, 8]] self.assertTrue(self.test_generator.is_valid_col(0)) def test_is_valid_col_returns_true_when_no_duplicate_in_col_7(self): self.test_generator.board_list =[[9, 2, 3, 4, 5, 6, 7, 8, 3], [2, 3, 5, 4, 6, 7, 8, 9, 1], [3, 5, 6, 7, 4, 8, 9, 1, 2], [4, 6, 7, 8, 9, 1, 2, 3, 5], [5, 7, 8, 9, 1, 2, 5, 4, 6], [6, 8, 9, 1, 2, 3, 4, 5, 7], [7, 9, 1, 2, 3, 4, 5, 6, 1], [8, 1, 2, 3, 4, 5, 6, 2, 9], [1, 2, 3, 4, 5, 6, 8, 7, 8]] self.assertTrue(self.test_generator.is_valid_col(7)) def test_is_valid_square_returns_false_when_duplicate_in_square_0(self): self.test_generator.board_list =[[6, 5, 7, 1, 8, 4, 3, 2, 9], [9, 6, 8, 7, 3, 6, 4, 1, 5], [4, 3, 1, 2, 9, 5, 7, 6, 8], [2, 8, 6, 3, 5, 9, 1, 4, 7], [7, 9, 5, 4, 2, 1, 8, 3, 6], [3, 1, 4, 8, 6, 7, 5, 9, 2], [8, 7, 9, 6, 1, 3, 2, 5, 4], [1, 6, 2, 5, 4, 8, 9, 7, 3], [5, 4, 3, 9, 7, 2, 6, 8, 1]] self.assertFalse(self.test_generator.is_valid_square(0)) def test_is_valid_square_returns_false_when_duplicate_in_last_square(self): self.test_generator.board_list =[[6, 5, 7, 1, 8, 4, 3, 2, 9], [9, 6, 8, 7, 3, 6, 4, 1, 5], [4, 3, 1, 2, 9, 5, 7, 6, 8], [2, 8, 6, 3, 5, 9, 1, 4, 7], [7, 9, 5, 4, 2, 1, 8, 3, 6], [3, 1, 4, 8, 6, 7, 5, 9, 2], [8, 7, 9, 6, 1, 3, 2, 5, 4], [1, 6, 2, 5, 4, 8, 7, 7, 3], [5, 4, 3, 9, 7, 2, 6, 8, 1]] self.assertFalse(self.test_generator.is_valid_square(8)) def test_is_valid_square_returns_true_when_no_duplicate_in_square_0(self): self.test_generator.board_list =[[6, 5, 7, 1, 8, 4, 3, 2, 9], [9, 2, 8, 7, 3, 6, 4, 1, 5], [4, 3, 1, 2, 9, 5, 7, 6, 8], [2, 8, 6, 3, 5, 9, 1, 4, 7], [7, 9, 5, 4, 2, 1, 8, 3, 6], [3, 1, 4, 8, 6, 7, 5, 9, 2], [8, 7, 9, 6, 1, 3, 2, 5, 4], [1, 6, 2, 5, 4, 8, 9, 7, 3], [5, 4, 3, 9, 7, 2, 6, 8, 1]] self.assertTrue(self.test_generator.is_valid_square(0)) def test_is_valid_square_returns_true_when_no_duplicate_in_last_square(self): self.test_generator.board_list =[[6, 5, 7, 1, 8, 4, 3, 2, 9], [9, 2, 8, 7, 3, 6, 4, 1, 5], [4, 3, 1, 2, 9, 5, 7, 6, 8], [2, 8, 6, 3, 5, 9, 1, 4, 7], [7, 9, 5, 4, 2, 1, 8, 3, 6], [3, 1, 4, 8, 6, 7, 5, 9, 2], [8, 7, 9, 6, 1, 3, 2, 5, 4], [1, 6, 2, 5, 4, 8, 9, 7, 3], [5, 4, 3, 9, 7, 2, 6, 8, 1]] self.assertTrue(self.test_generator.is_valid_square(8)) def test_is_valid_board_returns_true_when_no_duplicate_in_sudoku_board(self): self.test_generator.board_list =[[6, 5, 7, 1, 8, 4, 3, 2, 9], [9, 2, 8, 7, 3, 6, 4, 1, 5], [4, 3, 1, 2, 9, 5, 7, 6, 8], [2, 8, 6, 3, 5, 9, 1, 4, 7], [7, 9, 5, 4, 2, 1, 8, 3, 6], [3, 1, 4, 8, 6, 7, 5, 9, 2], [8, 7, 9, 6, 1, 3, 2, 5, 4], [1, 6, 2, 5, 4, 8, 9, 7, 3], [5, 4, 3, 9, 7, 2, 6, 8, 1]] self.assertTrue(self.test_generator.is_valid_board()) def test_is_valid_board_returns_false_when_duplicates_in_sudoku_board(self): self.test_generator.board_list =[[1, 4, 4, 3, 5, 6, 7, 8, 9], [2, 3, 5, 4, 6, 7, 8, 9, 1], [3, 5, 6, 7, 4, 8, 9, 1, 2], [4, 6, 7, 8, 9, 1, 2, 3, 5], [5, 7, 8, 9, 1, 2, 3, 4, 6], [6, 8, 9, 1, 2, 3, 4, 5, 7], [7, 9, 1, 2, 3, 4, 5, 6, 8], [8, 1, 2, 3, 4, 5, 6, 7, 9], [9, 2, 3, 4, 5, 6, 7, 8, 1]] self.assertFalse(self.test_generator.is_valid_board()) def test_get_positions_returns_a_list_with_positions(self): exp_positions = [(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (5, 0), (6, 0), (7, 0), (8, 0), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1), (8, 1), (0, 2), (1, 2), (2, 2), (3, 2), (4, 2), (5, 2), (6, 2), (7, 2), (8, 2), (0, 3), (1, 3), (2, 3), (3, 3), (4, 3), (5, 3), (6, 3), (7, 3), (8, 3), (0, 4), (1, 4), (2, 4), (3, 4), (4, 4), (5, 4), (6, 4), (7, 4), (8, 4), (0, 5), (1, 5), (2, 5), (3, 5), (4, 5), (5, 5), (6, 5), (7, 5), (8, 5), (0, 6), (1, 6), (2, 6), (3, 6), (4, 6), (5, 6), (6, 6), (7, 6), (8, 6), (0, 7), (1, 7), (2, 7), (3, 7), (4, 7), (5, 7), (6, 7), (7, 7), (8, 7), (0, 8), (1, 8), (2, 8), (3, 8), (4, 8), (5, 8), (6, 8), (7, 8), (8, 8)] self.assertEquals(exp_positions, self.test_generator.get_positions()) def test_fill_board_returns_true_if_valid_sudoku_was_generated(self): positions = self.test_generator.get_positions() valid_board = self.test_generator.fill_board(positions,0) expected_valid_status = True self.assertEquals(expected_valid_status, valid_board) def test_generate_random_positions_does_not_return_an_empty_list(self): size_list = 4 list_positions = self.test_generator.generate_random_positions(size_list) self.assertEquals(size_list, len(list_positions)) def test_get_board_format_to_string_returns_multiline_string_format_when_board_numeric(self): board_to_format = [[1, 4, 4, 3, 5, 6, 7, 8, 9], [2, 3, 5, 4, 6, 7, 8, 9, 1], [3, 5, 6, 7, 4, 8, 9, 1, 2], [4, 6, 7, 8, 9, 1, 2, 3, 5], [5, 7, 8, 9, 1, 2, 3, 4, 6], [6, 8, 9, 1, 2, 3, 4, 5, 7], [7, 9, 1, 2, 3, 4, 5, 6, 8], [8, 1, 2, 3, 4, 5, 6, 7, 9], [9, 2, 3, 4, 5, 6, 7, 8, 1]] expected_board_string = "144356789\n" + \ "235467891\n" + \ "356748912\n" + \ "467891235\n" + \ "578912346\n" + \ "689123457\n" + \ "791234568\n" + \ "812345679\n" + \ "923456781\n" current_board_string = self.test_generator.get_board_format_to_string(board_to_format) self.assertEquals(expected_board_string, current_board_string) def test_get_board_format_to_string_returns_multiline_string_format_when_board_string(self): board_to_format = [['1', '.', '.', '5', '4', '9', '6', '8', '3'], ['6', '4', '5', '.', '.', '3', '2', '.', '9'], ['.', '8', '9', '2', '6', '1', '7', '4', '.'], ['4', '.', '.', '.', '.', '.', '.', '5', '1'], ['8', '1', '3', '4', '5', '6', '.', '.', '.'], ['2', '5', '7', '1', '.', '.', '4', '3', '6'], ['9', '6', '4', '.', '1', '5', '3', '2', '8'], ['7', '3', '.', '.', '8', '2', '5', '9', '4'], ['.', '2', '.', '9', '3', '4', '1', '6', '7']] expected_board_string = "1..549683\n" + \ "645..32.9\n" + \ ".8926174.\n" + \ "4......51\n" + \ "813456...\n" + \ "2571..436\n" + \ "964.15328\n" + \ "73..82594\n" + \ ".2.934167\n" current_board_string = self.test_generator.get_board_format_to_string(board_to_format) self.assertEquals(expected_board_string, current_board_string) def test_generate_sudoku_pattern_by_complexity_returns_solvable_sudoku_easy(self): self.test_generator.generate_sudoku_pattern_by_complexity(20, 25, '.') raw_sudoku_string = self.test_generator.get_board_format_to_string(self.test_generator.sudoku_pattern) sudoku_test_solve = BacktrakingAlgorithm(raw_sudoku_string, ".") self.assertTrue(sudoku_test_solve.solve_sudoku()) def test_generate_sudoku_pattern_by_complexity_returns_solvable_sudoku_medium(self): self.test_generator.generate_sudoku_pattern_by_complexity(30, 40, '.') raw_sudoku_string = self.test_generator.get_board_format_to_string(self.test_generator.sudoku_pattern) sudoku_test_solve = BacktrakingAlgorithm(raw_sudoku_string, ".") self.assertTrue(sudoku_test_solve.solve_sudoku()) def test_generate_sudoku_pattern_by_complexity_returns_solvable_sudoku_hard(self): self.test_generator.generate_sudoku_pattern_by_complexity(40, 50, '.') raw_sudoku_string = self.test_generator.get_board_format_to_string(self.test_generator.sudoku_pattern) sudoku_test_solve = BacktrakingAlgorithm(raw_sudoku_string, ".") self.assertTrue(sudoku_test_solve.solve_sudoku()) def test_give_hint_at_returns_the_value_6_at_position_3_2(self): self.test_generator.board_list =[[6, 5, 7, 1, 8, 4, 3, 2, 9], [9, 2, 8, 7, 3, 6, 4, 1, 5], [4, 3, 1, 2, 9, 5, 7, 6, 8], [2, 8, 6, 3, 5, 9, 1, 4, 7], [7, 9, 5, 4, 2, 1, 8, 3, 6], [3, 1, 4, 8, 6, 7, 5, 9, 2], [8, 7, 9, 6, 1, 3, 2, 5, 4], [1, 6, 2, 5, 4, 8, 9, 7, 3], [5, 4, 3, 9, 7, 2, 6, 8, 1]] self.test_generator.sudoku_pattern = [['6', '.', '7', '.', '8', '4', '3', '2', '9'], ['.', '2', '8', '7', '3', '.', '4', '1', '5'], ['4', '3', '1', '2', '.', '.', '.', '6', '8'], ['2', '8', '.', '.', '5', '9', '1', '4', '7'], ['7', '9', '5', '4', '2', '.', '8', '3', '.'], ['3', '1', '4', '8', '6', '.', '5', '9', '2'], ['8', '.', '9', '.', '1', '3', '2', '5', '4'], ['1', '6', '2', '5', '.', '8', '9', '7', '3'], ['.', '.', '3', '9', '7', '2', '6', '8', '1']] expected_value_hint = 6 self.assertEquals(expected_value_hint,self.test_generator.give_hint_at(3,2))
def setUp(self): self.minimum_limit = 30 self.maximum_limit = 40 self.generator = SudokuGenerator(self.minimum_limit, self.maximum_limit) self.generator.fill_board() self.generator.fill_puzzle_with_dots()