Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| lehrkraefte:blc:informatik:ffprg1-2023:js-connect-4:start [2023/02/16 16:19] – [Spielfeld generieren, CSS-Tricks] Ivo Blöchliger | lehrkraefte:blc:informatik:ffprg1-2023:js-connect-4:start [2023/05/16 09:49] (current) – [Computer Gegner] Ivo Blöchliger | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== 4-Gewinnt ====== | ||
| + | <WRAP todo> | ||
| + | **Vorbereitung** | ||
| + | Laden Sie sich folgendes zip-File herunter: {{lehrkraefte: | ||
| + | |||
| + | Das Archiv enthält mehrere Unterverzeichnisse mit dem Spiel. | ||
| + | </ | ||
| + | |||
| + | ===== Spielfeld generieren, CSS-Tricks ===== | ||
| + | <WRAP todo> | ||
| + | * Studieren Sie den HTML, CSS und JS-Code im Verzeichnis '' | ||
| + | * Schaffen Sie es, dass die Farbe eines Felds auf rot (oder blau) gesetzt wird, wenn man darauf klickt? | ||
| + | * Verstehen Sie den Zusammenhang zwischen der Zeile '' | ||
| + | * Wenn Sie möchten, finden Sie besseren CSS-Code für die Felder (angefangen bei den Farben). Es sind mit CSS auch runde Felder bzw. Hintergrundbilder möglich. | ||
| + | |||
| + | </ | ||
| + | |||
| + | ===== Spielfeld Zustand speichern und manipulieren ===== | ||
| + | So wie es im Moment programmiert ist, ist die Information über den Feldzustand an zwei Orten gespeichert: | ||
| + | |||
| + | Zum Auslesen und Setzen dieser Werte ist das aber unpraktisch. | ||
| + | |||
| + | <WRAP todo> | ||
| + | * Schreiben Sie eine Funktion '' | ||
| + | * Schreiben Sie eine Funtion '' | ||
| + | * Testen Sie die Funktion, indem Sie damit das Feld jeweils «eins weiter» schalten beim Klicken. | ||
| + | * Implementieren Sie eine '' | ||
| + | <code javascript> | ||
| + | for (let div of spieldfeld.children) { | ||
| + | // ... | ||
| + | } | ||
| + | </ | ||
| + | * Implementieren Sie eine Funktion '' | ||
| + | </ | ||
| + | |||
| + | ===== Spielablauf ===== | ||
| + | <WRAP todo> | ||
| + | * Überlegen Sie sich, was alles bekannt sein muss, um einen beliebigen Spielzustand im «Vier gewinnt» zu beschreiben und wie man dies in Variablen speichern könnte. | ||
| + | * Fügen Sie diese Variablen im Code hinzu und initialisieren Sie diese in der '' | ||
| + | * Bei einem klick auf ein Feld soll überprüft werden, ob überhaupt noch ein Stein in die entsprechende Spalte gesetzt werden kann, und wenn ja, auf welcher Höhe. | ||
| + | * Die Farben sollen immer abwechseln. | ||
| + | </ | ||
| + | |||
| + | ===== Spielende überprüfen ===== | ||
| + | Das Spiel kann auf zwei Arten enden: | ||
| + | * Alle Plätze sind besetzt | ||
| + | * Jemand hat vier in einer Reihe | ||
| + | Der erste Fall kann relativ einfach überprüft werden, indem einfach gezählt wird, wie viele Steine schon gesetzt wurden. | ||
| + | |||
| + | Der zweite Fall hat viel mehr Fleisch am Knochen. Überlegen Sie sich Strategien dazu. | ||
| + | |||
| + | ==== Mögliche Lösung ==== | ||
| + | |||
| + | <code javascript> | ||
| + | // Zugriff auf Feld etwas vereinfachen: | ||
| + | function getValueAt(x, | ||
| + | // wenn x,y nicht auf dem Brett, 0 züruckgeben | ||
| + | // sonst den Wert vom Feld x,y | ||
| + | } | ||
| + | |||
| + | // Gibt die Anzahl gleicher Felder an, wenn man bei (startx, starty) startet und in Richtung (dx,dy) weiter geht. | ||
| + | // Ist das Startfeld schon 0, wird sofort 0 zurückgegeben | ||
| + | function count(startx, | ||
| + | let wert = getValueAt(startx, | ||
| + | if (wert==0) return 0; // Keine Nuller zählen | ||
| + | let anzahl = 0; | ||
| + | while (wert==getValueAt(startx, | ||
| + | | ||
| + | | ||
| + | | ||
| + | } | ||
| + | | ||
| + | } | ||
| + | |||
| + | // Liefert true, wenn die Position (x, y) Teil eines Vierers ist | ||
| + | function pruefen(x, y) { | ||
| + | let dirs = [[1,0], [1,1], [0,1], [-1,1]]; // Trigonometrisch, | ||
| + | for (let d of dirs) { | ||
| + | let anzahl = count(x, y, d[0], d[1]) + | ||
| + | | ||
| + | if (anzahl> | ||
| + | return true; | ||
| + | } | ||
| + | } | ||
| + | return false; | ||
| + | } | ||
| + | </ | ||
| + | ==== Popup-Nachricht / Gewinnsteine markieren ==== | ||
| + | Um das Spielende anzuzeigen, könnte ein «Popup» verwendet werden. | ||
| + | * Z.B. ein div, das normalerweise mit '' | ||
| + | * Oder ein ''< | ||
| + | |||
| + | Um die Gewinnsteine zu markieren, erweitern Sie die Funktion '' | ||
| + | Fügen Sie eine zusätzliche Klasse in der CSS-Datei an, die angibt, wie die Felder markiert werden sollen, z.B. durch eine CSS-Animation mit '' | ||
| + | |||
| + | |||
| + | ===== Computergegner ===== | ||
| + | Idee: Bis zu einer gewissen Tiefe alle möglichen Züge durchprobieren und jeweils den besten davon auswählen und dessen Bewertung zurückgeben. Ist die maximale Tiefe erreicht, wird die Spielsituation heuristisch bewertet. | ||
| + | |||
| + | Eine mögliche, minimale Implementation finden Sie hier: {{lehrkraefte: | ||