Finden mehrerer Lösungen

cookiiee

Mitglied
Hi, ich versuche das Brettspiel Peg zu programmieren. Mein Ziel besteht darin das ich für ein Spielfeld alle möglichen Lösungen berechnen möchte. Mein aktuelles Problem ist das das Programm nach dem Berechnen der 1. Lösung beim Versuch eine zweite Lösung keine Lösung mehr findet.
Java:
import java.awt.*;


import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;


import javax.swing.*;


public class Kreuzfeld2 {

    static int[] feld = new int[49];
    public static    ArrayList<Zug> züge = new ArrayList<Zug>();
    public static int[][] loesung = new int    [33][49];
    public static int[][] zeichne = new int [33][49];
    public static int GemachteZüge = -1;
    public static int zeichnen2 = 0;
    public int AnzahlLoesungen = 0;
    public int a = 0;
    HashMap<Integer,int[][]> loesungen = new HashMap<Integer,int[][]>();
   
   
    public  class Zug implements Comparable<Zug> {
        int x;   
        int y;
        int z;
       

        public  Zug(int x, int y, int z) {
            super();
            this.x = x;
            this.y = y;
            this.z = z;
        }

        @Override
        public int compareTo(Zug z) {
            return (z.x - x) * 100 + (z.y - y);
        }

    }
    public static void main(String[] args) {
       
        new Kreuzfeld2();
       
    }
   

    public  Kreuzfeld2() {
       
        feldInit();
        gueltigeZuege();
        Collections.sort(züge);
        zeichnefeld(feld);
        System.arraycopy(feld, 0, loesung[0], 0, feld.length);
        loese(steinAnzahlBestimmen());
       
    }

    private int steinAnzahlBestimmen() {
        int s = 0;
        for (int i = 0; i < 49; i++) {
           
            if (feld[i] == 1) s++;
        }
        return s;
    }

    public void gueltigeZuege() {
        int[] nachuntenlist = { 2, 3, 4, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 23, 24, 25, 30, 31, 32 };
        int[] nachrechtslist = { 2, 9, 14, 15, 16, 17, 18, 21, 22, 23, 24, 25, 28, 29, 30, 31, 32, 37, 44 };
        int[] nachobenlist = { 16, 17, 18, 23, 24, 25, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 44, 45, 46 };
        int[] nachlinkslist = { 4, 11, 16, 17, 18, 19, 20, 23, 24, 25, 26, 27, 30, 31, 32, 33, 34, 39, 46 };
        int[] nachuntenlinkslist = { 3, 4, 9, 10, 11, 16, 17, 18, 19, 20, 25, 26, 27, 32, 33};
        int[] nachobenrechtslist = {15, 16, 21, 22, 23, 28, 29, 30, 31, 32, 37, 38, 39, 44, 45};
        int[] nachuntenrechtslist = {2, 3, 9, 10, 11, 14, 15, 16, 17, 18, 21, 22, 23, 29, 30};
        int[] nachobenlinkslist = {18, 19, 25, 26, 27, 30, 31, 32, 33, 34, 37, 38, 39, 45, 46};
        for(int i : nachobenlinkslist) {
            züge.add(new Zug(i, i - 8, i -16));
        }
        for (int i : nachuntenrechtslist) {
            züge.add(new Zug(i, i + 8, i + 16));
        }
        for (int i : nachuntenlinkslist) {
            züge.add(new Zug(i, i + 6, i + 12));
        }
        for (int i : nachobenrechtslist) {
            züge.add(new Zug(i, i - 6, i - 12));
        }
        for (int i : nachrechtslist) {
            züge.add(new Zug(i, i + 1, i + 2));
        }
        for (int i : nachlinkslist) {
            züge.add(new Zug(i, i - 1, i - 2));
        }
        for (int i : nachuntenlist) {
            züge.add(new Zug(i, i + 7, i + 14));
        }
        for (int i : nachobenlist) {
            züge.add(new Zug(i, i - 7, i - 14));
        }
       
    }

