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
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.
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 ]
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
}
}