Schach(matt) setzen

Coldstorm

Aktives Mitglied
Ich bin immer noch am implementieren meines Projekts und komme nicht weiter. Es ist ein Schachspiel,
das schon relativ gut funktioniert. Es fehlen noch alle Möglichkeiten der Rochade(4), die Bauernumwandlung und das wichtigste, die Schachbedrohung bzw. Schachmatt anschließend.
En passant ist schon realisiert(nicht von mir).
Wer hat Interesse mir vor allem bei dem Schach setzen auf die Sprünge zu helfen. Michael... und andere haben es ja schon versucht, allerdings bin ich in Java leider ein etwas hoffnungsloser Fall, wenn es zu komplex wird...
Im Anhang findet ihr die lokale Version des Schachs(soll bald Netzwerkschach sein). Einfach den kompletten Ordner ziehen und im Eclipse zum Laufen bringen und funktioniert sofort.
Ich bin um jede Hilfe/Code dankbar. Es ist für mich sehr wichtig, aber das hinzubringen übersteigt meine Fähigkeiten...
Die Main ist übrigens in der Chess.java
Theoretisch auch gegen Zahlung möglich, wenns nicht anders geht...
 

Anhänge

  • chess(2).zip
    41,8 KB · Aufrufe: 14

Marco13

Top Contributor
So ein bestehendes Programm "mal kurz" nachvollziehen, um an einer bestimmten Stelle einen bestimmten Aspekt "einzubauen" kann auch aufwändig sein.

Ganz allgemein: Man muss rausfinden, ob einer den König das anderen schlagen könnte (wenn er dran wäre). Du hast ja schon Methoden zum erstellen aller Züge und so. Du kannst also alle Züge sammeln, und schauen, ob einer der Züge als Zielfeld das Feld eines Königs hat. Und wenn ja, ist's Schach. Um Schachmatt zu erkennen, muss man dann schauen, ob man was gegen die Bedrohung unternehmen kann.

Als GANZ grober Pseudocode:
Java:
// Methode um rauszufinden, ob WEISS im Schach steht
// (wird direkt NACH einem Zug von BLACK aufgerufen, um
// die Ansage "Schach" machen zu können)
boolean istWHITEimSchach()
{
    List<Move> allMoves = Alle Züge die BLACK jetzt machen könnte
    for (Move move : allMoves)
    {
        if (move.zielfeld == Feld des WHITE Königs) return true;
    }
    return false;
}

// Methode um rauszufinden, ob WEISS im Schachmatt steht:
boolean istWHITESchachmatt()
{
    List<Move> allMoves = Alle Züge die WHITE jetzt machen könnte
    for (Move move : allMoves)
    {
        führeAus(move);
        boolean istWHITESchach = istWHITEimSchach();
        macheRückgängig(move);
        if (!istWHITESchach)
        {
            // Weiß kann einen Zug machen, nach dem es NICHT mehr
            // im Schah steht -> NICHT Schachmatt
            return false; 
        }
    }
    return true;
}
 

Coldstorm

Aktives Mitglied
Ich habs nun so angefangen, dass ich erstmal prüfe, wie der König bedroht wird, also vertikal, horizontal oder mit dem Springer...aber wie gehts jetzt weiter? PS: Code ist mir immer lieber als eine Beschreibung :)

Java:
	public void checkPositionCanBeBeaten(int x, int y)
	{
	    ArrayList<Point> pointArray = new ArrayList<Point>();

	    // Diagonale und Gerade
	    // Horizontal - Hierbei werden auch gleich die diagonalen gesetzt
	    for(int i=1;i<x;i++)
	    {
	        pointArray.add(new Point(i,y));
	        if(y+(x-i) <= 10)
	            pointArray.add(new Point(i,y+(x-i)));
	        if(y-(x-i) >= 1)
	            pointArray.add(new Point(i,y-(x-i)));
	    }
	    for(int i=x+1;i<=10;i++)
	    {
	        pointArray.add(new Point(i,y));
	        if(y+(i-x) <= 10)
	            pointArray.add(new Point(i,y+(i-x)));
	        if(y-(i-x) >= 1)
	            pointArray.add(new Point(i,y-(i-x)));
	    }
	    // Vertikal
	    for(int i=1;i<y;i++)
	    {
	        pointArray.add(new Point(x,i));
	    }
	    for(int i=y+1;i<=10;i++)
	    {
	        pointArray.add(new Point(x,i));
	    }

	    // Nun der Springer
	    if(x > 0 && y > 1)
	        pointArray.add(new Point(x-1,y-2));
	    if(x < 10 && y > 1)
	        pointArray.add(new Point(x+1,y-2));
	    if(x > 1 && y > 0)
	        pointArray.add(new Point(x-2,y-1));
	    if(x < 9 && y > 0)
	        pointArray.add(new Point(x+2,y-1));
	    if(x > 1 && y < 10)
	        pointArray.add(new Point(x-2,y+1));
	    if(x < 9 && y < 10)
	        pointArray.add(new Point(x+2,y+1));
	    if(x > 0 && y < 9)
	        pointArray.add(new Point(x-1,y+2));
	    if(x < 10 && y < 9)
	        pointArray.add(new Point(x+1,y+2));


	    // dieser Part wäre abgeschlossen
	    // jetzt überprüfen, ob Figuren des anderen Spielers auf den Positionen von pointArray stehen, wie ?
	    // ev kann es hier eine Performanceverbesserung sein, wenn man die Positionen der eigenen Figuren aus dem pointArray löscht, wie ?

	}
 

