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

Gra w oczko - Pobieranie atrybutu z tablicy obiektów

Ostatnio zmodyfikowano 2020-05-04 11:34
Autor Wiadomość
Windica
Temat założony przez niniejszego użytkownika
Gra w oczko - Pobieranie atrybutu z tablicy obiektów
» 2020-05-01 19:53:12
Witam, mam do napisania program - grę w oczko, po drodze w jego pisaniu pojawił mi się problem z pobieraniem atrybutu poszczególnego obiektu z tablicy obiektów(za pomocą metody). Jeżeli chodzi o sam program to mamy go podzielić na 3 klasy - Karta, Gracz oraz Kasyno. Klasę karta otrzymaliśmy gotową oraz mamy do wykonania poszczególne zadania(np. ze Kasyno ma się składać z 51 kart itd. Mam świadomość że powinienem się posłużyć wskaźnikami, ale nie za bardzo wiem jak. Napisałem wstępnie coś takiego ale wydaję mi się że nie będzie to działać. Ale może od początku :
To są podstawowe atrybuty/metody klasy kasyno :
C/C++
class Kasyno
{
public:
    Karta * Karty[ 51 ];
    Gracz * Gracze[ 20 ];
    int daj_karte;
   
    void Tworz_talie() {
        int licznik = 0;
        for( int i = 0; i < 4; i++ ) // Tworzy 52 obiektow klasy karta
        {
            for( int j = 0; j < 13; j++ )
            {
                Karty[ licznik ] = new Karta( i, j );
                licznik++;
                cout << Karty[ licznik ] << endl;
            }
        }
    }
    void tasowanie() {
        for( int i = 0; i < 100; i++ )
        {
            srand( time( NULL ) );
            swap( Karty[ rand() % 51 + 0 ], Karty[ rand() % 51 + 0 ] ); // zamienia miejscami karty 100 razy
        }
    }
    Karta * dajKarte()
    {
        srand( time( NULL ) );
        do {
            int daj_karte = rand() % 51 + 0;
        } while( Karty[ daj_karte ] != NULL );
       
        Karty[ daj_karte ] = NULL;
        return Karty[ daj_karte ];
    }
Jeżeli chodzi o klase Karta to wygląda to tak:
w cpp mamy rozpisane wartosci, kolory i figury poszczegolnych
C/C++
class Karta {
private:
    char kolor;
    char figura;
    int wartosc;
public:
    Karta( int _kolor = 0, int _wartosc = 0 );
    void setKolor( int _kolor );
    void setWartosc( int _wartosc );
    char getKolor() const { return kolor; }
    char getFigura() const { return figura; }
    int getWartosc() const { return wartosc; }
    void wypisz() const { std::cout << figura << kolor << "\n"; }
};
karta cpp
C/C++
const char kolory[] = { 3, 4, 5, 6 };
const char figury[] = { '2', '3', '4', '5', '6', '7', '8', '9', 'D', 'J', 'Q', 'K', 'A' };
const int wartosci[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 11 };

Karta::Karta( int _kolor, int _wartosc ) {
    setKolor( _kolor );
    setWartosc( _wartosc );
}

void Karta::setKolor( int _kolor ) {
    if( _kolor < 4 ) {
        kolor = kolory[ _kolor ];
    }
}

void Karta::setWartosc( int _wartosc ) {
    if( _wartosc < 13 ) {
        figura = figury[ _wartosc ];
        wartosc = wartosci[ _wartosc ];
    }
   
}
A w klasie gracz wygląda to tak:
C/C++
class Gracz
{
    Karta * Karty_gracz[ 10 ];
    int suma = 0;
    int licznik_kart = 0;
    bool pass = false;
    //size_t liczba_kart = sizeof(Karty_gracz) / sizeof(Karty_gracz[10]);
    string nazwa_gracza;
   
    char PosiadaneKarty( Karta * _Karty_gracz )
    {
        for( int i = 0; i < licznik_kart; i++ )
        {
            char kolor = _Karty_gracz[ i ].getKolor();
            char figura = _Karty_gracz[ i ].getFigura();
            switch( kolor )
            {
            case 3:
                cout << figura << endl;
                cout << "Trefl" << endl;
                break;
            case 4:
                cout << figura << endl;
                cout << "Pik" << endl;
                break;
            case 5:
                cout << figura << endl;
                cout << "Kier" << endl;
                break;
            case 6:
                cout << figura << endl;
                cout << "Karo" << endl;
                break;
            default:
                cout << "Brak Kart" << endl;
                break;
            }
        }
       
    }
Niżej zadam pytanie :
1. Czy to w ogóle, będzie działać ? czy muszę pokombinować na wskaźnikach ?
2. Czy takie metody jak tu zrobiłem mają sens ? Ma to jakąś rację bytu, w sensie czy używanie metody wysyłając do niej poszczególny obiekt z tablicy obiektów jest w ogóle możliwe ? czy najpierw muszę się dostać do poszczególnego obiektu a dopiero potem wysłać go jako pojedyńczy obiekt, a nie obiekt w tablicy ?

dodatkowe:
3. Jak dopisać do konstruktora klasy,w której jest użyta zmienna char[20] nazwe podawaną przez użytkownika ? Trzeba przeciążyć operator ?

Pozdrawiam i z góry dziękuję za pomoc :)
P-176763
pekfos
» 2020-05-01 21:32:09
Czy to w ogóle, będzie działać ? czy muszę pokombinować na wskaźnikach ?
A nie działa?

Czy takie metody jak tu zrobiłem mają sens ? Ma to jakąś rację bytu, w sensie czy używanie metody wysyłając do niej poszczególny obiekt z tablicy obiektów jest w ogóle możliwe ? czy najpierw muszę się dostać do poszczególnego obiektu a dopiero potem wysłać go jako pojedyńczy obiekt, a nie obiekt w tablicy ?
Metoda zawsze działa na jednym obiekcie. Nie ma znaczenia, skąd go masz.

Jak dopisać do konstruktora klasy,w której jest użyta zmienna char[20] nazwe podawaną przez użytkownika ?
Dodaj argument do konstruktora?

C/C++
void tasowanie() {
    for( int i = 0; i < 100; i++ )
    {
        srand( time( NULL ) );
        swap( Karty[ rand() % 51 + 0 ], Karty[ rand() % 51 + 0 ] ); // zamienia miejscami karty 100 razy
    }
}
Karta * dajKarte()
{
    srand( time( NULL ) );
    do {
        int daj_karte = rand() % 51 + 0;
    } while( Karty[ daj_karte ] != NULL );
   
    Karty[ daj_karte ] = NULL;
    return Karty[ daj_karte ];
}
Kompletnie bez sensu. Nie powinno tu być wywołań srand(). Jak już masz potasowane karty, to by pobrać przypadkową kartę wystarczy pobrać pierwszą z brzegu. Nie tak to działa w prawdziwym świecie? Po to tasujesz karty, by nie robić takiego paskudnego algorytmu jaki masz w dajKarte(). Jak została na stole jedna karta, będziesz robić potencjalnie kilkadziesiąt prób, żeby ją zabrać? Bardzo nie jak w prawdziwym świecie. Pomijam już że kod jest tam całkowicie błędny, bo masz dwie niezależne zmienne daj_karte.
P-176764
Windica
Temat założony przez niniejszego użytkownika
» 2020-05-01 22:34:32
Z tym tasowaniem masz racje, nie pomyślałem :) Mój błąd.
Jeżeli chodzi o wpisywanie nazwy to tak zrobiłem:

' char nazwa_gracza;


Gracz(char _nazwa_gracza)
{
nazwa_gracza = _nazwa_gracza;
}
'


' int ile_graczy;
char nazwa;
cout << "Ile gracz wezmie udzial w rozgrywce?" << endl;
cin >> ile_graczy;
for (int i = 0; i <= ile_graczy; i++)
{
cout << "Podaj Nazwe" << i << "Gracza" << endl;
cin >> nazwa;
Gracze = new Gracz(nazwa);
}
'
ale wywala błąd, stąd pytanie.
Dzięki za pomoc jeszcze raz.
P-176765
pekfos
» 2020-05-02 00:16:24
A jaki błąd?
P-176769
Windica
Temat założony przez niniejszego użytkownika
» 2020-05-02 09:37:26
Błąd (aktywny) E0330 element "Gracz::Gracz(char _nazwa_gracza)" (zadeklarowane w wierszu 15 w "Gracz.h") jest niedostępny Oczko Kasyno.h 51

wiersz 15 to wiersz konstruktora, 51 to moment tworzenia obiektu - Gracz(nazwa).

Dodatkowo po najechaniu pojawiło się +2 przeciążenia.
P-176774
pekfos
» 2020-05-02 13:00:59
Konstruktor powinien być publiczny w tym wypadku.
P-176777
Windica
Temat założony przez niniejszego użytkownika
» 2020-05-02 17:56:51
Dzięki, to rozwiązało sprawę. Mam jeszcze jedno pytanie. Chce dać kartę za pomocą stworzonych wcześniej metod i pisze coś takiego :
Gracze.wezkarte(Kasyno::dajKarte());

pisze mi błąd że wyrażenie musi mieć typ klasy

pisze miejsce w tablicy Gracze ale automatycznie mi to bierze jako zakrzywianie ;p
P-176786
jankowalski25
» 2020-05-02 19:31:40
automatycznie mi to bierze jako zakrzywianie ;p
Tak. Znacznik [i] oznacza kursywę. Między innymi dlatego kod należy wstawiać wewnątrz [cpp]/*tutaj kod*/[/cpp], żeby uniknąć takich efektów ubocznych działania parsera.

pisze mi błąd że wyrażenie musi mieć typ klasy
Bo to wskaźnik, a skoro tak, to należy użyć strzałki, a nie kropki.
P-176789
« 1 » 2
  Strona 1 z 2 Następna strona