0

いくつかの種類のペグ ソリティアを解決するソフトウェアを開発し、それを解決するための手順を [3,3,"^"],[4,5,"<"] のように出力します。何度も(常にではありません)、「元の」ボード、フランスのボード、および5x6の別のボードで作業していますが、そのように見える新しいボードを解決しようとすると:

   XXXXXXXXX
   XXXXXXXXX
   XX     XX
   XX     XX
   XXXXXXXXX
   XXXXXXXXX

プログラムは答えを見つけることができません。いくつかの基本的なボードとこの作業を試してみましたが、3 つまたは 4 つの手順の後、プログラムはパスを見つけることができません。コードをデバッグしようとしましたが、パスが見つからない理由がわかりません

私のペグソルバー:

package com.company;


public class PegSolver {
    public int peg=0;
    String answer[];
    public boolean superLevel=false;
    public void start(){

        boolean makefrance=false;
        boolean lastLevel = false;

        //france
        String end,start;
        //the starting board
        start="OOOOOOOOO\", \"OOOOOOOOO\", \"OO     OO\", \"OO     O.\", \"OO     OO\", \"OOOOOOOOO\", \"OOOOOOOOO\"";
        //the wanted board
        end = "  OOOOOOOOO\", \"OOOOOOOO.\", \"OO     OO\", \"OO     O.\", \"OO     OO\", \"OOOOOOOO.\", \"OOOOOOOO.\"]  ";

        //clean the Strings, let only 'O' or '.'
        start = removeUnwanted(start);
        end = removeUnwanted(end);
        //adapt the board to normal, france, or other by the number of char in the string after remove the unwanted chars
        if(start.length()==33)
        {
            makefrance=false;
            lastLevel=false;
        }
        else if(start.length()==37)
        {
            makefrance = true;
            lastLevel = false;
        }
        else if(start.length()==30){
            makefrance=false;
            lastLevel=true;
        }
        else if(start.length()==48){
            superLevel=true;
        }

        int startDots=0;
        int endDots=0;
        Board board;
        Board destinationBoard;
        if(lastLevel)
        {
            board = new Board(start,true,true,superLevel);//The start of my board
            destinationBoard = new Board(end,true,true,superLevel);//the wanted destination board, '.' for no peg and O for peg.
        }
        else{
            board = new Board(start,makefrance,lastLevel,superLevel);//The start of my board
            destinationBoard = new Board(end,makefrance,lastLevel,superLevel);//the wanted destination board, '.' for no peg and O for peg.
        }


        //count the pegs from the begining and ending board
        for(int i=0;i<start.length()-1;i++) {
            if (start.charAt(i) == '.') {
                startDots++;
            }
        }
        for(int i=0;i<end.length()-1;i++) {
            if (end.charAt(i) == '.') {
                endDots++;
            }
        }
        //calculate the number of turns to the destination, every turn only one peg is disapear so finally there is:
        //pegs at the end - pegs at the begining = number of turns
        peg=endDots-startDots;
        //create a string for save the steps.
        answer = new String[peg];

        //if we have a result, return the answer and print a text
        if(Solve(board,destinationBoard,0))
        {
            System.out.println("The best day of my life");
            for(int i=0;i<answer.length;i++)
            {
                System.out.println(answer[i]);
            }

        }
        //if don't find path, print WTF
        else{
            System.out.println("WTFFFFF");
        }
    }
    //recurse method that solve the peg solitaire
    public boolean Solve(Board board, Board destination, int turn)
    {
        int rows=0;
        //if we are on the end of the game
        if(turn==peg)
        {
            //check if the current board is like the destination board.
            if(board.isFinished(destination))
            {
                System.out.println("found the path");
                return true;//this board is the same as the desitnation
            }
            else
            {
                return false;//this board is not the same as the desitnation
            }
        }
        else {

            if (superLevel)//if its a bigger board, need to check the board on more rows and lines
            {
                rows=9;
            }
            else{
                rows=7;
            }
            for(int i=0;i<rows;i++){
                for(int j=0;j<rows;j++)
                {
                    if(board.isLegal(j,i))
                    {
                        if(board.canTurn(j,i,"right"))//test if it's possible to turn right
                        {
                            if(Solve(board.turn(board,j,i,"right"),destination,turn+1))//create a new board after changment of direction and recurse
                            {
                                answer[turn]= "["+j+","+i+",\">\"],";//add this step to the answer
                                return true;
                            }
                        }
                        if(board.canTurn(j,i,"up"))//test if it's possible to turn up
                        {
                            if(Solve(board.turn(board,j,i,"up"),destination,turn+1))//create a new board after changment of direction and recurse
                            {
                                answer[turn]= "["+j+","+i+",\"^\"],";//add this step to the answer
                                return true;
                            }
                        }

                        if(board.canTurn(j,i,"down"))//test if it's possible to turn down
                        {
                            if(Solve(board.turn(board,j,i,"down"),destination,turn+1))//create a new board after changment of direction and recurse
                            {
                                answer[turn]= "["+j+","+i+",\"v\"],";//add this step to the answer
                                return true;
                            }
                        }
                        if(board.canTurn(j,i,"left"))//test if it's possible to turn left
                        {
                            if(Solve(board.turn(board,j,i,"left"),destination,turn+1))//create a new board after changment of direction and recurse
                            {
                                answer[turn]= "["+j+","+i+",\"<\"],";//add this step to the answer
                                return true;
                            }
                        }
                    }
                }
            }
            return false;//if don't find any path return.
        }

    }
    public String removeUnwanted(String boardText)
    {
        String returnBoard="";
        for(int i=0; i<boardText.length();i++)
        {
            if(boardText.charAt(i) == '.' || boardText.charAt(i)== 'O')//remove all the char that are not '.' or 'O'
            {
                returnBoard += boardText.charAt(i);
            }
        }
        System.out.println(returnBoard);
        return returnBoard;
    }
}

