# Java Schachzüge überprüfen



## xela (17. Feb 2010)

Hallo,
ich bin gerade dabei ein Bluetooth Schach zu programmieren. Das Schachbrett, die Figuren und die Selektion der Schachfigur wird schon angezeigt. Die Bewegung (nur seine eigene Figuren )über Bluetooth funktioniert auch.

Jetzt bin ich dabei die Züge der Figuren auf gültigkeit zu überprüfen.

Ich habe ein Schachfeld mit 8X8 Feldern. Jede Figur hat eine X und Y Koordinate. Z.B. der Turm steht am anfang auf 0,0 usw. 

Um die Züge überprüfen zu könne  habe ich die Methode validMove geschrieben. Der Methode werden die X und Y Koordinaten der selektierten Figur, die id der Figur und die Zielkoordinaten übergeben.


```
private boolean validMove(int x, int y, int id, int newX, int newY){
        if (id == 13) {
            int move = y+1;
            if(newY==move){
               return true; 
            }
        }
        
        return false;
        
    }
```
Zum testen habe ich einen Bauern benutzt, der nur ein Feld nach unten gehen darf. Funktioniert auch.
Blos wie soll ich die Überprüfung für die andern Figuren wie z.B. dam Pfern anwenden?


----------



## hemeroc (17. Feb 2010)

Zum einen Stimmt das bei deinem Bauern nicht ganz, da der erste Zug eines Bauern auch über 2 Felder gehen darf außerdem solltest du überprüfen ob da schon eine Figur steht wenn ja ist der Zug natürlich nicht möglich es sei denn es ist ein schräger zug und du versucht einen Gegner zu schlagen.

Allgemein ist die überprüfung auf einen gültigen Zug in Schach nicht gerade trivial.

Ich empfehle dir dich sehr genau in die Regeln und Zugmöglichkeiten von Schach einzulesen.
Außerdem könnte das lesen von bereits existierendem Code dir helfen:

Schach ? Wikipedia
JChessBoard | Get JChessBoard at SourceForge.net

LG


----------



## SlaterB (17. Feb 2010)

was bedeutet denn id=13, steht das für den Bauern?
jedenfalls musst du nach der Figur unterschieden und Figur für Figur weiteren Code einfügen,

evtl. auch bedenken was sonst noch so auf dem Schachfeld steht, ob der Weg frei ist usw.,
beim Bauern könntest du auch noch testen, ob x gleich ist oder +-1 wenn gleichzeitig geschlagen wird

das ist nicht gerade ein kurzes einfaches Programm, sondern jede Menge Arbeit


----------



## xela (18. Feb 2010)

Die ID brauche ich für die Bluetooth funktionalität. Anhand der ID wird beim Gegner die Figur bewegt oder gelöscht. Neben der eindeutigen ID haben die Figuren noch Namen wie z.B. pawn, Knight usw.

Ja der bauer darf am Anfang zwei Felder gehen. Ich habe das nur zum testen mit einem Feld probiert.

Ich habe für das Programm noch eine Board klasse geschrieben. Bis jetzt habe ich die jedoch garnicht benutzt weil die Koordinaten der Figuren in der Figuren Klasse standen.

In der Board Klasse habe ich ein 8X8 Array erstellt und erstmal die 68 Felder mit -1 gefüllt. dann habe ich die Figuren hinzugefügt also auf board[0][0]=1, board[1][0]=2 usw. Die 1 und die 2 sind wieder die ID's der Figuren.

Somit weiß ich wo sich gerade die Figuren auf dem brett befinden. Mit  setField,getField und eraseField kann man die Felder des Arrays auslesen, neu setzen oder löschen.


```
public class Board {

    private int[][] brett = new int[8][8];

    // create empty board
    public Board() {
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                brett[j][i] = -1;
            }
        }
    }

    public void setFigures(int x, int y, int id) {
        brett[x][y] = id;
        // System.out.println(brett[0][0]);
    }

    public int getField(int x, int y) {
        return brett[x][y];
    }

    public void setField(int x, int y, int id) {
        brett[x][y] = id;
    }

    public void eraseField(int x, int y){
        brett[x][y]=-1;
    }

    public void paintBoard(Graphics g, int cellSize) {
        int cellColor = 0;
        for (int x = 0; x < 8; x++) {
            for (int y = 0; y < 8; y++) {
                cellColor = (x + y) % 2 * 255;

                if (cellColor == 0) {
                    cellColor = 127;
                }
                g.setColor(cellColor, cellColor, cellColor);
                g.fillRect(x * cellSize, y * cellSize, cellSize, cellSize);
            }
        }
    }
}
```

Hier habe ich eine rechung gefunden um die Züge zu überprüfen: Schachprogrammierung


Aber so richtig hilft mir das auch nicht weiter.


----------



## Marco13 (18. Feb 2010)

Die Überprüfung auf Gültigkeit an sich ist ... naja... schon "trivial", aber eben aufwändig, und teilweise ein bißchen Fummelig. Auf der Seite, die zu zuletzt verlinkt hast, wird diese Überprüfung ... auch nicht "richtig" gemacht, und auf eine Weise, wie sie nur schwer allgemein anzuwenden ist. 

Wenn es nicht darum geht, höchst-optimierten Deep-Thought-IV-Code zu schreiben, solltest du dir vielleicht ein paar Klassen erstellen. Z.B. für Spielfiguren, ggf. Spielfelder... und eben einen "Move". Der braucht nämlich (direkt oder indirekt!) einige Informationen, die aus 4 int's nicht hervorgehen. (Farbe der Figur, Farbe der Figur auf dem Zielfeld, Art der Figur, Art der Figur auf dem Zielfeld, ob die Figur schonmal bewegt wurde, ...)


----------



## Schumi (18. Feb 2010)

Es bedarf doch bei einigen Figuren auch noch die Information, ob etwas zwischen start- und Zielfeld steht. IRC darf eben nur der Springer springen.


----------



## Landei (18. Feb 2010)

Bei einem Königszug muss auch die "Bedrohungslage" geprüft werden. Hinzu kommen die schwierig zu implementierenden "Sonderzüge" Rochade, Schlagen en passant und Bauernumwandlungen.


----------



## Marco13 (18. Feb 2010)

Schumi hat gesagt.:


> Es bedarf doch bei einigen Figuren auch noch die Information, ob etwas zwischen start- und Zielfeld steht. IRC darf eben nur der Springer springen.



Das ist aber wohl keine Information, die man direkt mit einem "Zug" assoziieren würde - vielmehr ist DAS ein Punkt, der in dieser Funktion eben überprüft wird - auf Basis des Start- und Endfeldes und des Figurtyps. Letzteres sind die Dinge, die zu einem Zug an sich gehören, wobei man das natürlich noch "eindampfen" könnte: Wenn man das Startfeld kennt, kennt man auch die Figur, die gezogen wird usw... kommte eben drauf an, wie man das modellieren will...)



Landei hat gesagt.:


> Bei einem Königszug muss auch die "Bedrohungslage" geprüft werden. Hinzu kommen die schwierig zu implementierenden "Sonderzüge" Rochade, Schlagen en passant und Bauernumwandlungen.



Das sind die "fummeligen" Dinge, und die, bei denen z.B. die Information braucht, ob die Figur schonmal bewegt wurde... 


Allgemein: Es empfiehlt sich, seinen "Zug" so zu modellieren, dass man alle Daten speichert, die nötig sind, um den Zug ausführen _und wieder rückgängig machen_ zu können. Spätestens wenn man eine KI schreiben will, ist das ganz entscheidend...


----------

