Cześć mam kolejny problem z tym nieszczęsnym sudoku... Po wpisaniu np. liczby 2 na pozycji 2x2 program dodaje liczbę do tablicy i od razu wchodzi w pętlę w którą nie powinien wchodzić. Żeby było śmieszniej w innym moim sudoku, gdzie zastosowałem takie samo rozwiązanie tak się nie dzieje, program wchodzi w pętlę dopiero gdy wpisze się liczbę inną niż 1-9
Poniżej przesyłam kod obu gier:
Tutaj się pętle nie uruchamia gdy nie trzeba:
import java.util.Random;
public class GameEngine {
private static final ElementsList elementsList = new ElementsList();
private static final CheckSquares checkSquares = new CheckSquares();
private static final CheckRows checkRows = new CheckRows();
private static final CheckColumns checkColumns = new CheckColumns();
private static final Solver solver = new Solver();
private static final Random random = new Random();
private static final Board board = new Board();
private static final Menu menu = new Menu();
private static final Player player = new Player();
private static final String[] initialElements = {" 1 ", " 2 ", " 3 ", " 4 ", " 5 ", " 6 ", " 7 ", " 8 ", " 9 "};
private static final int INITIAL_MAX_ELEMENTS = 10;
private static final int ZERO_POS = 0;
private static final int FOUR_POS = 4;
private static final int EIGHT_POS = 8;
private boolean gameRun = true;
private String playerMove;
private int xPos;
private int yPos;
public void gameLoop() {
menu.welcome();
for (int i = 0; i < INITIAL_MAX_ELEMENTS; i++) {
xPos = random.nextInt(board.newBoard().length);
yPos = random.nextInt(board.newBoard().length);
while (xPos == ZERO_POS || yPos == ZERO_POS || xPos == FOUR_POS
|| yPos == FOUR_POS || xPos == EIGHT_POS || yPos == EIGHT_POS) {
xPos = random.nextInt(board.newBoard().length);
yPos = random.nextInt(board.newBoard().length);
}
int randomElementNumber = random.nextInt(initialElements.length);
playerMove = "";
board.newBoard()[yPos][xPos] = playerMove + initialElements[randomElementNumber];
collections(xPos, yPos, playerMove);
}
board.drawBoard(board.newBoard());
while (gameRun) {
menu.addElement();
playerMove = player.playerMove();
///Chodzi o tę pętle tu się nie uruchamia gdy liczba jest od 1 do 9 lub się wpisze słowo SUDOKU lub FINISH
while (!elementsList.elements().contains(playerMove)) {
menu.unrecognizedElement();
playerMove = player.playerMove();
}
if (playerMove.equals(SudokuElements.SUDOKU_SOLVE.getElement())) {
gameRun = false;
solver.sudokuSolve();
menu.failure();
} else if (playerMove.equals(SudokuElements.FINISH.getElement())) {
if (checkSquares.checkSquare()
&& checkRows.checkAllRows()
&& checkColumns.checkAllColumns()) {
menu.congratulations();
gameRun = false;
} else {
menu.mistake();
}
} else {
menu.addXNumberPosition();
xPos = player.playerXPosition();
menu.addYNumberPosition();
yPos = player.playerYPosition();
while (!elementsList.numbers().contains(xPos) || !elementsList.numbers().contains(yPos)) {
menu.unrecognizedNumber();
menu.addXNumberPosition();
xPos = player.playerXPosition();
menu.addYNumberPosition();
yPos = player.playerYPosition();
}
collections(xPos, yPos, playerMove);
board.drawBoard(board.addElementBoard(xPos, yPos, playerMove));
}
}
}
private void collections(int xPos, int yPos, String playerMove) {
checkSquares.addElementToSquareOne(xPos, yPos, playerMove);
checkSquares.addElementToSquareTwo(xPos, yPos, playerMove);
checkSquares.addElementToSquareThree(xPos, yPos, playerMove);
checkSquares.addElementToSquareFour(xPos, yPos, playerMove);
checkSquares.addElementToSquareFive(xPos, yPos, playerMove);
checkSquares.addElementToSquareSix(xPos, yPos, playerMove);
checkSquares.addElementToSquareSeven(xPos, yPos, playerMove);
checkSquares.addElementToSquareEight(xPos, yPos, playerMove);
checkSquares.addElementToSquareNine(xPos, yPos, playerMove);
checkRows.addElementToRowOne(xPos, yPos, playerMove);
checkRows.addElementToRowTwo(xPos, yPos, playerMove);
checkRows.addElementToRowThree(xPos, yPos, playerMove);
checkRows.addElementToRowFour(xPos, yPos, playerMove);
checkRows.addElementToRowFive(xPos, yPos, playerMove);
checkRows.addElementToRowSix(xPos, yPos, playerMove);
checkRows.addElementToRowSeven(xPos, yPos, playerMove);
checkRows.addElementToRowEight(xPos, yPos, playerMove);
checkRows.addElementToRowNine(xPos, yPos, playerMove);
checkColumns.addElementToColumnOne(xPos, yPos, playerMove);
checkColumns.addElementToColumnTwo(xPos, yPos, playerMove);
checkColumns.addElementToColumnThree(xPos, yPos, playerMove);
checkColumns.addElementToColumnFour(xPos, yPos, playerMove);
checkColumns.addElementToColumnFive(xPos, yPos, playerMove);
checkColumns.addElementToColumnSix(xPos, yPos, playerMove);
checkColumns.addElementToColumnSeven(xPos, yPos, playerMove);
checkColumns.addElementToColumnEight(xPos, yPos, playerMove);
checkColumns.addElementToColumnNine(xPos, yPos, playerMove);
}
}
Kod listy:
import java.util.ArrayList;
import java.util.List;
public class ElementsList {
private static final List<String> gameElements = new ArrayList<>();
private static final List<Integer> gameNumbers = new ArrayList<>();
public List<String> elements() {
gameElements.add(SudokuElements.ONE.getElement());
gameElements.add(SudokuElements.TWO.getElement());
gameElements.add(SudokuElements.THREE.getElement());
gameElements.add(SudokuElements.FOUR.getElement());
gameElements.add(SudokuElements.FIVE.getElement());
gameElements.add(SudokuElements.SIX.getElement());
gameElements.add(SudokuElements.SEVEN.getElement());
gameElements.add(SudokuElements.EIGHT.getElement());
gameElements.add(SudokuElements.NINE.getElement());
gameElements.add(SudokuElements.SUDOKU_SOLVE.getElement());
gameElements.add(SudokuElements.FINISH.getElement());
return gameElements;
}
public List<Integer> numbers() {
gameNumbers.add(NumberPosition.ONE.getElement());
gameNumbers.add(NumberPosition.TWO.getElement());
gameNumbers.add(NumberPosition.THREE.getElement());
gameNumbers.add(NumberPosition.FOUR.getElement());
gameNumbers.add(NumberPosition.FIVE.getElement());
gameNumbers.add(NumberPosition.SIX.getElement());
gameNumbers.add(NumberPosition.SEVEN.getElement());
gameNumbers.add(NumberPosition.EIGHT.getElement());
gameNumbers.add(NumberPosition.NINE.getElement());
return gameNumbers;
}
}
I tutaj kod w którym pętla się uruchamia:
public class Engine {
private static final Menu menu = new Menu();
private static final Board board = new Board();
private static final Player player = new Player();
private static final Solver solver = new Solver();
private static final SudokuElementsList sudokuElementsList = new SudokuElementsList();
private static final CheckSquares checkSquares = new CheckSquares();
private static final CheckColumns checkColumns = new CheckColumns();
private static final CheckRows checkRows = new CheckRows();
private static final SudokuReader sudokuReader = new SudokuReader();
private boolean gameRun = true;
private String playerMove;
private String sudokuBoardName;
private int number;
private int xPos;
private int yPos;
public void gameLoop() {
menu.welcome();
menu.addFile();
sudokuBoardName = player.playerMove();
sudokuReader.readFile(sudokuBoardName);
sudokuReader.boardConverter();
sudokuReader.print();
while (gameRun) {
menu.addElement();
playerMove = player.playerMove();
while (!sudokuElementsList.stringElements().contains(playerMove)) {
System.err.println("WYkonuje pętle while");
menu.unrecognizedElement();
playerMove = player.playerMove();
}
if (playerMove.equals(SudokuChoice.SUDOKU.getChoice())) {
gameRun = false;
if (solver.solveBoard(sudokuReader.boardConverter())) {
menu.failure();
board.drawBoard(sudokuReader.getBoard());
}
} else if (playerMove.equals(SudokuChoice.FINISH.getChoice())) {
collections(sudokuReader.getBoard());
if (checkSquares.checkSquare()
&& checkRows.checkAllRows()
&& checkColumns.checkAllColumns()) {
menu.congratulations();
gameRun = false;
} else {
menu.mistake();
collectionsCleaner(sudokuReader.getBoard());
}
} else {
int number = Integer.parseInt(playerMove);
menu.addXNumberPosition();
xPos = player.playerXPosition();
menu.addYNumberPosition();
yPos = player.playerYPosition();
while (!sudokuElementsList.numbers().contains(xPos) || !sudokuElementsList.numbers().contains(yPos)) {
menu.unrecognizedNumber();
menu.addXNumberPosition();
xPos = player.playerXPosition();
menu.addYNumberPosition();
yPos = player.playerYPosition();
}
board.drawBoard(sudokuReader.addElementBoard(xPos, yPos, number));
}
}
/*
menu.welcome();
menu.addFile();
sudokuBoardName = player.playerMove();
sudokuReader.readFile(sudokuBoardName);
sudokuReader.boardConverter();
sudokuReader.print();
while (gameRun) {
menu.addElement();
playerMove = player.playerMove();
while (!sudokuElementsList.stringElements().contains(playerMove)) {
menu.unrecognizedElement();
playerMove = player.playerMove();
}
if (playerMove.equals(SudokuChoice.SUDOKU.getChoice())) {
gameRun = false;
if (solver.solveBoard(sudokuReader.boardConverter())) {
menu.failure();
board.drawBoard(sudokuReader.getBoard());
} else { menu.unsolvable();
}
} else if (playerMove.equals(SudokuChoice.FINISH.getChoice())) {
collections(sudokuReader.getBoard());
if (checkSquares.checkSquare()
&& checkRows.checkAllRows()
&& checkColumns.checkAllColumns()) {
menu.congratulations();
gameRun = false;
} else {
collectionsCleaner(sudokuReader.getBoard());
menu.mistake();
}
} else {
number = Integer.parseInt(playerMove);
menu.addXNumberPosition();
xPos = player.playerXPosition();
menu.addYNumberPosition();
yPos = player.playerYPosition();
while (!sudokuElementsList.numbers().contains(xPos)
|| !sudokuElementsList.numbers().contains(yPos)) {
menu.unrecognizedNumber();
menu.addXNumberPosition();
xPos = player.playerXPosition();
menu.addYNumberPosition();
yPos = player.playerYPosition();
}
board.drawBoard(sudokuReader.addElementBoard(xPos, yPos, number));
}
}
*/
}
private void collections(int[][] board) {
checkSquares.addElementToSquareOneSet(board);
checkSquares.addElementToSquareTwoSet(board);
checkSquares.addElementToSquareThreeSet(board);
checkSquares.addElementToSquareFourSet(board);
checkSquares.addElementToSquareFiveSet(board);
checkSquares.addElementToSquareSixSet(board);
checkSquares.addElementToSquareSevenSet(board);
checkSquares.addElementToSquareEightSet(board);
checkSquares.addElementToSquareNineSet(board);
checkRows.addElementToRowOneSet(board);
checkRows.addElementToRowTwoSet(board);
checkRows.addElementToRowThreeSet(board);
checkRows.addElementToRowFourSet(board);
checkRows.addElementToRowFiveSet(board);
checkRows.addElementToRowSixSet(board);
checkRows.addElementToRowSevenSet(board);
checkRows.addElementToRowEightSet(board);
checkRows.addElementToRowNineSet(board);
checkColumns.addElementToColumnOneSet(board);
checkColumns.addElementToColumnTwoSet(board);
checkColumns.addElementToColumnThreeSet(board);
checkColumns.addElementToColumnFourSet(board);
checkColumns.addElementToColumnFiveSet(board);
checkColumns.addElementToColumnSixSet(board);
checkColumns.addElementToColumnSevenSet(board);
checkColumns.addElementToColumnEightSet(board);
checkColumns.addElementToColumnNineSet(board);
}
private void collectionsCleaner(int[][] board) {
checkSquares.addElementToSquareOneSet(board).clear();
checkSquares.addElementToSquareTwoSet(board).clear();
checkSquares.addElementToSquareThreeSet(board).clear();
checkSquares.addElementToSquareFourSet(board).clear();
checkSquares.addElementToSquareFiveSet(board).clear();
checkSquares.addElementToSquareSixSet(board).clear();
checkSquares.addElementToSquareSevenSet(board).clear();
checkSquares.addElementToSquareEightSet(board).clear();
checkSquares.addElementToSquareNineSet(board).clear();
checkRows.addElementToRowOneSet(board).clear();
checkRows.addElementToRowTwoSet(board).clear();
checkRows.addElementToRowThreeSet(board).clear();
checkRows.addElementToRowFourSet(board).clear();
checkRows.addElementToRowFiveSet(board).clear();
checkRows.addElementToRowSixSet(board).clear();
checkRows.addElementToRowSevenSet(board).clear();
checkRows.addElementToRowEightSet(board).clear();
checkRows.addElementToRowNineSet(board).clear();
checkColumns.addElementToColumnOneSet(board).clear();
checkColumns.addElementToColumnTwoSet(board).clear();
checkColumns.addElementToColumnThreeSet(board).clear();
checkColumns.addElementToColumnFourSet(board).clear();
checkColumns.addElementToColumnFiveSet(board).clear();
checkColumns.addElementToColumnSixSet(board).clear();
checkColumns.addElementToColumnSevenSet(board).clear();
checkColumns.addElementToColumnEightSet(board).clear();
checkColumns.addElementToColumnNineSet(board).clear();
}
}
Kdd listy drugiego sudoku:
import java.util.ArrayList;
import java.util.List;
public class SudokuElementsList {
private static final List<Integer> gameNumbers = new ArrayList<>();
private static final List<String> gameStringElements = new ArrayList<>();
public List<Integer> numbers() {
gameNumbers.add(ElementPosition.ZERO.getElement());
gameNumbers.add(ElementPosition.ONE.getElement());
gameNumbers.add(ElementPosition.TWO.getElement());
gameNumbers.add(ElementPosition.THREE.getElement());
gameNumbers.add(ElementPosition.FOUR.getElement());
gameNumbers.add(ElementPosition.FIVE.getElement());
gameNumbers.add(ElementPosition.SIX.getElement());
gameNumbers.add(ElementPosition.SEVEN.getElement());
gameNumbers.add(ElementPosition.EIGHT.getElement());
gameNumbers.add(ElementPosition.NINE.getElement());
return gameNumbers;
}
public List<String> stringElements() {
gameStringElements.add(SudokuStringElement.ONE.getStringElement());
gameStringElements.add(SudokuStringElement.TWO.getStringElement());
gameStringElements.add(SudokuStringElement.THREE.getStringElement());
gameStringElements.add(SudokuStringElement.FOUR.getStringElement());
gameStringElements.add(SudokuStringElement.FIVE.getStringElement());
gameStringElements.add(SudokuStringElement.SIX.getStringElement());
gameStringElements.add(SudokuStringElement.SEVEN.getStringElement());
gameStringElements.add(SudokuStringElement.EIGHT.getStringElement());
gameStringElements.add(SudokuStringElement.NINE.getStringElement());
gameStringElements.add(SudokuChoice.FINISH.getChoice());
gameStringElements.add(SudokuChoice.SUDOKU.getChoice());
return gameStringElements;
}
}
Ktoś z was widzi błąd?
p_agon