Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Gra typu Monopoly, problem ze stworzeniem planszy

Ostatnio zmodyfikowano 2014-05-25 14:48
Autor Wiadomość
kamilall234
Temat założony przez niniejszego użytkownika
[C++] Gra typu Monopoly, problem ze stworzeniem planszy
» 2014-05-22 21:36:43
Witam. Od kilku dni piszę grę, narazie w konsoli potem musze przełożyć ją na grafike 2D razem z kolegą, żeby oddać na uczelni. Mam teraz pytanie odnośnie tworzenia planszy, poniżej wrzucam zdjęcie i relacje klas. Są one przykładowe ponieważ w trakcie pisania i tak bardzo dużo funkcji mi dochodzi jeszcze.
Prosze tylko o podpowiedź, jak tworzyć plansze ? Założyłem że w clasie Plansza będę miał
vector < Pole > pola
 i w nim będę tworzył plansze, a potem będę się przesuwał graczami po tym vectorze. Otóż pytanie gdzie mam tworzyć pola typu miasto, załóżmy. Raczej nie robić tego w konstruktorze prawda ? Przypomne jeszcze, że będę odczytywał pola  z pliku tekstowego.
Zatem jak najlepiej to zrobić?
W klasie plansza mam stworzyć funkcję, która będzie wywoływać konstruktory Miasto i odczytywać po kolei z pliku ?


Opis wstawianej grafiki
Opis wstawianej grafiki
 
Albo zrobić w clasie Plansza, dodatkowo wektory do Miast i innych kart do kupienia, wczytać je razem z danymi ich z pliku, a potem polosować z innymi kartami w wektorze Pola ? tylko czy nie strace dostepu do niektórych atrybutów ? Bo klasa pole to najwyższa klasa :?

Prosze o pomysł jak tworzyć Plansze, za pomocą obiektu plansza.
P-110673
michal11
» 2014-05-22 22:16:48
1. Jeżeli chcesz docelowo stworzyć grę 2D to rób to od razu, takie zmienianie z konsoli na 2D nie będzie później przyjemne.

2. Z tego co zrozumiałem to chcesz stworzyć planszę z różnymi polami. Masz klasę Pole, z której dziedziczą różne typy pól. I klasę Plansza, która jest złożona z Pól. W takim przypadku wystarczy jako składową Planszy dać
vector < * Pole > pola
. Następnie w konstruktorze Planszy tworzysz sobie dynamicznie różne pola np.
C/C++
{
    pola.push_back( new Misto( arugmentyKonstruktoraMisto ) );
    pola.push_back( new START( arugmentyKonstruktoraSTART ) );
    pola.push_back( new KartaSzansy( arugmentyKonstruktoraKartaSzansy ) );
    //itd.
}

oczywiście, teraz wystarczy tylko dodać mechanizm odczytywania z pliku i odpowiedniego dopasowania konstruktorów oraz w destruktorze dodać w pętli
delete pola[ i ]
 żeby nie było wycieków pamięci.
P-110676
kamilall234
Temat założony przez niniejszego użytkownika
» 2014-05-22 22:44:32
Dzięki wielkie ! Tego właśnie potrzebowalem ! Właśnie już walcze z odpowiednim przypisywaniem!

Edit:
michal11 jaką biblioteke do 2D polecasz ? Qt czy SFML ? W tej grze nie ma prawie ruchu, dodam jeszcze że muszę dorobić połączenie internetowe na samym końcu.

Nie znam żadnej biblioteki do 2D dlatego chce najpierw w konsoli zobaczyć jak ma ta gra działać, potem natomiast przerobić to na 2D.
P-110681
michal11
» 2014-05-23 01:11:52
Zdecydowanie SFMl, szczególnie, że jest tam moduł sieciowy.
P-110704
kamilall234
Temat założony przez niniejszego użytkownika
» 2014-05-23 01:43:41
Dobra, teraz kolejne pytanie. Do tego co mi podałeś z tymi vectorami. Wszystko działa itd. Ale trwie nad jedną sprawą już dobrą godzine.

Robie tak jak napisałeś:

vector < Pole *> pola

odczytuje potem z pliku odpowiednią sekwencję, wszystko gra itd, tylko problem jest że u mnie o mieście wyświetla wszystko funkcja z klasy Miasto, jak teraz odwołać się do funkcji
void wyswietl_info()
 skoro nasze
