[C++] Gra w statki - obiektowo

Leogict
Użytkownik
Użytkownik
Posty: 40
Rejestracja: 21 mar 2008, o 20:01
Płeć: Mężczyzna
Podziękował: 14 razy

[C++] Gra w statki - obiektowo

Post autor: Leogict »

Witam, napisałem w C++ grę w statki obiektowo.
1 gracz, komputer ustawia losowo statki a my strzelamy.

Plansza: 16x16, rozmieszczanie statków: losowe (w dużej części udało mi się uniknąć krzyżowania i stykania statków), chociaż warunki na krzyżowanie i stykanie nie sa jeszcze idealne, sporadycznie programowi zdarza się stykać statki...

Statki: 2 czteromasztowce i 2 trójmasztowce, więcej nie dałem ze względu na rozbudowane warunki dot. nie krzyżowania się statków każdego z każdym...

Osobna klasa na maszty (każdy maszt wie, jakiego jest typu), plansze, 4-masztowce i 3-masztowce

Gra działa pod Windowsem i Linuxem (wystarczy zmienić jedna zmienna boolowską - ta pod "using namespace...")

Opcja testowania (widac statki) i gry (nie widać statków) - również zmiana jednej zmiennej na początku kodu.

Graficzna sygnalizacja trafienia (zmiana znaku masztu na "o") oraz zatopienia statku (zmiana znaków w obrębie statku na "" )

Zabezpieczenie przed wprowadzeniem złych współrzędnych.

Program po każdym ruchu odświeża plansze i wypisuje ilość pływających statków.

Warunek końca programu: wszystkie statki zestrzelone lub użytkownik wciśnie "0".

Po zatopieniu wszystkich statków program wyświetla liczbę wykonanych ruchów (strzał 2 razy w to samo pole traktowany jest jako 2 ruchy itd).

Numerowanie linii w pionie i poziomie.
Szansa na trafny strzał: ok. 5,5% (obsadzenie planszy: 14/256 pol)
Szczątkowy polimorfizm.


Kod:

Kod: Zaznacz cały

http://wklej.org/id/217640/

Binarka: (skompilowane pod kątem Windowsa, na Linuxie wyświetlanie może się rozjeżdżać - trzeba by przekompilować ze zmianą zmiennej w 27 linii kodu).

Czekam na opinie
exother
Użytkownik
Użytkownik
Posty: 97
Rejestracja: 28 wrz 2009, o 15:01
Płeć: Mężczyzna
Podziękował: 3 razy
Pomógł: 9 razy

[C++] Gra w statki - obiektowo

Post autor: exother »

Jeszcze tylko przepisanie do GTK-- i będzie ok : D

Chociaż mógłbyś wybór systemu zrobić na początku skryptu...
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[C++] Gra w statki - obiektowo

Post autor: soku11 »

@up:
Jak to sobie wyobrażasz?
I to nie jest skrypt


Co do samego kodu:
1. Zamiast bool linux=true; lepiej zastosować dyrektywę ifdef. Wtedy preprocesor jeszcze przed kompilacją wyrzuci ci kod dla innego systemu i unikniesz sprawdzania warunku o system w trakcie działania aplikacji. W końcu i tak na innym systemie trzeba aplikację przekompilować. Mógłbyś zrobić to np. tak:

Kod: Zaznacz cały

#ifdef LINUX
class Console
{
  public:
    void clearScreen()
    {
      system("clear");
    }
};
#else
class Console
{
  public:
    void clearScreen()
    {
      system("cls");
    }
};
#endif

// gdzies w kodzie:
Console console;
Ogólnie plus za napisanie również pod linuxa
O używaniu funkcji system (ble) w sumie już nie będę wspominał.
2. Warto podzielić kod na moduły - łatwiej by się czytało i wychwytywało zależności.
3. Rzeczywiście polimorfizm baaaardzo naciągany.
4. Nie podoba mi się komentowanie rzeczy oczywistych typu konstruktory czy wskaźniki. Komentuje się tylko linijki, z których jasno nie wynika co one robią.
5. Po co aż maszt***? Nie mógłbyś użyć chociażby maszt**? Tak robisz sieczkę z pamięci.
6. Klasa statek - czy nie lepiej tam zrobić funkcje czysto wirtualne, skoro statek sam w sobie nie istnieje?
7. I ogólnie widać kod napisany bez projektowania. Porozrzucane zmienne globalne, mnóstwo zależności, etc.
8. Samej funkcji main mi się nie chciało analizować - za dużo jakichś kombinacji
9. Plus za poprawne używanie nagłówków - cmath, a nie math.h - jak co po niektórzy...

Pozdrawiam.
Leogict
Użytkownik
Użytkownik
Posty: 40
Rejestracja: 21 mar 2008, o 20:01
Płeć: Mężczyzna
Podziękował: 14 razy

