Tworzenie nowych obiektów (graczy) w klasie.
Ostatnio zmodyfikowano 2017-04-20 08:38
Alex_Cooperek Temat założony przez niniejszego użytkownika |
Tworzenie nowych obiektów (graczy) w klasie. » 2017-04-18 14:46:18 Dzień Dobry Chcę rozszerzyć grę w oczko o nowych graczy w zależności ile poda użytkownik. Tylko nie do końca wiem jak powinnam zmodyfikować konstruktor w oczko.cpp? Byłabym ogromnie wdzięczna, za jakieś wskazówki. Pozdrawiam Obiekt człowiek ma obowiązki jakby komputera, pyta graczy, czy chcą gra dalej. oczko.h #ifndef OCZKO_H #define OCZKO_H #include "talia.h" #include "czlowiek.h" class Oczko { Talia * t; Gracz * g[ 5 ]; public: Oczko(); ~Oczko(); void graj(); };
#endif
oczko.cpp #include "oczko.h" #include <iostream> using namespace std; Oczko::Oczko() { t = new Talia( 52 ); t->wartosciOczko(); for( int i = 0; i < 5; ++i ) { g[ i ] = NULL; } g[ 0 ] = new Gracz; g[ 1 ] = new Czlowiek; }
Oczko::~Oczko() { delete t; for( int i = 0; i < 5; ++i ) if( g[ i ] != NULL ) delete g[ i ]; }
void Oczko::graj() { t->tasuj(); bool warunek; do { warunek = false; for( int i = 0; i < 5; ++i ) { if( g[ i ] != NULL && g[ i ]->czyNastepna() ) { warunek = true; g[ i ]->dodajKarte( t->dajKarte() ); } } } while( warunek ); for( int i = 0; i < 5; ++i ) { if( g[ i ] != NULL ) { g[ i ]->wyswietl(); cout << "Punkty: " << g[ i ]->policzPunkty() << endl; } } }
|
|
michal11 |
» 2017-04-18 14:48:58 Twórz ich w tej pętli w konstruktorze a nie nullujesz elementy tablicy for( int i = 0; i < 5; ++i ) { g[ i ] = new Gracz; }
pamiętaj tylko, że nie możesz później zrobić g[ 1 ] = new Czlowiek; bo nadpiszesz istniejący element tablicy (i będziesz miała wyciek). Moim zdaniem, jeżeli Czlowiek jest unikalny dla gry to nie powinien być elementem tablicy tylko oddzielną zmienną. |
|
Alex_Cooperek Temat założony przez niniejszego użytkownika |
» 2017-04-18 16:00:28 Rzeczywiście udało mi się i tworzą się dodatkowi gracze. W pierwszej pętli tworzę osobno graczy i ludzi. Jeszcze chciałabym się zapytać, jak mogłabym dodawać nazwy dla wybranych graczy, ponieważ nie mogę zrobić takiej operacji string nazwa; for( int i = 0; i < liczba; i++ ) g[ i ] = nazwa;
Tutaj poprawiony już kod #include "oczko.h" #include <iostream> using namespace std; Oczko::Oczko() { t = new Talia( 52 ); t->wartosciOczko(); cout << "Podaj ilosc graczy: "; cin >> liczba_graczy; for( int i = 0; i < liczba_graczy; ++i ) { g[ i ] = new Gracz; c[ i ] = new Czlowiek; } }
Oczko::~Oczko() { delete t; for( int i = 0; i < liczba_graczy; ++i ) { delete g[ i ]; delete c[ i ]; } }
void Oczko::graj() { t->tasuj(); bool warunek; do { warunek = false; for( int i = 0; i < liczba_graczy; ++i ) { if( g[ i ]->czyNastepna() ) { warunek = true; g[ i ]->dodajKarte( t->dajKarte() ); } } } while( warunek ); for( int i = 0; i < liczba_graczy; ++i ) { g[ i ]->wyswietl(); cout << "Punkty: " << g[ i ]->policzPunkty() << endl; } }
|
|
michal11 |
» 2017-04-18 17:47:52 O jakie nazwy ci chodzi? Jeżeli o nazwę zmiennej to jest nią odpowiednia komórka pamięci, a jeżeli masz pole w klasie które się nazywa nazwa to musisz się do takiego pola odwołać albo bezpośrednio przez operator ./-> lub przez funkcję. |
|
Alex_Cooperek Temat założony przez niniejszego użytkownika |
» 2017-04-18 18:26:33 Chciałabym, by użytkownik mógł nazwać swojego gracza i poźniej w trakcie rozgrywki miałaby się ta nazwa wyświetlać. Np. Piotr Twoje karty to ... Jest na początku polecenie, by gracze podali swoje nazwy w grze i stworzyłam tablicę, która, by tą nazwę miała przechowywać dla konkretnego indeksu, tylko nie wiem jak umieścić polecenie czytania nazwy w funkcji graj, by nazwa mi w pętli się wyświetlała. #include "oczko.h" #include <iostream> using namespace std; Oczko::Oczko() { t = new Talia( 52 ); t->wartosciOczko(); cout << "Podaj ilosc graczy: "; cin >> liczba_graczy; string nazwa_gracza; string * tablica_nazw; tablica_nazw = new string[ liczba_graczy ]; for( int i = 0; i < liczba_graczy; ++i ) { g[ i ] = new Gracz; c[ i ] = new Czlowiek; cout << "Podaj nazwe swojego gracza: "; cin >> nazwa_gracza; tablica_nazw[ i ] = nazwa_gracza; } }
Oczko::~Oczko() { delete t; for( int i = 0; i < liczba_graczy; ++i ) { delete g[ i ]; delete c[ i ]; } }
void Oczko::graj() { t->tasuj(); bool warunek; do { warunek = false; for( int i = 0; i < liczba_graczy; ++i ) { if( g[ i ]->czyNastepna() ) { warunek = true; g[ i ]->dodajKarte( t->dajKarte() ); } } } while( warunek ); for( int i = 0; i < liczba_graczy; ++i ) { g[ i ]->wyswietl(); cout << "Punkty: " << g[ i ]->policzPunkty() << endl; } }
|
|
michal11 |
» 2017-04-18 18:45:24 Pokaż nagłówek klasy Gracz i Czlowiek (+ ew. jakieś klasy bazowe). |
|
Alex_Cooperek Temat założony przez niniejszego użytkownika |
» 2017-04-18 18:47:14 Nagłówek klasy gracz #ifndef GRACZ_H #define GRACZ_H #include "karta.h" #include <vector>
class Gracz { vector < Karta *> tablica; string nazwa_gracza; public: Gracz(); string dodaj_nazwe(); void dodajKarte( Karta * k ); void wyswietl(); int policzPunkty(); virtual bool czyNastepna(); };
#endif
Człowiek #ifndef CZLOWIEK_H #define CZLOWIEK_H #include "gracz.h"
class Czlowiek : public Gracz { public: Czlowiek(); bool czyNastepna(); };
#endif
|
|
michal11 |
» 2017-04-18 19:18:17 Dlaczego funkcja dodaj_nazwe zwraca stringa? Dodaj w klasie Gracz metodę void ustawNazwe( const std::string & nazwa ); w której będziesz ustawiała nazwę dla tego gracza i wywołuj ją w konstruktorze klasy Oczko na rzecz obiektu g[ i ] zaraz po wczytaniu nazwy. |
|
« 1 » 2 3 |