Neue Version mit Rochade-Funktion

Neue Version mit Rochade-Funktion

von Pit Noack -
Anzahl Antworten: 0

Liebe Leute,

(Ich erlaube mir, auch denen zu schreiben, die länger nicht dabei waren... Vielleicht sehen wir uns mal wieder? Wir treffen uns kommenden Mittwoch um 16:00 hier: https://moodle.bildung-lsa.de/webakademie/my/courses.php )

Es gibt eine neue Version des Schachprogramms, die Rochade funktioniert jetzt lächelnd

Ihr macht einen Rochade Zug, indem ihr den König anklickt, und dann das Feld, auf dem er nach der Rochade stehen würde, siehe Screenshot.

sketch.png

Wenn ihr am Wochenende Langeweile habt, würde ich mich freuen, wenn ihr die Rochade Funktion ein bisschen testet, und mir gerne berichtet, wenn ihr auf einen Fehler stoßt. Also: Ihr eine Rochade machen könnt, wenn es eigentlich nicht erlaubt ist, oder umgekehrt. Da brauche ich na klar eine genaue Beschreibung, in welcher Situation der Fehler auftritt.

mail@pitnoack.de

Ich wünsche viel Spaß beim Testen!

Es fehlt nicht mehr viel, und dann können wir uns den wirklich interessanten Themen zuwenden, vor allem der Programmierung unserer Schach KI!

Auf bald und herzliche Grüße

Pit

--------------------------------------

ps.:

Falls ihr wissen wollt, wie das im Code läuft, ein paar Bemerkungen dazu:

Der Spielzustand hat sechs neue Eigenschaften:

this.turmDamenseiteWeissBewegt = false;
this.turmKoenigseiteWeissBewegt = false;
this.koenigWeissBewegt = false;
this.turmDamenseiteSchwarzBewegt = false;
this.turmKoenigseiteSchwarzBewegt = false;
this.koenigSchwarzBewegt = false;
 
spielzustand.zugUngeprueft schaut dann nach: Wurde der weiße Turm auf der Dameseite bewegt? Dann wird der entsprechende Wert auf true gesetzt... genau so mit den anderen Werten...

Die Analyse ist ja dafür zuständig, die jeweils gültigen Züge zu ermitteln... 

Dort gibt es ein vier neue Funktionen, die jeweils prüfen, ob eine der vier möglichen Rochaden zulässig ist, hier ein Beispiel:

pruefeRochadeRechteWeissKoenigseite() {
   // Grundvoraussetzungen prüfen
   if (this.spielzustand.koenigWeissBewegt || this.spielzustand.turmKoenigseiteWeissBewegt) {
       return false;
   }
   
   // König muss auf e1 (Feld 60) stehen
   if (this.feldKoenigWeiss !== 60) {
       return false;
   }
   
   // Turm muss auf h1 (Feld 63) stehen
   if (this.spielzustand.figur(63) !== 4) {
       return false;
   }
   
   // Felder zwischen König und Turm müssen frei sein (f1=61, g1=62)
   if (this.spielzustand.figur(61) !== 0 || this.spielzustand.figur(62) !== 0) {
       return false;
   }
   
   // König darf nicht im Schach stehen
   if (this.schachWeiss) {
       return false;
   }
   
   // König darf nicht durch Schach ziehen oder in Schach landen
   const bedrohteFelder = this.bedrohteFelder(-1); // Schwarze bedrohte Felder
   if (bedrohteFelder.includes(61) || bedrohteFelder.includes(62)) {
       return false;
   }
   
   return true;
}

Dazu gibt es eine neue Funktion, die dann einfach für schwarz und für weiß schaut, welche Rochaden möglich sind, und sie dann den gültigen Zügen hinzufügt:

rochadeZuegeHinzufuegen() {

    if (this.pruefeRochadeRechteWeissKoenigseite()) {
        this.gueltigeZuegeWeiss[this.feldKoenigWeiss].push(62); // g1
    }
    
    if (this.pruefeRochadeRechteWeissDamenseite()) {
        this.gueltigeZuegeWeiss[this.feldKoenigWeiss].push(58); // c1
    }
   
    if (this.pruefeRochadeRechteSchwarzKoenigseite()) {
        this.gueltigeZuegeSchwarz[this.feldKoenigSchwarz].push(6); // g8
    }
    
    if (this.pruefeRochadeRechteSchwarzDamenseite()) {
        this.gueltigeZuegeSchwarz[this.feldKoenigSchwarz].push(2); // c8
    }
  }

Zur Erinnerung, in gueltigeZuegeWeiss bzw. gueltigeZuegeSchwarz stehen die Züge in diesem Format:

34: Array(9) [ 43, 52, 61, ]
45: Array(5) [ 62, 28, 30, ]
48: Array [ 40, 32 ]
49: Array [ 41, 33 ]
50: Array [ 42 ]
51: Array [ 43, 35 ]
54: Array [ 46, 38 ]
55: Array [ 47, 39 ]
57: Array [ 40, 42 ]
59: Array [ 52 ]
60: Array [ 52, 61, 62 ]
63: Array [ 62, 61 ]

Das heißt dann zum Beispiel, dass die Figur, die auf Feld 57 steht, nach Feld 40 und Feld 42 ziehen darf.

Und die Rochade des weißen Königs nach rechts ist dann einfach der Zug von Feld 60 nach 62.

Da muss dann nur noch in spielzustand.zugUngeprueft() geschaut werden, ob die ziehende Figur ein König ist und ob die Figur zwei Schritte in eine Richtung geht, was eindeutig eine Rochade ist. Und dann wird entsprechend noch der Turm bewegt:

if (logik.istKoenig(bewegteFigur) && Math.abs(zielfeld - startfeld) === 2) {
        // Rochade erkannt - Turm mitbewegen
        if (zielfeld === 62) { // Weiß kurz: g1
            neuerZustand.felder[63] = 0; // Turm von h1 weg
            neuerZustand.felder[61] = 4; // Turm nach f1
        } else if (zielfeld === 58) { // Weiß lang: c1
            neuerZustand.felder[56] = 0; // Turm von a1 weg
            neuerZustand.felder[59] = 4; // Turm nach d1
        } else if (zielfeld === 6) { // Schwarz kurz: g8
            neuerZustand.felder[7] = 0; // Turm von h8 weg
            neuerZustand.felder[5] = -4; // Turm nach f8
        } else if (zielfeld === 2) { // Schwarz lang: c8
            neuerZustand.felder[0] = 0; // Turm von a8 weg
            neuerZustand.felder[3] = -4; // Turm nach d8
        }
    }