Tetris obiektowo

0

Witam wszystkich którzy zechcą mi udzielić paru rad.
Muszę napisać na czerwiec tetris obiektowo w C++, program ma wykorzystywać dziedziczenie i polimorfizm, wzorce, wyjątki, strumienie (dowolne jedno można pominąć) genrealnie moja przygoda z obiektówką się dopiero zaczyna. Od razu piszę, że nie proszę o kod, broń boże ! Chce sobie to sam napisać, jednak nie wiem jak się za to zabrać od strony obiektowej... Napisałem rok temu tetrisa w C, więc z logiką problemów mieć nie powinienem..
Bardzo proszę o pomoc. Jedyne co 'wiem' to tyle że można zrobić klasę klocek, i różne typy klocka mogą po niej dziedziczyć. Co dalej? W jakich fragmentach kodu można wykorzystać wymienione cechy obiektowe?

1

To, ze nie prosisz o kod widac juz po tym, ze bierzesz sie do pracy teraz a nie pod koniec maja. Plus +.
Klasa klocek to jedno, ale druga klasa, to mapa na ktorej tp wszystko sie bedzie odbywalo, to juz dwie klasy. Mapa moglaby byc singletonem i wtedy wykorzystalbys wzorzec projektowy. Moglbys tez na punktacje zrobic kolejna klase, przeladowanie operatora wypisywaloby np liczbe uzyskanych punktow. Postaraj sie metody zamknac w tych klasach aby nie tworzyc funkcji globalnych. Wyjatkiem wyrzuconym mogloby byc zapelnienie mapy klockami

0

Ja widzę, że Ty nie masz jeszcze pojęcia czym jest obiektowość. Mnie robi się słabo jak pomyślę Sobie, że miałbym napisać tetrisa bez obiektowości, a Ty masz na odwrót. Chyba musisz zacząć czytać jakąś mądrą książkę dopóki Tobie nie zrobi się tak samo jak mi..

1

Ja bym zrobił klasę klocek posiadającą mapę klocka. Największy klocek to 4 częściowa linia, więc mapa to 4x4. Pole 0 jest puste, pole zapełnione to klocek. Może to być flaga bitowa oznaczająca obecność, kolor albo nawet obrazek. Zachowanie klocków jest identyczne niezależnie od kształtu, tworzenie osobnych klas dla każdego typu klocka to absurd, ale można je zrobić, po prostu z inną domyślną mapą.
Metoda obrocLewo/obrocPrawo po prostu obraca mapę (kod taki sam dla każdego klocka) itd.

Za wszystko odpowiada główna klasa CGra, sprawdza czy ruch jest dozwolony, przesuwa klocek w dół co jakiś czas (można z tego zrobić osobny obiekt wysyłający powiadomienie - wzór obserwatora? albo bezpośrednio), usuwa pełne linie, wywołuje rysowanie wszystkiego i posiada mapę całej planszy. Do obsługi klawiatury nadaje się wzorzec obserwatora.
Jeszcze klasa do rysowania z ogólnymi metodami i dziedzicząca dla klasy specjalistycznej, która rysuje używając konkretnego api. Klasa dostawałaby mapę do rysowania wraz z współrzędnymi. Można do rysowania użyć wzorca mostu, niepotrzebny ale pasuje.

Można zastosować wzór mediatora dla połączenia funkcjonalności rysowania i logicznej obsługi gry. Można zrezygnować z wzoru obserwatora i włożyć tam też obsługę klawiatury. Zależy od filozofii czy traktujemy wejście jako zdarzenie czy jako stan który może się ew. zmienić.

Tak z grubsza tyle. Ten design umożliwia w prosty sposób różne kolory dla różnych klocków, w zależności od czasu powstania, typu, itd. Można pokombinować tworząć klasę CMapa i przerzucająć część obowiązków na nią...

Wyjątki - dla błędów, np. opengl/cośtam się nie chce zainicjalizować... nie podoba mi się pomysł używania wyjątku jako sygnału końca gry.

Strumienie... można czytać pliki z czymś, może z tablicą wyników?

Uważaj na naturalną pokusę tworzenia rozwiązań ogólnych które umożliwią przeróbkę tetrisa na strzelankę ;) tzw. overengineering. Ktoś kiedyś powiedział "programiści lubią rozwiązywać interesujące problemy więc je tworzą" :)
Tutaj można zastosować większość wzorów projektowych i napierdolić masę klas - tylko po co. Przykładem takiej masturbacji wzorcami byłoby np. użycie wzorca stanu dla obracania klocków :o

Pisząc po ludzku tutaj nie ma miejsca dla wzorców i oop w ogóle poza interakcją z api do rysowania/obsługi klawiatury, a i to tylko po to żeby łatwo było zmienić na inne, co nie ma tutaj żadnego sensu, bo po to są ogólne api jak allegro czy SDL. Kod jest tak prosty, że szybciej napisać całość bez zbędnego oop, bo wszystkiego jest jedna sztuka i nigdy nie będzie rozszerzane - tetris to tetris. Singletony bez dziedziczenia to tylko mądrzejsza nazwa dla zmiennych globalnych i funkcji, a co tu dziedziczyć z głównej gry?

0

To jest grubą przesadą. to, że można napisać, to bez oop nie oznacza, że nie ma dla nich miejsca. Zwłaszcza, że temp113 podał założenia.

Napisałem cały post zgodnie z tymi założeniami, w przeciwieństwie do twojego burackiego odesłania do książek. Skończ z masturbacją do samego Siebie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1