# Szkic gry: Zastosuj wzorce projektowe ## Podsumowanie zadania Wykorzystaj swoją nowo nabytą wiedzę o wzorcach projektowych, tworząc prosty prototyp gry! To zadanie pomoże Ci poćwiczyć zarówno wzorce architektoniczne (dziedziczenie lub kompozycję), jak i system komunikacji pub/sub, który poznałeś podczas lekcji. ## Instrukcje Stwórz prostą reprezentację gry, która demonstruje wzorce projektowe z tej lekcji. Twoja gra powinna być funkcjonalna, ale nie musi mieć skomplikowanej grafiki – skup się na podstawowej architekturze i wzorcach komunikacji. ### Wymagania **Wybierz wzorzec architektury:** - **Opcja A**: Użyj dziedziczenia opartego na klasach (tak jak w przykładzie `GameObject` → `Movable` → `Hero`) - **Opcja B**: Użyj kompozycji (tak jak w podejściu fabryki funkcji z mieszanymi zachowaniami) **Zaimplementuj komunikację:** - **Dołącz** klasę `EventEmitter` do wiadomości pub/sub - **Skonfiguruj** co najmniej 2-3 różne typy wiadomości (np. `PLAYER_MOVE`, `ENEMY_SPAWN`, `SCORE_UPDATE`) - **Połącz** wejście użytkownika (klawiatura/mysz) z zdarzeniami gry poprzez system zdarzeń **Elementy gry do zawarcia:** - Co najmniej jedna postać sterowana przez gracza - Co najmniej jeden inny obiekt gry (wróg, przedmiot do zbierania lub element środowiska) - Podstawowa interakcja między obiektami (kolizja, zbieranie lub komunikacja) ### Proponowane pomysły na grę **Proste gry do rozważenia:** - **Gra w Węża** – segmenty węża podążają za głową, jedzenie pojawia się losowo - **Wariacja Pong** – paletka reaguje na wejście, piłka odbija się od ścian - **Gra Kolekcjonerska** – gracz porusza się, zbierając przedmioty i unikając przeszkód - **Podstawy Tower Defense** – wieże wykrywają i strzelają do poruszających się wrogów ### Wytyczne dotyczące struktury kodu ```javascript // Przykładowa struktura początkowa const Messages = { // Zdefiniuj tutaj wiadomości swojej gry }; class EventEmitter { // Twoja implementacja systemu zdarzeń } // Wybierz podejście oparte na klasach LUB kompozycji // Przykład oparty na klasach: class GameObject { /* base properties */ } class Player extends GameObject { /* player-specific behavior */ } // LUB przykład kompozycji: const gameObject = { /* base properties */ }; const movable = { /* movement behavior */ }; function createPlayer() { /* combine behaviors */ } ``` ### Testowanie twojej implementacji **Sprawdź, czy twój kod działa poprzez:** - **Testowanie**, czy obiekty się poruszają lub zmieniają po wywołaniu zdarzeń - **Potwierdzenie**, że wiele obiektów może reagować na to samo zdarzenie - **Sprawdzenie**, czy można dodać nowe zachowania bez modyfikowania istniejącego kodu - **Zapewnienie**, że wejście z klawiatury/myszy prawidłowo wywołuje zdarzenia gry ## Wytyczne dotyczące przesłania **Twoje zgłoszenie powinno zawierać:** 1. **Plik(i) JavaScript** z implementacją Twojej gry 2. **Plik HTML** do uruchamiania i testowania gry (może być prosty) 3. **Komentarze** wyjaśniające, który wzorzec wybrałeś i dlaczego 4. **Krótka dokumentacja** Twoich typów wiadomości i ich funkcji ## Kryteria oceny | Kryterium | Wzorowy (3 punkty) | Wystarczający (2 punkty) | Wymaga poprawy (1 punkt) | |-----------|--------------------|--------------------------|--------------------------| | **Wzorzec architektury** | Poprawna implementacja dziedziczenia LUB kompozycji z klarowną hierarchią klas/obiektów | Użycie wybranego wzorca z drobnymi problemami lub niespójnościami | Próba zastosowania wzorca, ale implementacja zawiera poważne błędy | | **Implementacja pub/sub** | EventEmitter działa poprawnie z wieloma typami wiadomości i prawidłowym przepływem zdarzeń | Podstawowy system pub/sub działa z częściową obsługą zdarzeń | System zdarzeń istnieje, ale nie działa niezawodnie | | **Funkcjonalność gry** | Co najmniej trzy interaktywne elementy komunikujące się za pomocą zdarzeń | Dwa interaktywne elementy z podstawową komunikacją zdarzeń | Jeden element reaguje na zdarzenia lub podstawowa interakcja | | **Jakość kodu** | Czysty, dobrze skomentowany kod z logiczną organizacją i nowoczesnym JavaScriptem | Ogólnie zorganizowany kod z adekwatnymi komentarzami | Kod działa, ale brakuje organizacji lub jasnych komentarzy | **Punkty dodatkowe:** - **Kreatywne mechaniki gry**, które pokazują ciekawe zastosowania wzorców - **Wielorakie metody wejścia** (zarówno zdarzenia z klawiatury, jak i myszy) - **Skalowalna architektura** łatwa do rozbudowy o nowe funkcje --- **Zastrzeżenie**: Niniejszy dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mimo że staramy się o dokładność, należy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub niedokładności. Oryginalny dokument w języku źródłowym powinien być uznawany za źródło ostateczne. W przypadku informacji krytycznych zaleca się skorzystanie z profesjonalnego tłumaczenia dokonanego przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z korzystania z tego tłumaczenia.