そして私のボードクラス:

   package com.company;

   import java.security.PublicKey;

   public class Board {
    //the array that storage the board data
    private int[][] board = new int[9][9];;
    public boolean superLvl=false;
    int pegs = 0;

    public Board(String place, boolean makefrance,boolean lastLevel,boolean superlevel) {
        int boardx,boardy;
        //add 2 to make the board compatible to the string
        if(superlevel) {
            superLvl=true;
            boardx = 9;
            boardy = 9;
            int[][] temp = new int[][]{{0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0},{0,0,2,2,2,2,2,0,0},{0,0,2,2,2,2,2,0,0},{0,0,2,2,2,2,2,0,0},{0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0},{2,2,2,2,2,2,2,2,2},{2,2,2,2,2,2,2,2,2}};
            for(int i=0;i<9;i++)
            {
                for(int j=0;j<9;j++)
                {
                    board[j][i]=temp[i][j];
                }
            }
        }
        else {

            if (!lastLevel) {
                boardx = 7;
                boardy = 7;
                board[0][0] = 2;
                board[1][0] = 2;
                board[5][0] = 2;
                board[6][0] = 2;
                board[0][1] = 2;
                board[1][1] = 2;
                board[5][1] = 2;
                board[6][1] = 2;
                board[0][5] = 2;
                board[1][5] = 2;
                board[5][5] = 2;
                board[6][5] = 2;
                board[0][6] = 2;
                board[1][6] = 2;
                board[5][6] = 2;
                board[6][6] = 2;
                if (makefrance) {
                    board[1][1] = 1;
                    board[1][5] = 1;
                    board[5][1] = 1;
                    board[5][5] = 1;
                }
            } else {
                boardx = 6;
                boardy = 6;
                board[0][6] = 2;
                board[1][6] = 2;
                board[2][6] = 2;
                board[3][6] = 2;
                board[4][6] = 2;
                board[5][6] = 2;
                board[6][6] = 2;
                board[0][5] = 2;
                board[1][5] = 2;
                board[2][5] = 2;
                board[3][5] = 2;
                board[4][5] = 2;
                board[5][5] = 2;
                board[6][5] = 2;
                board[6][0] = 2;
                board[6][1] = 2;
                board[6][2] = 2;
                board[6][3] = 2;
                board[6][4] = 2;
            }
        }





        int loca = 0;//location on the string of place
        //add 0 or 1 to the table
        for (int i = 0; i < boardy; i++) {
            for (int j = 0; j < boardx; j++) {
                if (board[j][i] != 2) {
                    if (place.charAt(loca) == 'O') {
                        loca++;
                        board[j][i] = 1;
                        pegs++;
                    } else if (place.charAt(loca) == '.') {
                        loca++;
                        board[j][i] = 0;
                    }
                }
            }
        }

        System.out.println();
        this.printBoard();

    }
    public Board(Board newone)
    {
        int placement=7;
        if(superLvl)
        {
            placement=9;
        }
        for(int i=0;i<placement;i++)
        {
            for(int j=0;j<placement;j++)
            {
                board[i][j]= newone.getValue(i,j);
            }
        }

    }

    //test if this board is like the other board at the end of the game
    public boolean isFinished(Board destination) {
        int placement=7;
        if(superLvl)
        {
            placement=9;
        }
        for (int i = 0; i < placement; i++) {
            for (int j = 0; j < placement; j++) {
                if (this.getValue(j,i)!=destination.getValue(j,i))
                {
                    return false;
                }
            }
        }
        return true;
    }
    //get the value of this coordinate.
    public int getValue(int x, int y)
    {
        return board[x][y];
    }
    //test if this cooardiante is a place on the board(not 2)
    public boolean isLegal(int x,int y)
    {
        if(board[x][y]!=2)
        {
            return true;
        }
        else{
            return false;
        }
    }
    //test if can turn- if this place is 1 and the next is 1 and the second next is 0
    //also protect from stack overflow
    public boolean canTurn(int x,int y,String direction)
    {
        if(direction.equals("right"))
        {
            if(x<5){

                if(this.getValue(x,y)==1 && this.getValue(x+1,y)==1 && this.getValue(x+2,y)==0)
                {
                    return true;
                }
                else {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
        else if(direction.equals("left"))
        {
            if(x>1){
                if(this.getValue(x,y)==1 && this.getValue(x-1,y)==1 && this.getValue(x-2,y)==0)
                {
                    return true;
                }
                else {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
        else if(direction.equals("up"))
        {
            if(y>1){

                if(this.getValue(x,y)==1 && this.getValue(x,y-1)==1 && this.getValue(x,y-2)==0)
                {
                    return true;
                }
                else {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
        else if(direction.equals("down"))
        {
            if(y<5){
                if(this.getValue(x,y)==1 && this.getValue(x,y+1)==1 && this.getValue(x,y+2)==0)
                {
                    return true;
                }
                else {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
        else{
            System.out.println("method canTurn on board get a wrong direction string");
            return false;
        }
    }
    //make the move and return a "new" board for saving the originial one.
    public Board turn(Board oldBoard,int x, int y ,String direction)
    {
        Board board = new Board(oldBoard);
        if(direction.equals("right"))
        {
            board.setValue(x,y,0);
            board.setValue(x+1,y,0);
            board.setValue(x+2,y,1);
            return board;
        }
        else if(direction.equals("left"))
        {
            board.setValue(x,y,0);
            board.setValue(x-1,y,0);
            board.setValue(x-2,y,1);
            return board;
        }
        else if(direction.equals("up"))
        {
            board.setValue(x,y,0);
            board.setValue(x,y-1,0);
            board.setValue(x,y-2,1);
            return board;
        }
        else if(direction.equals("down"))
        {
            board.setValue(x,y,0);
            board.setValue(x,y+1,0);
            board.setValue(x,y+2,1);
            return board;
        }
        else{
            System.out.println("method Turn on board get a wrong direction string");
            return null;
        }
    }
    //change the value of the wanted board.
    public void setValue(int x,int y,int value)
    {
        board[x][y]=value;
    }
    //print the board, made for tests.
    public void printBoard()
    {
        int placement=7;
        if(superLvl)
        {
            placement=9;
        }
        for(int i=0;i<placement;i++)
        {
            for(int j=0;j<placement;j++)
            {
                System.err.print(board[j][i]);
            }
            System.err.println();
        }
        System.err.println("------------------");
    }
    }
4

0 に答える 0