Program wchodzi w pętlę choć nie powinien...

0

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-91.jpg2.jpg

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?1.jpg

2

Tego się nie da czytać, sorry Winnetou

Najbardziej zniechęca pseudo-obiektowe programowanie, final FOUR = 8 ...
Znaczy, widziałeś przez ramię porządny kod, ale próba skopiowania wzorców np nazewniczych jest zupełnie d/d

Debugger w ręce, ustaw breakpoint, zobacz zmienne
Nikt tego za ciebie nie zrobi

0

@Stój Halina: Już wiem, w czym był problem... :P Nawet w żadnej z tych klas co podałem.

0

Czy umiesz używać debuggera?

1 użytkowników online, w tym zalogowanych: 0, gości: 1