Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
talit:web:webapps:client [2025-02-02 11:01] – [Zustand] hof | talit:web:webapps:client [2025-04-13 10:47] (aktuell) – [Client-Side Vier Gewinnt] hof | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
## Client-Side Vier Gewinnt | ## Client-Side Vier Gewinnt | ||
- | [[wpde> | + | [[wpde> |
- | + | ||
- | {{: | + | |
+ | {{: | ||
### Auftrag A: Struktur & Formatierung | ### Auftrag A: Struktur & Formatierung | ||
Zeile 12: | Zeile 11: | ||
* Erstelle einen neuen Ordner, in dem die ganze Web-App enthalten sein wird! | * Erstelle einen neuen Ordner, in dem die ganze Web-App enthalten sein wird! | ||
* Erstelle erst nur das HTML in `connect4.html`! | * Erstelle erst nur das HTML in `connect4.html`! | ||
- | * Eine gute Möglichkeit wäre ein Element mit 42 `< | + | * Eine gute Möglichkeit wäre ein Container-Element mit 42 `< |
* Eine andere Möglichkeit wäre, die Matrix zu verschachteln mit einem Container, der sechs Zeilen-Elemente mit je sieben Feldern enthält. | * Eine andere Möglichkeit wäre, die Matrix zu verschachteln mit einem Container, der sechs Zeilen-Elemente mit je sieben Feldern enthält. | ||
* Formatiere anschliessend mit CSS! | * Formatiere anschliessend mit CSS! | ||
Zeile 20: | Zeile 19: | ||
* Ansprechende Formatierung (Hintergrundfarbe, | * Ansprechende Formatierung (Hintergrundfarbe, | ||
* Nice-to have: | * Nice-to have: | ||
+ | * Runde Löcher: z.B. mit `border-radius: | ||
+ | * 3D-Effekt mit `box-shadow`. | ||
* Responsive (Spielfeld passt sich der Grösse des Browserfensters an) | * Responsive (Spielfeld passt sich der Grösse des Browserfensters an) | ||
* Mobile funktioniert gut ([[https:// | * Mobile funktioniert gut ([[https:// | ||
Zeile 28: | Zeile 29: | ||
Das Ziel dieses Auftrags ist, dass zu zweit im Browser Vier gewinnt gespielt werden kann. Dazu nutzen wir [[gf_informatik: | Das Ziel dieses Auftrags ist, dass zu zweit im Browser Vier gewinnt gespielt werden kann. Dazu nutzen wir [[gf_informatik: | ||
+ | |||
+ | #### Javascript einbinden | ||
+ | |||
+ | Die Javascript-Datei (z.B. `connect4.js`) muss im HTML-Code eingebunden werden. Damit die Datei erst ausgeführt wird, wenn das HTML aufgebaut ist, markieren wir sie mit `async`: | ||
+ | |||
+ | <code html> | ||
+ | <script src=" | ||
+ | </ | ||
+ | |||
#### Zustand | #### Zustand | ||
Der Zustand (en. _state_) des Spiels soll in einem Javascript-Objekt (wie ein Python-Dictionary) gespeichert werden: | Der Zustand (en. _state_) des Spiels soll in einem Javascript-Objekt (wie ein Python-Dictionary) gespeichert werden: | ||
Zeile 34: | Zeile 44: | ||
game = { | game = { | ||
" | " | ||
- | " | + | " |
0, 0, 0, 0, 0, 0, 0, | 0, 0, 0, 0, 0, 0, 0, | ||
0, 0, 0, 0, 0, 0, 0, | 0, 0, 0, 0, 0, 0, 0, | ||
Zeile 46: | Zeile 56: | ||
</ | </ | ||
- | Alle Änderungen des Spiels sollen zuerst auf diesem Spiel-Modell durchgeführt werden. Anschliessend wird das Spiel vom HTML dargestellt (en. _rendering_) | + | Alle Änderungen des Spiels sollen zuerst auf diesem Spiel-Modell durchgeführt werden. Anschliessend wird das Spiel vom HTML dargestellt (en. _rendering_). |
- | . | + | |
#### Verhalten | #### Verhalten | ||
- | Jeder `button` benötigt einen Click-Handler, | + | Jeder `button` benötigt einen Click-Handler, |
+ | |||
+ | <code javascript> | ||
+ | let index = 0 | ||
+ | for (let button of document.getElementsByTagName(" | ||
+ | const column = index % 7; | ||
+ | button.addEventListener(" | ||
+ | index++; | ||
+ | } | ||
+ | </ | ||
Der Click-Handler: | Der Click-Handler: | ||
+ | * findet heraus, welches das unterste leere Feld in der Spalte ist. | ||
* überprüft, | * überprüft, | ||
- | * findet heraus, welches das unterste leere Feld ist. | ||
* setzt das Feld auf die Farbe des Spielers. | * setzt das Feld auf die Farbe des Spielers. | ||
- | * einerseits muss der Inhalt des Buttons gesetzt werden, damit der Wert im HTML angezeigt wird. | ||
- | * andererseits setzen wir ein Attribut `data-state`, | ||
* ... überprüft ob das Spiel zu Ende ist | * ... überprüft ob das Spiel zu Ende ist | ||
* entweder, weil ein Spieler gewonnen hat, | * entweder, weil ein Spieler gewonnen hat, | ||
Zeile 63: | Zeile 79: | ||
* ... schaltet die Farbe des Spielers um. | * ... schaltet die Farbe des Spielers um. | ||
- | Um die Darstellung des Spiels zu ändern, setzen wir den Text des Buttons. | + | Um den Code etwas zu strukturieren, |
+ | |||
+ | <code javascript> | ||
+ | /** Drops a piece in the given column and updates the game state accordingly. */ | ||
+ | function dropPiece(grid, | ||
+ | // Check if move is valid. | ||
+ | if (game.state != " | ||
+ | return; | ||
+ | } | ||
+ | // Compute the lowest empty row in the selected column. | ||
+ | let row = computeEmptyRow(game, | ||
+ | let cell = row * 7 + column; | ||
+ | // Update game state. | ||
+ | game.board[cell] = game.next; | ||
+ | // Check for winner / tie, will set game.state if game ended. | ||
+ | checkWinner(game, | ||
+ | // Swap active player | ||
+ | if (game.state == " | ||
+ | togglePlayer(game); | ||
+ | } | ||
+ | // Update the HTML view. | ||
+ | updateHtml(grid, | ||
+ | // Update game status area to reflect active player / winner / tie | ||
+ | updateStatus(status, | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | #### Darstellung in HTML | ||
+ | |||
+ | Wenn der Spielzustand geändert worden ist, wird das HTML (genauer: das HTML _Document Object Model_ (DOM)) entsprechend angepasst: | ||
+ | |||
+ | Um die Darstellung des Spiels zu ändern, setzen wir den Text des Buttons | ||
<code javascript tictactoe.js> | <code javascript tictactoe.js> | ||
- | let color = game.next; | + | let color = game.board[cell]; // 1, or 2 |
- | button.innerText | + | button.textContent |
button.setAttribute(' | button.setAttribute(' | ||
</ | </ | ||
Zeile 84: | Zeile 133: | ||
<nodisp 2> | <nodisp 2> | ||
- | ++++Hinweise| | + | ++++Hinweise |
* [[ef_informatik: | * [[ef_informatik: | ||
* [[https:// | * [[https:// | ||
+ | * [[https:// | ||
++++ | ++++ | ||
</ | </ |