Fehler bei Rekursion ???



  • Hallo zusammen.

    Mit dem folgenden Listing sollen sämtliche Lösungen für das Spiel Solitaer rekursiv berechnet werden. Es gibt vielleicht noch einige Fehler in dem Code aber die Frage wegen der ich hier poste ist folgende. Beim Ausführen des Programms bekommen ich nach ein paar Sekunden eine Meldung die heißt :
    "Fatal exception occured. Program will exit".

    Hier mal der Quellcode. Vielleicht fällt dem einen oder anderen ja was auf ?

    class Solitaer {
    	private boolean[][] playfield = new boolean[7][7];
    	final int MOVE_DOWN = 0;
    	final int MOVE_LEFT = 1;
    	final int MOVE_UP = 2;
    	final int MOVE_RIGHT = 3;
    	final int NO_MOVE_POSSIBLE = 4;
    	final int SOLUTION = 5;
    	public int level = 0;
    
    	public Solitaer() {
    		initiatePlayfield(this.playfield);
    		move(this.playfield);
    	}
    
    	public void initiatePlayfield(boolean[][] playfield){
    		int help=0;
    		try {	
    			for(int i=0;i<=6;i++) {
    				help = i;
    				playfield[i][2] = true;
    				playfield[i][3] = true;
    				playfield[i][4] = true;
    			}
    			for(int i=2;i<=4;i++) {
    				help = i;
    				playfield[i][0] = true;
    				playfield[i][1] = true;
    				playfield[i][5] = true;
    				playfield[i][6] = true;
    			}
    			for(int i=0;i<=1;i++) {
    				help = i;
    				playfield[i][0] = false;
    				playfield[i][1] = false;
    				playfield[i][5] = false;
    				playfield[i][6] = false;
    			}
    			for(int i=5;i<=6;i++) {
    				help = i;
    				playfield[i][0] = false;
    				playfield[i][1] = false;
    				playfield[i][5] = false;
    				playfield[i][6] = false;
    			}
    			playfield[3][3] = false;
    			printPlayfield(playfield);
    			this.playfield = playfield;
    		}
    		catch (ArrayIndexOutOfBoundsException e) {
    			System.out.println("Der Index liegt bei "+help);
    		}
    	}
    
    	public void move(boolean[][] playfield) {
    		System.out.println("Rekursionsebene "+ level + " wird betreten");
    		level++;
    		for(int x=0;x<=6;x++) {
    			for(int y=0;y<=6;y++) {
    				// move here
    				if (checkMove(playfield,x,y)==MOVE_DOWN) {
    					System.out.println("MOVE_DOWN wird betreten");
    					playfield[y][x]=false;
    					playfield[y+1][x]=false;
    					playfield[y+1][x]=true;
    					move(playfield);
    				}
    				else if (checkMove(playfield,x,y)==MOVE_LEFT) {
    					System.out.println("MOVE_LEFT wird betreten");
    					playfield[y][x]=false;
    					playfield[y][x-1]=false;
    					playfield[y][x-2]=true;
    					move(playfield);
    				}
    				else if (checkMove(playfield,x,y)==MOVE_UP) {
    					System.out.println("MOVE_UP wird betreten");
    					playfield[y][x]=false;
    					playfield[y-1][x]=false;
    					playfield[y-1][x]=true;
    					move(playfield);
    				}
    				else if (checkMove(playfield,x,y)==MOVE_RIGHT) {
    					System.out.println("MOVE_RIGHT wird betreten bei Spielstein x="+x+" und y="+y);
    					playfield[y][x]=false;
    					printPlayfield(playfield);
    					playfield[y][x+1]=false;
    					printPlayfield(playfield);
    					playfield[y][x+2]=true;
    					printPlayfield(playfield);
    					move(playfield);
    				}
    				else if (checkMove(playfield,x,y)==SOLUTION) {
    					System.out.println("Lösung gefunden");
    				}
    			}
    		}
    	}
    
    	public int checkMove(boolean[][] playfield,int xPos, int yPos) {
    		// move down
    		if ((yPos<=4) && (xPos>=2) && (xPos<=4) && (playfield[xPos][yPos+1]==true)) {
    			if (playfield[xPos][yPos+2]==false) {
    				return MOVE_DOWN;
    			}
    		}
    		// move left
    		if ((xPos>=2) && (yPos>=2) && (yPos<=4) && (playfield[xPos-1][yPos]==true)) {
    			if (playfield[xPos-2][yPos]==false) {
    				return MOVE_LEFT;	
    			}
    		}
    		// move up
    		if ((yPos>=2) && (xPos>=2) && (xPos<=4) && (playfield[xPos][yPos-1]==true)) {
    			if (playfield[xPos][yPos-2]==false) {
    				return MOVE_UP;
    			}
    		}
    		//move right
    		if ((xPos<=4) && (yPos>=2) && (yPos<=4) && (playfield[xPos+1][yPos]==true)) {
    			if (playfield[xPos+2][yPos]==false) {
    				return MOVE_RIGHT;
    			}
    		}
    		if (isSolution(playfield)) {
    			return SOLUTION;
    		}
    		return NO_MOVE_POSSIBLE;
    	}
    
    	public boolean isSolution(boolean[][] playfield) {
    		for(int i=0;i<=6;i++) {
    			for(int j=0;j<=6;j++) {
    				if ((i==3) && (j==3)) {
    					if (playfield[i][j]==false) {
    						return false;
    					}
    				}
    				else {
    					if (playfield[i][j]==true) {
    						return false;
    					}
    				}
    			}
    		}
    		return true;
    	}
    
    	public void printPlayfield(boolean[][] playfield) {
    		for(int x=0;x<=6;x++) {
    			for(int y=0;y<=6;y++) {
    				if (playfield[x][y]==true) {
    					System.out.print("X");
    				}
    				else {
    					System.out.print("O");
    				}
    			}
    			System.out.println();
    		}
    	}
    }
    

    In der main wird lediglich ein Solitaer s = new Solitaer(); gemacht


Anmelden zum Antworten