[C++] Gra w statki - obiektowo

Post autor: Leogict »

O używaniu funkcji system (ble) w sumie już nie będę wspominał.
A znasz inny prosty sposób na wyczyszczenie ekranu konsoli? ;D
2. Warto podzielić kod na moduły - łatwiej by się czytało i wychwytywało zależności.
A nie mam podzielonego? Na klasy, funkcje, itp...
4. Nie podoba mi się komentowanie rzeczy oczywistych typu konstruktory czy wskaźniki. Komentuje się tylko linijki, z których jasno nie wynika co one robią.
Wiesz, ja tam komentuję nawet rzeczy oczywiste (dla jednego oczywiste, dla kogo innego nie), aby ktoś kto będzie czytał mój kod wiedział o co chodzi i ja jak wrócę do tego kodu za x czasu też żebym wiedział a nie domyślał się.
5. Po co aż maszt***? Nie mógłbyś użyć chociażby maszt**? Tak robisz sieczkę z pamięci.
To *** jest dobrze, to wskaźnik do tablicy wskaźników na maszty, tak ma być.
6. Klasa statek - czy nie lepiej tam zrobić funkcje czysto wirtualne, skoro statek sam w sobie nie istnieje?
Słuszna uwaga, dzięki. Bo w sumie ta klasa jest tylko "rusztowaniem", nie tworzymy obiektów tej klasy.
7. I ogólnie widać kod napisany bez projektowania. Porozrzucane zmienne globalne, mnóstwo zależności, etc.
Dopiero się uczę...
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[C++] Gra w statki - obiektowo

Post autor: soku11 »

Nie będę się czepiał, ale w C++ nie ma czegoś takiego jak konsola Ale odpowiadając:
Konsoli nie da się wyczyścić. Tak naprawdę system("cls"); etc to po prostu:

Kod: Zaznacz cały

cout<<"



















";
Najlepiej widać to właśnie pod linuxem. Zresztą nic wielkiego w aplikacji strumieniowej niestety nie zrobisz :/ No chyba, że użyjesz biblioteki typu curses (albo samemu pobawisz się obsługą terminala), która umożliwia już modyfikowanie poszczególnych "kratek okna".


Co do modułów:
Chodziło mi o podzielenie na moduły fizyczne. Tzn. plik *.h (*.hpp, etc) + *.cpp. Nie dość, że wtedy łatwiej jest się połapać w kodzie, to nie musisz kompilować całego projektu, tylko zmieniające się moduły.

4. Myślę, że łatwiej jest się domyśleć co oznacza:

Kod: Zaznacz cały

plansza::plansza()  // konstruktor planszy
niż linijka (sic!) typu:

Kod: Zaznacz cały

} while((abs(iks_-Orzel.iks)<3 && (abs(igrek_ - Orzel.igrek)<3) || (abs(iks_ - Jastrzab.iks)<3 && abs(igrek_ - Jastrzab.igrek)<3) || (abs(iks_ - Hawk.iks)<2) && abs(igrek_ - Hawk.igrek)<3));

5. Nie napisałem przecież, że to jest źle. Napisałem tylko, że bez sensu. Można użyć ** i masz wtedy bardziej spójny obszar pamięci.

7. Wiem - dlatego to napisałem. Najlepiej się od razu nauczyć dobrych nawyków. Bo po tym kodzie widać, że pisałeś, a w trakcie pisania problemy rozwiązywałeś. Miałem (wciąż mam?) to samo


Mimo wszystko gratulację ukończenia gry
Pozdrawiam.
exother
Użytkownik
Użytkownik
Posty: 97
Rejestracja: 28 wrz 2009, o 15:01
Płeć: Mężczyzna
Podziękował: 3 razy
Pomógł: 9 razy

[C++] Gra w statki - obiektowo

Post autor: exother »

Tak, nie skrypt ;p

Oczywiście żartowałem z tym GTK--, ale chętnie bym widział tą grę w jakimś interfejsie graficznym - nie przepadam za grami w konsoli, jednak wiem i rozumiem, że ma to być wytwór czysto 'dla treningu'.

Faktycznie, system(),y są niepotrzebne, skoro 'czyszczenie' polega na zjechaniu kilka[naście] linijek w dół.

I jeszcze nie podobają mi się współrzędne - przyzwyczaiłem się, że x oznacza odcięte, a y rzędne, tutaj jest odwrotnie ;f.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[C++] Gra w statki - obiektowo

Post autor: soku11 »

@exother:
Nie chodziło mi o ideę samego GTK, tylko o wybór systemu. Jakoś sobie nie mogę tego wyobrazić...
A co do współrzędnych, to lepiej by było jakby było w jednej osi np. abcd... a w drugiej liczby

Pozdrawiam.
ODPOWIEDZ