diff --git a/app/save/save-1.json b/app/save/save-1.json deleted file mode 100644 index b02a204..0000000 --- a/app/save/save-1.json +++ /dev/null @@ -1,572 +0,0 @@ -{ - "cells": [ - { - "blockID": 0, - "symbolIndex": -1 - }, - { - "blockID": 0, - "immutable": true, - "symbolIndex": 8 - }, - { - "blockID": 0, - "immutable": true, - "symbolIndex": 1 - }, - { - "blockID": 1, - "symbolIndex": -1 - }, - { - "blockID": 1, - "symbolIndex": -1 - }, - { - "blockID": 1, - "symbolIndex": -1 - }, - { - "blockID": 2, - "symbolIndex": -1 - }, - { - "blockID": 2, - "symbolIndex": -1 - }, - { - "blockID": 2, - "symbolIndex": -1 - }, - { - "blockID": 0, - "immutable": true, - "symbolIndex": 2 - }, - { - "blockID": 0, - "symbolIndex": -1 - }, - { - "blockID": 0, - "immutable": true, - "symbolIndex": 4 - }, - { - "blockID": 1, - "symbolIndex": -1 - }, - { - "blockID": 1, - "symbolIndex": 0 - }, - { - "blockID": 1, - "symbolIndex": -1 - }, - { - "blockID": 2, - "immutable": true, - "symbolIndex": 6 - }, - { - "blockID": 2, - "immutable": true, - "symbolIndex": 8 - }, - { - "blockID": 2, - "symbolIndex": -1 - }, - { - "blockID": 0, - "immutable": true, - "symbolIndex": 3 - }, - { - "blockID": 0, - "immutable": true, - "symbolIndex": 6 - }, - { - "blockID": 0, - "symbolIndex": -1 - }, - { - "blockID": 1, - "immutable": true, - "symbolIndex": 5 - }, - { - "blockID": 1, - "symbolIndex": -1 - }, - { - "blockID": 1, - "immutable": true, - "symbolIndex": 7 - }, - { - "blockID": 2, - "immutable": true, - "symbolIndex": 2 - }, - { - "blockID": 2, - "symbolIndex": -1 - }, - { - "blockID": 2, - "immutable": true, - "symbolIndex": 4 - }, - { - "blockID": 3, - "immutable": true, - "symbolIndex": 8 - }, - { - "blockID": 3, - "immutable": true, - "symbolIndex": 2 - }, - { - "blockID": 3, - "immutable": true, - "symbolIndex": 3 - }, - { - "blockID": 4, - "immutable": true, - "symbolIndex": 6 - }, - { - "blockID": 4, - "symbolIndex": -1 - }, - { - "blockID": 4, - "symbolIndex": -1 - }, - { - "blockID": 5, - "symbolIndex": -1 - }, - { - "blockID": 5, - "symbolIndex": -1 - }, - { - "blockID": 5, - "immutable": true, - "symbolIndex": 1 - }, - { - "blockID": 3, - "symbolIndex": -1 - }, - { - "blockID": 3, - "immutable": true, - "symbolIndex": 4 - }, - { - "blockID": 3, - "immutable": true, - "symbolIndex": 5 - }, - { - "blockID": 4, - "symbolIndex": -1 - }, - { - "blockID": 4, - "symbolIndex": -1 - }, - { - "blockID": 4, - "symbolIndex": -1 - }, - { - "blockID": 5, - "immutable": true, - "symbolIndex": 8 - }, - { - "blockID": 5, - "immutable": true, - "symbolIndex": 6 - }, - { - "blockID": 5, - "symbolIndex": -1 - }, - { - "blockID": 3, - "symbolIndex": -1 - }, - { - "blockID": 3, - "symbolIndex": -1 - }, - { - "blockID": 3, - "immutable": true, - "symbolIndex": 6 - }, - { - "blockID": 4, - "symbolIndex": -1 - }, - { - "blockID": 4, - "immutable": true, - "symbolIndex": 7 - }, - { - "blockID": 4, - "immutable": true, - "symbolIndex": 8 - }, - { - "blockID": 5, - "immutable": true, - "symbolIndex": 4 - }, - { - "blockID": 5, - "immutable": true, - "symbolIndex": 5 - }, - { - "blockID": 5, - "immutable": true, - "symbolIndex": 3 - }, - { - "blockID": 6, - "immutable": true, - "symbolIndex": 4 - }, - { - "blockID": 6, - "immutable": true, - "symbolIndex": 3 - }, - { - "blockID": 6, - "symbolIndex": -1 - }, - { - "blockID": 7, - "immutable": true, - "symbolIndex": 8 - }, - { - "blockID": 7, - "symbolIndex": -1 - }, - { - "blockID": 7, - "immutable": true, - "symbolIndex": 1 - }, - { - "blockID": 8, - "immutable": true, - "symbolIndex": 5 - }, - { - "blockID": 8, - "symbolIndex": -1 - }, - { - "blockID": 8, - "immutable": true, - "symbolIndex": 6 - }, - { - "blockID": 6, - "immutable": true, - "symbolIndex": 1 - }, - { - "blockID": 6, - "symbolIndex": -1 - }, - { - "blockID": 6, - "immutable": true, - "symbolIndex": 8 - }, - { - "blockID": 7, - "immutable": true, - "symbolIndex": 3 - }, - { - "blockID": 7, - "symbolIndex": -1 - }, - { - "blockID": 7, - "immutable": true, - "symbolIndex": 6 - }, - { - "blockID": 8, - "symbolIndex": -1 - }, - { - "blockID": 8, - "symbolIndex": -1 - }, - { - "blockID": 8, - "symbolIndex": -1 - }, - { - "blockID": 6, - "symbolIndex": -1 - }, - { - "blockID": 6, - "immutable": true, - "symbolIndex": 0 - }, - { - "blockID": 6, - "symbolIndex": -1 - }, - { - "blockID": 7, - "immutable": true, - "symbolIndex": 7 - }, - { - "blockID": 7, - "symbolIndex": -1 - }, - { - "blockID": 7, - "symbolIndex": -1 - }, - { - "blockID": 8, - "immutable": true, - "symbolIndex": 1 - }, - { - "blockID": 8, - "symbolIndex": -1 - }, - { - "blockID": 8, - "immutable": true, - "symbolIndex": 8 - } - ], - "blocks": [ - {"cellIDs": [ - 0, - 1, - 2, - 9, - 10, - 11, - 18, - 19, - 20 - ]}, - {"cellIDs": [ - 3, - 4, - 5, - 12, - 13, - 14, - 21, - 22, - 23 - ]}, - {"cellIDs": [ - 6, - 7, - 8, - 15, - 16, - 17, - 24, - 25, - 26 - ]}, - {"cellIDs": [ - 27, - 28, - 29, - 36, - 37, - 38, - 45, - 46, - 47 - ]}, - {"cellIDs": [ - 30, - 31, - 32, - 39, - 40, - 41, - 48, - 49, - 50 - ]}, - {"cellIDs": [ - 33, - 34, - 35, - 42, - 43, - 44, - 51, - 52, - 53 - ]}, - {"cellIDs": [ - 54, - 55, - 56, - 63, - 64, - 65, - 72, - 73, - 74 - ]}, - {"cellIDs": [ - 57, - 58, - 59, - 66, - 67, - 68, - 75, - 76, - 77 - ]}, - {"cellIDs": [ - 60, - 61, - 62, - 69, - 70, - 71, - 78, - 79, - 80 - ]} - ], - "multidoku": [{ - "blockWidth": 3, - "cells": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30, - 31, - 32, - 33, - 34, - 35, - 36, - 37, - 38, - 39, - 40, - 41, - 42, - 43, - 44, - 45, - 46, - 47, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 59, - 60, - 61, - 62, - 63, - 64, - 65, - 66, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 75, - 76, - 77, - 78, - 79, - 80 - ], - "blocks": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8 - ], - "constraints": [ - 0, - 1, - 2 - ] - }] -} \ No newline at end of file diff --git a/app/save/save.json b/app/save/save.json deleted file mode 100644 index 673d5c9..0000000 --- a/app/save/save.json +++ /dev/null @@ -1,572 +0,0 @@ -{ - "cells": [ - { - "blockID": 0, - "symbolIndex": -1 - }, - { - "blockID": 0, - "immutable": true, - "symbolIndex": 8 - }, - { - "blockID": 0, - "immutable": true, - "symbolIndex": 1 - }, - { - "blockID": 1, - "symbolIndex": -1 - }, - { - "blockID": 1, - "symbolIndex": -1 - }, - { - "blockID": 1, - "symbolIndex": -1 - }, - { - "blockID": 2, - "symbolIndex": -1 - }, - { - "blockID": 2, - "symbolIndex": -1 - }, - { - "blockID": 2, - "symbolIndex": -1 - }, - { - "blockID": 0, - "immutable": true, - "symbolIndex": 2 - }, - { - "blockID": 0, - "symbolIndex": -1 - }, - { - "blockID": 0, - "immutable": true, - "symbolIndex": 4 - }, - { - "blockID": 1, - "symbolIndex": -1 - }, - { - "blockID": 1, - "symbolIndex": -1 - }, - { - "blockID": 1, - "symbolIndex": -1 - }, - { - "blockID": 2, - "immutable": true, - "symbolIndex": 6 - }, - { - "blockID": 2, - "immutable": true, - "symbolIndex": 8 - }, - { - "blockID": 2, - "symbolIndex": -1 - }, - { - "blockID": 0, - "immutable": true, - "symbolIndex": 3 - }, - { - "blockID": 0, - "immutable": true, - "symbolIndex": 6 - }, - { - "blockID": 0, - "symbolIndex": -1 - }, - { - "blockID": 1, - "immutable": true, - "symbolIndex": 5 - }, - { - "blockID": 1, - "symbolIndex": -1 - }, - { - "blockID": 1, - "immutable": true, - "symbolIndex": 7 - }, - { - "blockID": 2, - "immutable": true, - "symbolIndex": 2 - }, - { - "blockID": 2, - "symbolIndex": -1 - }, - { - "blockID": 2, - "immutable": true, - "symbolIndex": 4 - }, - { - "blockID": 3, - "immutable": true, - "symbolIndex": 8 - }, - { - "blockID": 3, - "immutable": true, - "symbolIndex": 2 - }, - { - "blockID": 3, - "immutable": true, - "symbolIndex": 3 - }, - { - "blockID": 4, - "immutable": true, - "symbolIndex": 6 - }, - { - "blockID": 4, - "symbolIndex": -1 - }, - { - "blockID": 4, - "symbolIndex": -1 - }, - { - "blockID": 5, - "symbolIndex": -1 - }, - { - "blockID": 5, - "symbolIndex": -1 - }, - { - "blockID": 5, - "immutable": true, - "symbolIndex": 1 - }, - { - "blockID": 3, - "symbolIndex": -1 - }, - { - "blockID": 3, - "immutable": true, - "symbolIndex": 4 - }, - { - "blockID": 3, - "immutable": true, - "symbolIndex": 5 - }, - { - "blockID": 4, - "symbolIndex": -1 - }, - { - "blockID": 4, - "symbolIndex": -1 - }, - { - "blockID": 4, - "symbolIndex": -1 - }, - { - "blockID": 5, - "immutable": true, - "symbolIndex": 8 - }, - { - "blockID": 5, - "immutable": true, - "symbolIndex": 6 - }, - { - "blockID": 5, - "symbolIndex": -1 - }, - { - "blockID": 3, - "symbolIndex": -1 - }, - { - "blockID": 3, - "symbolIndex": -1 - }, - { - "blockID": 3, - "immutable": true, - "symbolIndex": 6 - }, - { - "blockID": 4, - "symbolIndex": -1 - }, - { - "blockID": 4, - "immutable": true, - "symbolIndex": 7 - }, - { - "blockID": 4, - "immutable": true, - "symbolIndex": 8 - }, - { - "blockID": 5, - "immutable": true, - "symbolIndex": 4 - }, - { - "blockID": 5, - "immutable": true, - "symbolIndex": 5 - }, - { - "blockID": 5, - "immutable": true, - "symbolIndex": 3 - }, - { - "blockID": 6, - "immutable": true, - "symbolIndex": 4 - }, - { - "blockID": 6, - "immutable": true, - "symbolIndex": 3 - }, - { - "blockID": 6, - "symbolIndex": -1 - }, - { - "blockID": 7, - "immutable": true, - "symbolIndex": 8 - }, - { - "blockID": 7, - "symbolIndex": -1 - }, - { - "blockID": 7, - "immutable": true, - "symbolIndex": 1 - }, - { - "blockID": 8, - "immutable": true, - "symbolIndex": 5 - }, - { - "blockID": 8, - "symbolIndex": -1 - }, - { - "blockID": 8, - "immutable": true, - "symbolIndex": 6 - }, - { - "blockID": 6, - "immutable": true, - "symbolIndex": 1 - }, - { - "blockID": 6, - "symbolIndex": -1 - }, - { - "blockID": 6, - "immutable": true, - "symbolIndex": 8 - }, - { - "blockID": 7, - "immutable": true, - "symbolIndex": 3 - }, - { - "blockID": 7, - "symbolIndex": -1 - }, - { - "blockID": 7, - "immutable": true, - "symbolIndex": 6 - }, - { - "blockID": 8, - "symbolIndex": -1 - }, - { - "blockID": 8, - "symbolIndex": -1 - }, - { - "blockID": 8, - "symbolIndex": -1 - }, - { - "blockID": 6, - "symbolIndex": -1 - }, - { - "blockID": 6, - "immutable": true, - "symbolIndex": 0 - }, - { - "blockID": 6, - "symbolIndex": -1 - }, - { - "blockID": 7, - "immutable": true, - "symbolIndex": 7 - }, - { - "blockID": 7, - "symbolIndex": -1 - }, - { - "blockID": 7, - "symbolIndex": -1 - }, - { - "blockID": 8, - "immutable": true, - "symbolIndex": 1 - }, - { - "blockID": 8, - "symbolIndex": -1 - }, - { - "blockID": 8, - "immutable": true, - "symbolIndex": 8 - } - ], - "blocks": [ - {"cellIDs": [ - 0, - 1, - 2, - 9, - 10, - 11, - 18, - 19, - 20 - ]}, - {"cellIDs": [ - 3, - 4, - 5, - 12, - 13, - 14, - 21, - 22, - 23 - ]}, - {"cellIDs": [ - 6, - 7, - 8, - 15, - 16, - 17, - 24, - 25, - 26 - ]}, - {"cellIDs": [ - 27, - 28, - 29, - 36, - 37, - 38, - 45, - 46, - 47 - ]}, - {"cellIDs": [ - 30, - 31, - 32, - 39, - 40, - 41, - 48, - 49, - 50 - ]}, - {"cellIDs": [ - 33, - 34, - 35, - 42, - 43, - 44, - 51, - 52, - 53 - ]}, - {"cellIDs": [ - 54, - 55, - 56, - 63, - 64, - 65, - 72, - 73, - 74 - ]}, - {"cellIDs": [ - 57, - 58, - 59, - 66, - 67, - 68, - 75, - 76, - 77 - ]}, - {"cellIDs": [ - 60, - 61, - 62, - 69, - 70, - 71, - 78, - 79, - 80 - ]} - ], - "multidoku": [{ - "blockWidth": 3, - "cells": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30, - 31, - 32, - 33, - 34, - 35, - 36, - 37, - 38, - 39, - 40, - 41, - 42, - 43, - 44, - 45, - 46, - 47, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - 56, - 57, - 58, - 59, - 60, - 61, - 62, - 63, - 64, - 65, - 66, - 67, - 68, - 69, - 70, - 71, - 72, - 73, - 74, - 75, - 76, - 77, - 78, - 79, - 80 - ], - "blocks": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8 - ], - "constraints": [ - 0, - 1, - 2 - ] - }] -} \ No newline at end of file diff --git a/app/src/main/java/sudoku/Main.java b/app/src/main/java/sudoku/Main.java index e4be138..4d90b66 100644 --- a/app/src/main/java/sudoku/Main.java +++ b/app/src/main/java/sudoku/Main.java @@ -7,6 +7,7 @@ import gui.RenderableMultidoku; import gui.Symbols; import sudoku.io.ConsoleInterface; import sudoku.io.SudokuPrinter; +import sudoku.io.SudokuSerializer; import sudoku.solver.RandomSolver; import sudoku.solver.Solver; import sudoku.structure.MultiDoku; @@ -22,12 +23,14 @@ public class Main { public static void voidTest(){ MultiDoku md = SudokuFactory.createBasicXShapedMultidoku(3, SudokuFactory.DEFAULT_CONSTRAINTS); SudokuPrinter.printMultiDoku(RenderableMultidoku.fromMultidoku(md), Symbols.Numbers, 3, 3); + SudokuSerializer.saveMultiDoku(md); } public static void filledTest(){ MultiDoku md = SudokuFactory.createBasicXShapedMultidoku(3, SudokuFactory.DEFAULT_CONSTRAINTS); new RandomSolver().solve(md); SudokuPrinter.printMultiDoku(RenderableMultidoku.fromMultidoku(md), Symbols.Numbers, 3, 3); + SudokuSerializer.saveMultiDoku(md); } public static void main(String[] args) { @@ -36,7 +39,7 @@ public class Main { voidTest(); filledTest(); filledTest(); - */ + */ console.welcome(); } } diff --git a/app/src/main/java/sudoku/io/ConsoleInterface.java b/app/src/main/java/sudoku/io/ConsoleInterface.java index f238c71..42216ee 100644 --- a/app/src/main/java/sudoku/io/ConsoleInterface.java +++ b/app/src/main/java/sudoku/io/ConsoleInterface.java @@ -4,14 +4,12 @@ import gui.RenderableMultidoku; import gui.Symbols; import sudoku.constraint.*; import sudoku.solver.RandomSolver; -import sudoku.solver.Solver; import sudoku.structure.Difficulty; import sudoku.structure.MultiDoku; import sudoku.structure.SudokuFactory; import java.util.ArrayList; import java.util.List; -import java.util.Random; import java.util.Scanner; public class ConsoleInterface { @@ -20,25 +18,35 @@ public class ConsoleInterface { public void welcome(){ System.out.println("Welcome to our Sudoku Solver!"); System.out.println("This is the project of Melvyn Bauvent, Lilas Grenier and Simon Priblyski."); - start(); + System.out.println("Do you have a save sudoku you would like to continue? (y/n, default n)"); + if (reader.next().equalsIgnoreCase("y")){ + useSavedDoku(); + } + else { + createDoku(); + } } - public void start(){ + private void useSavedDoku() { + System.out.println("What save should we use? Please enter the save number."); + MultiDoku md = saveChoice(); + int blockWidth = md.getSubGrid(0).getBlockWidth(); + int blockHeight = md.getSubGrid(0).getBlocks().getFirst().getCells().size() / blockWidth; + List listSymbols = pickSymbols(blockWidth*blockHeight); + System.out.println("This is the saved sudoku:"); + showMultidoku(md, listSymbols, blockWidth, blockHeight); + } + + public void createDoku(){ System.out.println("First of all, you need to tell me the size of the sudoku you want to generate."); int width = getBlockWidth(); int height = getBlockHeight(); System.out.println("Your sudoku will have blocks of a " + width + " x " + height + " format."); int numberOfSymbols = width * height; - System.out.println("Would you like to pick the " + numberOfSymbols + " symbols from the sudoku? (y/n, default 'no' will use numbers)" ); - List listSymbols = new ArrayList<>(); - if(reader.next().equalsIgnoreCase("y")){ - pickSymbols(listSymbols, numberOfSymbols); - } - else { - listSymbols = Symbols.Numbers.getSymbols(); - } + List listSymbols = pickSymbols(numberOfSymbols); List listConstraints = getListConstraints(); - System.out.println("Now that we have the size of our sudoku, would you rather have a single grid ('one', default), " + + System.out.println("Now that we have the size of our sudoku, " + + "would you rather have a single grid ('one', default), " + "or a a multidoku composed of 5 subgrids ('multi') ?"); MultiDoku doku; if (reader.next().equalsIgnoreCase("multi")) { @@ -47,11 +55,11 @@ public class ConsoleInterface { else { doku = SudokuFactory.createBasicEmptyRectangleDoku(width, height, listConstraints); } - RenderableMultidoku rm = RenderableMultidoku.fromMultidoku(doku); System.out.println("Your sudoku will look like this:"); - SudokuPrinter.printMultiDoku(rm, listSymbols, width, height); + showMultidoku(doku, listSymbols, width, height); System.out.println("We now will fill this sudoku."); - System.out.println("What level of difficulty would you like? ('very easy', 'easy', 'medium' (default), 'hard', 'full' (sudoku fully completed))"); + System.out.println("What level of difficulty would you like?" + + " ('very easy', 'easy', 'medium' (default), 'hard', 'full' (sudoku fully completed))"); String difficulty = reader.next().toLowerCase(); if (difficulty.equals("full")) { generateFullDoku(doku); @@ -60,7 +68,21 @@ public class ConsoleInterface { generatePartialDoku(doku, difficulty); } System.out.println("Here's your sudoku !"); - SudokuPrinter.printMultiDoku(rm, listSymbols, width, height); + showMultidoku(doku, listSymbols, width, height); + } + + private MultiDoku saveChoice() { + int nbSave; + MultiDoku md = null; + do { + nbSave = reader.nextInt(); + try { + md = SudokuSerializer.getSavedMultiDoku(nbSave); + } catch (Exception e) { + System.out.println("There seems to be a problem with this save, please try again."); + } + } while (md == null); + return md; } public int getBlockWidth() { @@ -91,18 +113,30 @@ public class ConsoleInterface { return (size > 0); } - private void pickSymbols(List listSymbols, int numberOfSymbols) { - System.out.println("You have chosen to pick your own symbols."); - for (int i = 0; i < numberOfSymbols; i++) { - System.out.println("Choose for the symbol number " + i + ": "); - String newSymbol = reader.next(); - while (listSymbols.contains(newSymbol)) { - System.out.println("This symbol has already been given. Try again:"); - newSymbol = reader.next(); + private List pickSymbols(int numberOfSymbols) { + System.out.println("Would you like to pick the " + numberOfSymbols + " symbols from the sudoku? (y/n, default 'no' will use numbers)"); + if (reader.next().equalsIgnoreCase("y")) { + List listSymbols = new ArrayList<>(); + System.out.println("You have chosen to pick your own symbols."); + for (int i = 0; i < numberOfSymbols; i++) { + System.out.println("Choose for the symbol number " + i + ": "); + String newSymbol = reader.next(); + while (listSymbols.contains(newSymbol)) { + System.out.println("This symbol has already been given. Try again:"); + newSymbol = reader.next(); + } + listSymbols.add(newSymbol); } - listSymbols.add(newSymbol); + System.out.println("You chose the symbols: " + listSymbols.toString()); + return listSymbols; + } else { + System.out.println("What existing sets of symbols do you want to use? Numbers ('n', default), letters ('l'), or emojis ('e')?"); + return switch (reader.next().toLowerCase()) { + case "l" -> Symbols.Letters.getSymbols(); + case "e" -> Symbols.Emojis.getSymbols(); + default -> Symbols.Numbers.getSymbols(); + }; } - System.out.println("You chose the symbols: " + listSymbols.toString()); } private List getListConstraints() { @@ -133,4 +167,12 @@ public class ConsoleInterface { new RandomSolver().solve(doku); } + private void showMultidoku(MultiDoku doku, List listSymbols, int width, int height){ + showMultiDoku(RenderableMultidoku.fromMultidoku(doku), listSymbols, width, height); + } + + private void showMultiDoku(RenderableMultidoku doku, List listSymbols, int width, int height){ + SudokuPrinter.printMultiDoku(doku, listSymbols, width, height); + } + }