Kamień, Papier, Nożyce - nauka OOP

0

Witam,
Ostatnio z pomocą jednego z użytkowników tego forum(dzięki Sasik!), udało mi się napisać grę używając OOP. Gra była dość prosta i polegała na skreślaniu kresek z określonych wierszy. Ten kto skreślił ostatnią kreskę - wygrywał.

Ponieważ miałem braki i w sumie nadal mam (zdrowie nie dopisuje a zaległości duże na uczelni...) chciałbym was prosić o pomoc w skumaniu tego tematu. Nie oczekuję, że ktoś napisze za mnie cały program bo ten program pisze dla siebie samego jednak mam kilka problemów natury projektowej i nie tylko:(

A więc tak:

Chciałbym napisać grę "kamień, papier, nożyce" - napisać ją obiektowo.

Pierwsze pytanie jest takie, czy nadal mogę uzywać starego wydania symfonii C++. W święta będę w domu i mogę ją zabrać do kumpla. Wiem, że obecnie nie jest zgodna ze standardem jednak czy różnice są aż tak powalające (poza np using namespace std;), że nie warto w ogóle czytać tej książki i koniecznie kupować nową symfonię C++ Standard?

Drugie pytanie dotyczy bezpośrednio już same gry.

Zakładam, że będę miał tylko dwie klasy:

  • klasa Gra
  • klasa Gracz

Klasa gra powinna sterować całym przebiegiem gry(np poprzez funkcję graj), powinna pozwolić wykonać graczowi ruch, zliczać punkty i sprawdzać kto wygrał. Być może powinna też pytać gracza o imię. Mam problem z tym aby zdecydować czy np lepszym rozwiązanie jest np zaprojektowanie w klasie gra funkcji graj, która sterowałaby całym przebiegiem gry od początku do końca i wtedy wystarczy tylko stworzyć obiekt w main np na zasadzie:

int main()
{
Gra gra;
gra.graj();
}

W ten sposób działał poprzedni program. Teraz jednak zastanawiam się czy to najlepsze rozwiązanie czy też np funkcja maina powinna pytać graczy o imię i np czy obiekt gracz1 i gracz2 powinny być stworzone w klasie gra czy może bezpośrednio w funkcji main()? Dodatkowo muszę myśleć czy dana zmienna/funkcja powinna być publiczna czy prywatna nawet jeśli w tym programie nie ma to znaczenia ale chyba o to chodzi w OOP. Nie wiem czy to najlepszy pomysł bo sam program można by zawrzeć w funkcji main() bez tworzenia dodatkowych funkcji ale to pewnie nieetyczne :). Wiem, że trochę to chaotyczne ale chcę to skumać co by na egzaminie przed prowadzącym nie świecić gałkami ocznymi... Ehh wolałbym się tego uczyć niż całek wielokrotnych etc.

Ah i zapomniał bym dodać, obecnie jeszcze nie wiem nic o dziedziczeniu klas, typach wyliczeniowych etc. Chociaż widziałem i sprawdzałem program teog typu napisany obiektowo który mieścił się w "kilku liniach" kody a był napisany obiektowo. Szukałem też tutoriali w necie co np pokazały by właśnie na przykładzie jakiejś gry jak się do tego zabrać. Te co znalazłem po angielsku były dość mocno zaawansowane :).

0

int main()
{
Gra gra;
gra.graj();
};

Jak najbardziej poprawne, to najbliższe do 'czystego OOP' co możesz uzyskać w C++. Najlepiej żeby main robiła tylko i wyłącznie to co jest potrzebne do uruchomienia głównej (chociaż to złe określenie, bo takie coś z zasady nie powinno istnieć) klasy.

Dodatkowo muszę myśleć czy dana zmienna/funkcja powinna być publiczna czy prywatna nawet jeśli w tym programie nie ma to znaczenia ale chyba o to chodzi w OOP.

Co do zmiennych, sprawa jest prosta - prywatna - zawsze.
Jeśli chodzi o funkcje - możesz robić tak że na początku zastanawiasz się co ma właściwie robić klasa. Wtedy tworzysz nagłówek z deklaracjami metod publicznych.

class Fryzjer
{
public:
    void ZgolBrode(Czlowiek);
    void ZgolWasy(Czlowiek);
    void ZetnijNaLyso(Czlowiek);
}

Kiedy zaczynasz pisać, okazuje się że ten sam kod się powtarza - więc wydzielasz z tego metodę prywatną"

    void ZgolBrode(Czlowiek c) { ZetnijWlosy(c.Broda); }
    void ZgolWasy(Czlowiek c) { ZetnijWlosy(c.Wasy); }
    void ZetnijNaLyso(Czlowiek c) { ZetnijWlosy(c.Glowa.Wlosy); }

Ok, ale do rzeczy - programowanie obiektowe tutaj nie najlepiej pasuje, niestety - nie będzie z niego żadnych zysków.
Jeśli stworzysz klasy Kamien, Papier, Nozyce, tak czy inaczej będziesz musiał sprawdzać typ przekazanej klasy (kamień wygrywa tylko z nożycami a z papierem przegrywa etc). Bardziej by tutaj pasował po prostu enum i dwa ify na krzyż.

0

A czy stara symfonia C++ się nada(jeśli weźmie się poprawki na błędy tzn brak standaryzacji w starym wydaniu)?

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