Michael...

Top Contributor
Hänge gerade schwer in einem Projekt und hab daher wenig Zeit mir zu solchen komplexen Themen Gedanken zu machen.
Aber prinzipiell kannst Du ja nach jedem Zug prüfen, ob der gegnerische König nun in Schlagdistanz ist. Kannst Dich ja an der Methode collectPossibleTragets() aus BoardModel orientieren.
Einfach für jede (noch aktiv im Spiel verfügbare) eigene Figur die möglichen Zielfelder durch gehen und prüfen, ob sich der gegnerische König darauf befindet, wenn ja --> Schach (evtuell kann man sich noch die Figuren merken, die den König ins Schach stellen)
Im nächsten Schritt die möglichen Zielfelder der gegnerischen Figuren durchgehen (z.B. in einer Liste sammeln) und überprüfen, ob ein Zug auf eines der Zielfelder das Schach beendet (wenn nein wieder aus der Liste rausschmeissen). Ist kein gültiger Zug dabei (die Liste also leer) --> Schach matt

Das ganze ist aber nicht unbedingt trivial.
 

Coldstorm

Aktives Mitglied
und meinst kann ich das da oben(den Code) irgendwie einbauen/ gebrauchen oder wäre es dann redundant...aber wäre eigentlich egal, Hauptsache es funktioniert
 

Coldstorm

Aktives Mitglied
ja soll halt überprüfen wie ein König Schach gesetzt werden soll, entweder Diagonal, Horizontal/Vertikal oder mit dem Springer...
kennst du eventuell jemanden, der mir weiterhelfen könnte und bisschen Zeit hat übers Wochenende ?
 

Michael...

Top Contributor
Ich würde da eher von der anderen Seite herangehen und für jede Spielfigur überprüfen, ob sie mit einem Zug das Spielfeld des gegnerischen Königs erreichen kann.
Die Methode collectPossibleTargets() sammelt ja bereits die mit einem Zug erreichbaren Felder einer bestimmten Figur. Ich würde entweder diese erweitern oder kopieren um die Zielfelder aller Figuren zu sammeln und diese Zielfelder mit der Position des Königs zu vergleichen.

Ich kenn nicht so viele Programmierer und die, die ich kenne machen sowas nur gegen Geld und deren Stundensatz möchtest Du vermutlich nicht zahlen ;-)
 

Michael...

Top Contributor
Danke der Nachfrage, könnte besser laufen ;-)

Ich hab man auf die Schnelle die Klasse BoardModel ein bisschen umgestrickt, dabei wurden die Methoden movePieceTo und collectPossibleTargets etwas umgestrickt.
Das Model habe ich um die Methode checkForCheck (besserer Name ist mir auf die Schnelle nicht eingefallen) ergänzt, die im System.out meldet wenn der gegnerische König in Schach gesetzt wurde (funktioniert nicht unbedingt beim freien Setzen).

Das ganze habe ich jetzt innerhalb von fünf Minuten mal so dahin geschrieben - hätte also sicherlich Verbesserungspotential.

Ausserdem ist der gesamte Code damals ohne grossartige Planung entstanden, da ich eigentlich nie vor hatte ein komplettes Schachprogramm zu schreiben.
Deshalb könnte das Model/Konzept sicherlich noch ein paar Optimierungen/Anpassungen vertragen.
 

Anhänge

  • BoardModel.txt
    11,8 KB · Aufrufe: 8

Coldstorm

Aktives Mitglied
Ja genau, danke, das ist das was ich wollte... Kann man da jetzt schon nur mit dem König ziehen oder eine Aktion, die ein Schach verhindert? Das muss ich noch irgendwohin schreiben oder?
 

Michael...

Top Contributor
Das war ja nur ein Schnellschuss, um zu überprüfen, ob der gegnerische König bedroht ist -als Bsp. wie man herausfindet könnte, ob ein König im Schach steht.
Du musst ja auch noch verhindern, dass ein Spieler sich selbst ins Schach stellt.
Man könnte jetzt nach jedem Zug für beide Könige prüfen, ob Sie bedroht werden. Wird der eigene König bedroht muss der Zug zurück genommen werden.