    private void loese(int steine)   {
        if (steine == 1){
           
            for (int i = 32; i > 1; i--) {
                if (GemachteZüge < 31) {
                    zeichnefeld(loesung[i]);
                   
                }
            }
           
            Schreiben();
        }   
       
       
        for (Zug zug : züge) {
            if (feld[zug.x] == 1 && feld[zug.y] == 1 && feld[zug.z] == 0)     {
                feld[zug.x] = 0;
                feld[zug.y] = 0;
                feld[zug.z] = 1;
                System.arraycopy(feld, 0, loesung[steine], 0, feld.length);
                loese(steine - 1);
                feld[zug.x] = 1;
                feld[zug.y] = 1;
                feld[zug.z] = 0;
           
            }   
        }   
       
    }
   


   
    private static void zeichnefeld(int[] f) {
       
       
        GemachteZüge++;
       
       
        System.out.println();
        for (int i = 0; i < 49; i++) {
            if (i % 7 == 0) System.out.println();
            System.out.print((f[i] == 1) ? "x" : (f[i] == 0 ? "o" : " "));
           
        }
        System.out.println();
        System.out.println(GemachteZüge);
       
       
   
        for (int i = 0; i < 49; i++) {
       
        zeichne[GemachteZüge][i]= f[i];
           
           
        }
        if (GemachteZüge == 31) {
            zeichnen2++;
            Zeichne z = new Zeichne();
            z.fenster();
        }   
       
    }
   
   
    public void Schreiben() {
   
           
       
       
        loesungen.put(AnzahlLoesungen, loesung);
        AnzahlLoesungen++;
        a = 0;
        feldInit();
        loese2(steinAnzahlBestimmen(),loesungen);           
    }
   
   

    private void loese2(int steine , HashMap<Integer,int[][]> loesungen )   {
       
        if(a == AnzahlLoesungen) {
            System.out.println(AnzahlLoesungen);
            Schreiben();
           
        }
        if(steine == 1 && loesungen.get(a) != loesung ) {   
                a++;
    }
       
                                   

       
        for (Zug zug : züge) {
            if (feld[zug.x] == 1 && feld[zug.y] == 1 && feld[zug.z] == 0)     {
                feld[zug.x] = 0;
                feld[zug.y] = 0;
                feld[zug.z] = 1;
                System.arraycopy(feld, 0, loesung[steine], 0, feld.length);
                loese2(steine - 1,loesungen);
                feld[zug.x] = 1;
                feld[zug.y] = 1;
                feld[zug.z] = 0;
           
            }
        }
       
    }
   
   

    public void feldInit() {
        for (int i = 0; i < 49; i++) 
            feld[i] = -1;
        feld[2] = 1;
        feld[3] = 1;
        feld[4] = 1;
        feld[9] = 1;
        feld[10] = 1;
        feld[11] = 1;
        feld[14] = 1;
        feld[15] = 1;
        feld[16] = 1;
        feld[17] = 1;
        feld[18] = 1;
        feld[19] = 1;
        feld[20] = 1;
        feld[21] = 1;
        feld[22] = 1;
        feld[23] = 1;
        feld[24] = 0;
        feld[25] = 1;
        feld[26] = 1;
        feld[27] = 1;
        feld[28] = 1;
        feld[29] = 1;
        feld[30] = 1;
        feld[31] = 1;
        feld[32] = 1;
        feld[33] = 1;
        feld[34] = 1;
        feld[37] = 1;
        feld[38] = 1;
        feld[39] = 1;
        feld[44] = 1;
        feld[45] = 1;
        feld[46] = 1;
       
       
    }

}

Das Problem liegt an der Methode loese2 denk ich. Nur versteh ich nicht wo mein Fehler liegt.

Java:
private void loese2(int steine , HashMap<Integer,int[][]> loesungen )   {
       
        if(a == AnzahlLoesungen) {
            System.out.println(AnzahlLoesungen);
            Schreiben();
           
        }
        if(steine == 1 && loesungen.get(a) != loesung ) {   
                a++;
    }
       
                                   

       
        for (Zug zug : züge) {
            if (feld[zug.x] == 1 && feld[zug.y] == 1 && feld[zug.z] == 0)     {
                feld[zug.x] = 0;
                feld[zug.y] = 0;
                feld[zug.z] = 1;
                System.arraycopy(feld, 0, loesung[steine], 0, feld.length);
                loese2(steine - 1,loesungen);
                feld[zug.x] = 1;
                feld[zug.y] = 1;
                feld[zug.z] = 0;
           
            }
        }
       
    }

Vielen Dank schon mal im Vorraus.
cookiiee
 

Zurück
Oben