pole[ i ]
jest vectorem Pole* ? Przypomne że vecotr Pole* tworzymy w klasie Plansza, a Plansza komunikuje się z Pole, którego Miasto jest klasa pochodną 2 rzędu.

Próbue już sekwencji :

pola[ i ]->Miasto::wyswietl();

Ale to daje
Miasto is not base of Pole

Poniżej zamieszczam uproszczony kod :

C/C++
class Pole //klasa bazowa
{
private:
    string nazwa;
    string kolor;
    int nr;
    int rodzaj_pola;
   
public:
    Pole( string, string, int, int );
    virtual void kup();
    virtual ~Pole() { };
};

class Pole_Do_Kupienia
    : public Pole
{
private:
    int cena;
    int hipoteka;
    int przynaleznosc; // musimy wiedziec do kogo należy dane miasto
   
public:
    Pole_Do_Kupienia( int, int, int, string, string, int, int );
    virtual void kup(); //=0;
    virtual void sprzedaj(); //=0;
    virtual void zastaw(); //=0;
    virtual int kara_za_postoj(); //=0;
    ~Pole_Do_Kupienia() { };
};

class Miasto
    : public Pole_Do_Kupienia
{
private:
    string panstwo; //przynaleznosc do panstwa
    int cena_za_dom;
    int cena_za_hotel;
    int numer_miata;
    int ilosc_domow; //sprawdza ilosc domow w miescie;
public:
    Miasto( string, int, int, int, int, int, int, string, string, int, int );
    void postaw_dom( int ) { }; //argument int odpowiada ilosci domow
    void zburz_dom( int ) { }; //argument int odpowiada ilosci domow
    void wyswietl(); //<------ ta funkcja wyswietla wszystkie info o Polu Miasto, z Pola_Do_Kupienia i Pola włącznie
    void sprzedaj() { };
    void zastaw() { };
    int kara_za_postoj() { };
    ~Miasto() { };
   
};

class Plansza
{
private:
    int ilosc_pol = 40;
    int ilosc_panstw = 8;
    int ilosc_dworcow = 4;
    int ilosc_szans = 6;
    int wod_i_el = 2; //ilosc wodociagow i elektrowni
    int ilosc_wiezien = 2;
    int ilosc_parkingow = 2;
    vector < Pole *> pola;
   
   
public:
    Plansza();
    ~Plansza();
    void wyswietl(); // <-------------------- tutaj chcemy wyswietlić miasta które wczytalismy do vectora, jak przejsc do
    //funkcji wyswietl, zawartej w  klasie Miasto ?
};
P-110705
Moorfox
» 2014-05-23 02:07:17
Rozumiem ze chcesz wywolac metode klasy pochodnej poprzez obiekt klasy bazowej ? Jesli tak to sie nie da, da sie jedynie na odwrot tzn obiekt klasy pochodnej wywoluje metode klasy bazowej miedzy innymi dlatego nazywa sie to dziedziczenie
Jest ojciec co umie rzecz a i Jest dziecko ktore odziedziczylo umiejetnosc a i dodatkowo nauczylo sie b
Ale nie slyszalem o Ojcu ktory dziedziczy po dziecku...
Czy ta gra to nie troche za duze wyzwanie dla ciebie ?
P-110706
kamilall234
Temat założony przez niniejszego użytkownika
» 2014-05-23 02:11:52
No ok. Ja to wiem. Tylko jak teraz tym wektorem vector, mam wyświetlić te dane o Mieście ?

Ta gra jest pisana na zaliczenie, nic nie poradze musze nad nią siedzieć

Edit:

Chyba wiem jak to rozwiążę.

Mogę zrobić dwa vectory ?
C/C++
vector < Miasto *> miasteczka;
vector < Karta Szansy *> szanse;
vector < Inne_kart *> inne_karty;

oraz stworzyć pomieszany :

vector < Pole *> pola

który będzie mieszał podstawowe dane z tamtych vectorów (z bazowej clasy Pole) tzn nazwe, panstwo, kolor i tworzył z nich plansze ?
P-110707
Moorfox
» 2014-05-23 02:46:29
Sorry ze tak dlugo male problemy;/
Ale kapuje juz o co chodzi ci dodajesz dynamiczne utworzone obiekty klas pochodnych
C/C++
virtual void wyswietl() = 0;
Dodaj taka funkcje publiczna do klasy Pole
P-110708
« 1 » 2
  Strona 1 z 2 Następna strona