Schöner wäre es natürlich, wenn man bereits beim Ermitteln der möglichen Züge einer Figur, die Möglichkeiten raus nimmt, mit denen man sich selbst ins Schach stellen würde.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Schach Diagonalerichtung Java Basics - Anfänger-Themen 2
Hias12345 Schach(Springer Logik) Java Basics - Anfänger-Themen 27
G Schach -Frage 2- Maussteuerung Java Basics - Anfänger-Themen 7
G Schach in Java - Allgemeine Frage zur Architektur Java Basics - Anfänger-Themen 7
S Schach Frontend programmieren Java Basics - Anfänger-Themen 2
I Backtracking Schach Java Basics - Anfänger-Themen 5
E Schach in Java-Applet <No main classes found> Java Basics - Anfänger-Themen 5
T Springer Problem - Schach Java Basics - Anfänger-Themen 4
O Schach programmieren mit java Java Basics - Anfänger-Themen 4
C Anker Punkt setzen. Java Basics - Anfänger-Themen 1
J neues Object (JLabel) vorab zum Layout hinzufügen , Location setzen, etc? Java Basics - Anfänger-Themen 2
H Ein übergegebenes Objekt auf null setzen Java Basics - Anfänger-Themen 9
B Semaphoren in Abhängigkeit an Bedingungen richtig setzen Java Basics - Anfänger-Themen 3
L Methode in setText() setzen Java Basics - Anfänger-Themen 6
L Anzahl der benachbarten Minen berechnen und setzen Java Basics - Anfänger-Themen 15
S NIO lesbares und beschreibbares Attribut setzen Java Basics - Anfänger-Themen 1
C Array-Eintrag wieder auf Null setzen Java Basics - Anfänger-Themen 3
D Abstrakte Klasse, Konstruktorkette, Attribute setzen Java Basics - Anfänger-Themen 12
D Best Practice Konvention - Klassenmembers auf null setzen? Java Basics - Anfänger-Themen 2
F In Eclipse Haltepunkt bei Event setzen? Java Basics - Anfänger-Themen 1
das_leon JOptionPane Titel setzen Java Basics - Anfänger-Themen 1
P Cursor in JTextField setzen Java Basics - Anfänger-Themen 11
N wert für progress auf 100% setzen Java Basics - Anfänger-Themen 5
M Binären Baum Kinder setzen Java Basics - Anfänger-Themen 12
F Koordinaten nach 360° auf 0° setzen Java Basics - Anfänger-Themen 2
I Prozessname setzen Java Basics - Anfänger-Themen 8
S Das Anführungszeichen(") Zeichen in einen String setzen Java Basics - Anfänger-Themen 1
R Property Value als null setzen Java Basics - Anfänger-Themen 1
C Klassen Positionszähler auf Buchstaben setzen Java Basics - Anfänger-Themen 14
M Umgebungsvariable JDK/JRE? PATH setzen Java Basics - Anfänger-Themen 5
N Server Zeit zur lokalen Zeit setzen. Java Basics - Anfänger-Themen 0
S Classpath Findet die Klasse nicht classpath setzen? Java Basics - Anfänger-Themen 8
F Erste Schritte Label Text vor Methodenaufruf setzen Java Basics - Anfänger-Themen 17
I Date zu 01.01.<year> setzen Java Basics - Anfänger-Themen 1
M zufälliges Setzen von Schiffen in while klappt nicht immer Java Basics - Anfänger-Themen 3
C [Greasmonkey] Maus Coursor position setzen Java Basics - Anfänger-Themen 1
K Selbst renderndes Object auf null setzen Java Basics - Anfänger-Themen 1
M Umgebungsvariable JFileChooser#setCurrentDirectory via Properties setzen? Java Basics - Anfänger-Themen 5
M Wann PATH und wann JAVA_HOME in Windows System 7 setzen? Java Basics - Anfänger-Themen 2
M Die Breite bei der Gui richtig setzen. Java Basics - Anfänger-Themen 1
X Vererbung Setzen auf Null bei Subklassen Java Basics - Anfänger-Themen 2
N Fokus setzen nachdem JFrame in Vordergrund geholt wurde Java Basics - Anfänger-Themen 7
I Variablen Wie initialisiert man in Java eine Variable ohne das Setzen von 0 oder einer anderen Zahl? Java Basics - Anfänger-Themen 8
H JPanel Hintergrund transparent setzen? Java Basics - Anfänger-Themen 10
R Classpath Setzen von class Verzeichnissen Java Basics - Anfänger-Themen 2
H KeyListener auf ganzes Fenster setzen Java Basics - Anfänger-Themen 14
Ernesto95 BufferedImage Teilbereich wieder transparent setzen Java Basics - Anfänger-Themen 16
Jagson Dotcom Spiel - Dots Random setzen Java Basics - Anfänger-Themen 8
S Ermitteln und Setzen der Attribute eines Objektes Java Basics - Anfänger-Themen 6
N Erste Schritte Tausender Trennzeichen setzen Java Basics - Anfänger-Themen 5
J JRadioButton in JTable setzen Java Basics - Anfänger-Themen 4
A JLabel erst auf null dann auf einen Wert setzen Java Basics - Anfänger-Themen 7
H Panel in Variable setzen möglich? Java Basics - Anfänger-Themen 10
Helgon Focus setzen Java Basics - Anfänger-Themen 6
E Erste Schritte AbstractTableModel Werte setzen mit setValueAt Java Basics - Anfänger-Themen 10
B eclipse Oberfläche zurück setzen Java Basics - Anfänger-Themen 2
C Leerzeichen im char Array setzen Java Basics - Anfänger-Themen 33
L Methoden In einer Klasse ein Attribut aus einer anderen Klasse setzen Java Basics - Anfänger-Themen 8
M TableColumn Breite setzen Java Basics - Anfänger-Themen 9
M Monat setzen Java Basics - Anfänger-Themen 18
Fab1 Buttons auf ein Hintergrundbild(JFrame) setzen Java Basics - Anfänger-Themen 24
U Passwort auf JButton setzen. Java Basics - Anfänger-Themen 2
M JAVA_HOME setzen xubuntu Java Basics - Anfänger-Themen 2
S Input/Output Neuen InputStream System.in setzen Java Basics - Anfänger-Themen 11
K JTable AbstractTableModel Header setzen Java Basics - Anfänger-Themen 6
L Applet: Parameter setzen Java Basics - Anfänger-Themen 12
M Image Metadaten setzen Java Basics - Anfänger-Themen 2
M HttpPut mimeType setzen Java Basics - Anfänger-Themen 2
E Titel und Größe vom JFrame setzen Java Basics - Anfänger-Themen 6
Z Fokus auf anderes Programm setzen Java Basics - Anfänger-Themen 3
S import - Anweisung; Setzen der Classpath Java Basics - Anfänger-Themen 2
N Objectnamen neu setzen? Java Basics - Anfänger-Themen 20
G Verzeiflung bei JDateChooser Datum setzen Java Basics - Anfänger-Themen 3
J Elegante Art mehrere Label mit einem icon zu setzen Java Basics - Anfänger-Themen 13
J JAVA_HOME und path setzen bei windows 7 Java Basics - Anfänger-Themen 5
radiac Datentypen RANDOM-punkt setzen INNERHALB eines BEREICHes Java Basics - Anfänger-Themen 2
D Classpath setzen Java Basics - Anfänger-Themen 4
W Koordinaten mit System.in.read() setzen Java Basics - Anfänger-Themen 2
J jComboBox auf default setzen wie? Java Basics - Anfänger-Themen 3
D JFrame Icon setzen? Java Basics - Anfänger-Themen 8
L Lucene Classpath unter linux setzen Java Basics - Anfänger-Themen 8
H Farbe setzen Java Basics - Anfänger-Themen 5
J Klassen richtig in Relation setzen Java Basics - Anfänger-Themen 3
B Classpath setzen - UNTER MAC OS X Java Basics - Anfänger-Themen 2
R jLabel lässt sich nicht public setzen?? Java Basics - Anfänger-Themen 15
S JRadioButton - Wert setzen aus Datenbank Java Basics - Anfänger-Themen 4
N Exception richtig setzen Java Basics - Anfänger-Themen 2
S Schleife und farbwerte setzen Java Basics - Anfänger-Themen 8
S setrgb () setzen von farbwerte Java Basics - Anfänger-Themen 4
R Enum und dann setter Setzen? Java Basics - Anfänger-Themen 44
S Pixel auf Screen setzen Java Basics - Anfänger-Themen 4
J Dateipfade systemunabhängig setzen Java Basics - Anfänger-Themen 3
F JAVA_HOME automatisch setzen? Java Basics - Anfänger-Themen 2
M Offenes JFrame auf visible setzen? Java Basics - Anfänger-Themen 6
schroedi JAVA_HOME setzen unter Debian Java Basics - Anfänger-Themen 8
H Probleme, TableColumn-Breite zu setzen Java Basics - Anfänger-Themen 4
S log4j pfad per umgebungsvariable setzen? Java Basics - Anfänger-Themen 2
L Windows-Umgebungsvariablen mit Java setzen? Java Basics - Anfänger-Themen 11
S BBCodes in einen String setzen Java Basics - Anfänger-Themen 7
G Plugins einbinden und Classpath setzen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben