Schach schnelle Zuggenerierung

member42

Aktives Mitglied
Ich habe jetzt für jede Schachfigur eine Klasse erstellt, die u.a alle möglichen Züge der Figur bestimmt.
Dann füge ich alle Figuren zu einer Liste und kann für jede Brettposition alle möglichen Züge bestimmen.
Ist das so eine gute und schnelle Vorgehensweise? Hat wer einen anderen Vorschlag? Vorher habe ich das Brett immer komplett abgelaufen und habe nach den einzelnen Figuren gesucht, wodurch die Zuggenerierung sehr langsam wurde.

Java:
abstract class Figur {

    public int id; // Darstellung der Figur
    public Feld position;

    public Figur(int id, Feld position) {
        this.id = id;
        this.position = position;
    }

    public boolean inBrett(Feld position) {
        return (position.x >= 0 && position.y >= 0 && position.x < 8 && position.y < 8);
    }

    public abstract ArrayList<Zug> möglicheZüge();
    public abstract ArrayList<Feld> bedrohteFelder();
}

class König extends Figur {

    private Feld position;
    private int id;
    private final Feld[] königsZug = {new Feld(-1,-1), new Feld(-1,0), new Feld(-1, 1), new Feld(0, -1),
            new Feld(0, 1), new Feld(1, -1), new Feld(1, 0), new Feld(1, 1)};

    public König(int id, Feld position) {
        super(id, position);
        this.id = id;
        this.position = position;
    }

    @Override
    public ArrayList<Zug> möglicheZüge() {

        ArrayList<Zug> züge = new ArrayList<>();

        for(int z = 0; z < 8; z++) {

            Feld ziel = new Feld(position.x + königsZug[z].x, position.y + königsZug[z].y);
            if(inBrett(ziel)) züge.add(new Zug(id, position, ziel));
        }

        return züge;
    }

    @Override
    public ArrayList<Feld> bedrohteFelder() {
        ArrayList<Feld> bedroht = new ArrayList<>();

        for(int z = 0; z < 8; z++) {
            Feld ziel = new Feld(position.x + königsZug[z].x, position.y + königsZug[z].y);
            if(inBrett(ziel)) bedroht.add(ziel);
        }
        return bedroht;
    }
}
...
class Brett {

    public int[][] brett = new int[8][8];
    public int[][] kopie;
...
}
 
K

kneitzel

Gast
Da Du nicht schreibst, was Dein Ziel ist, ist es sehr schwer zu sagen, ob das eine gute Idee ist.

Ich habe mir Deinen Code noch nicht im Detail angesehen, aber für die möglichen Zügen brauchst Du auf jeden Fall noch deutlich mehr:
a) König darf nicht auf ein bedrohtes Feld
b) Eine Figur darf nicht ziehen, wenn dadurch der eigene König bedroht würde.

Somit brauchst Du doch deutlich mehr and Logik.

Wenn es zu einem richtigen Schach Programm werden soll, dann brauchst Du natürlich noch deutlich mehr, z.B. eine Bewertung von Stellungen oder Zügen.

Bezüglich Anfangsphase und Endspiel kommen dann oft auch schlicht Bibliotheken zum Einsatz, d.h. für bestimmte Stellungen hat er einfach eine Liste von Möglichkeiten von denen er dann zufällig eine auswählt. Auf ein e4 kann er also z.b. Antworten mit e5, d5, ...
Sprich: Die Software kennt einfach viele Eröffnungen und das war es dann.

Das Thema kann also schnell sehr komplex werden. Da kann man aber im Internet suchen und da findet man dann auch Open Source Projekte. Ich habe da so auf Anhieb z.B. http://jchecs.free.fr/en/index.php gefunden (Aber es mir noch nicht im Detail angesehen)

Viele Grüße,

Konrad
 

mrBrown

Super-Moderator
Mitarbeiter
Java:
abstract class Figur {
  public int id; // Darstellung der Figur
  public Feld position;
  [..]
}

class König extends Figur {
  private Feld position;
  private int id;
[..]
}
Du solltest dir noch mal die Grundlage von Vererbung angucken ;)


Die 8 solltest du noch ersetzen (durch zB königsZug.length), ansonsten passt das zumindest für den König. Ob die Züge wirklich gültig sind, müsst du aber noch prüfen.
 

Ähnliche Java Themen

Neue Themen


Oben