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-03 12:57] – [Client-Side Vier Gewinnt] 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 70: | Zeile 71: | ||
| 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. | ||
| * ... überprüft ob das Spiel zu Ende ist | * ... überprüft ob das Spiel zu Ende ist | ||
| Zeile 77: | Zeile 78: | ||
| * oder weil keine freien Felder übrig sind | * oder weil keine freien Felder übrig sind | ||
| * ... schaltet die Farbe des Spielers um. | * ... schaltet die Farbe des Spielers um. | ||
| + | |||
| + | 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 | #### Darstellung in HTML | ||
| - | Wenn der Spielzustand geändert worden ist, wird das HTML entsprechend angepasst: | + | Wenn der Spielzustand geändert worden ist, wird das HTML (genauer: das HTML _Document Object Model_ (DOM)) |
| - | Um die Darstellung des Spiels zu ändern, setzen wir den Text des Buttons. Für die Formatierung mit CSS speichern wir den Zustand zudem in einem Attribut `data-state`: | + | |
| + | Um die Darstellung des Spiels zu ändern, setzen wir den Text des Buttons | ||
| <code javascript tictactoe.js> | <code javascript tictactoe.js> | ||
| let color = game.board[cell]; | let color = game.board[cell]; | ||
| - | button.innerText | + | button.textContent |
| button.setAttribute(' | button.setAttribute(' | ||
| </ | </ | ||
| Zeile 102: | Zeile 133: | ||
| <nodisp 2> | <nodisp 2> | ||
| - | ++++Hinweise| | + | ++++Hinweise |
| * [[ef_informatik: | * [[ef_informatik: | ||
| * [[https:// | * [[https:// | ||