Reklama
Pokazuje wyniki od 1 do 14 z 14

Temat: [C++] gra w karty

  1. #1

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny [C++] gra w karty

    Ostatnio trochę zacząłem bawić się C++, jednak dotychczas programowałem głównie w Javie i nie bardzo mogę się odnaleźć w cpp... po obejrzeniu jakiegoś kursu na yt i zabawy na wskaźnikach itp, postanowiłem napisać prostą grę w karty, niestety problem napotkałem już na samym starcie.
    Tak prezentuje się mój jakże zaawansowany kod do tej pory

    klasa reprezentująca kartę, chyba nie trzeba nic tłumaczyć
    Kod:
    class Card
    {
    private:
    	string suit;
    	string face;
    public:
    	Card(){}
    	Card(string f, string s){
    		face = f;
    		suit = s;
    	}
    	string getCard(){
    		return (this->face + " of " + this->suit + "s");
    	}	
    };
    no i klasa która ma reprezentować talię kart, czyli tablicę 52 elementów, zawierającą obiekty typu Card
    Kod:
    class Deck : Card
    {
    private:
    	Card deck[52];	
    public:
    	Deck(){		
    		Card *aceh = new Card("ace", "heart");
    		deck[0] = *aceh;
    	}		
    };
    Niestety gdy próbuje to jakoś wywołać w main to nic nie działa... jedyny kompilujący się zapis to
    Kod:
    int main(void){
    	Deck *deckOfCards = new Deck();
    	cout << deckOfCards[0].getCard;
    	
    
    	system("PAUSE");
    }
    niestety wywala on
    1>card.cpp(7): error C2011: 'Card' : 'class' type redefinition
    1>card.cpp(7) : see declaration of 'Card'
    1>deck.cpp(7): error C2504: 'Card' : base class undefined
    1>deck.cpp(12): error C2027: use of undefined type 'Card'
    1> card.cpp(7) : see declaration of 'Card'

  2. #2

    Data rejestracji
    2010
    Posty
    13
    Siła reputacji
    0

    Domyślny

    To co wrzuciłeś to cały kod? Masz to rozbite na pliki? Bład o redefinicji klasy może wskazywać, że nie masz include guardow.

    No i jesteś pewien, że Deck ma dziedziczyć po klasie Card?

  3. Reklama
  4. #3
    Avatar Pumpkin
    Data rejestracji
    2010
    Posty
    3,034
    Siła reputacji
    16

    Domyślny

    poczytaj o rozbijaniu na pliki.
    Z tego co widzę to w ogóle nie masz plików nagłówkowych .h


    Zacznij od tego ze wywal pliki cpp i zostaw sobie tylko maina. I do maina wrzuc powyżej zawartość dwóch paragrafów co teraz je masz w osobnych plikach. I już się powinno zbudować
    Potem sobie poczytaj o tym gdzie ma być implementacja a gdzie interfejs i rozdziel na pliki .h

    @edit
    no i jak pan up powiedzial to dziedziczenie bez sensu jest bo wystarczy że już deck zawiera taki obiekt i wcale nie potrzebujesz dziedziczenia. I w ogole chyba deck powienien miec jakas metode ktora zwroci ci karte z tablicy. Bo teraz to chyba nie jestes swaidom jakie gunwo zrobiles xD. Uzywasz dziedziczenia a potem tworzysz nowy obiekt i masz do niego wkaznik. A potem chcac sie dostac do karty o indeksie 0 sie tak naprawde dostajesz do tego obiektu całego a nie do tablicy XD
    I w ogole na tym obiekcie wywolujesz metode getCard ktora ci zwroci karte ale wcale nie z tej tablicy kart ale membera klasy ktora odziedziczyles. A do tego to sie nie stanie bo uzyles prywatnego dziedziczenia wiec nie bedziesz mial dostepu do tej funkcji XDD o kurwa

    mam nadzieje ze bylem pomocny
    Ostatnio zmieniony przez Pumpkin : 02-02-2017, 16:24
    Cytuj wampiirr napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Leki które aktualnie mają wartość 200zł, po refundacji płacimy 50 zł, a za Korwina będą kosztowały 10zł. Bardziej tak

    Cytuj wampiirr napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    (...)bo był honorowym rycerzem w porównaniu do tego gościa, który oddał bez walki zamek.

  5. #4

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny

    Nie jestem tego dziedziczenia pewien, no ale nie bardzo wiem jak to inaczej rozwiązać.
    Mam klasę Card, a w niej metodę getCard() która zwraca stringa np. "ace of hearts".
    Mam klasę Deck, w której konstruktorze wypełniam tablicę wskaźnikami na obiekty typu Card.
    No i mam metodę main, w której tworzę obiekt klasy Deck (czyli ów tablicę) i chciałbym mieć dostęp do tej tablicy i móc póki co chociaż wywołać to getCard, no i jedynie dziedziczenie bądź friend wchodzi w grę tutaj? (co do friend to od pewnego senior developera się dowiedziałem, że jeżeli w kodzie jest użyta przyjaźń to znaczy że kod jest źle napisany xd)

    No a co do mojego kodu, są oczywiście jeszcze nagłówki. Z tym, że wprowadziłem tutaj drobną zmianę po tym co napisałeś, usunąłem #include "Card.cpp" z test.cpp i wygląda to tak

    deck.cpp
    Kod:
    #include <iostream>
    #include "Card.cpp"
    
    using namespace std;
    card.cpp
    Kod:
    #include <iostream>
    #include <string>
    using namespace std;
    test.cpp
    Kod:
    #include <iostream>
    #include "Deck.cpp"
    Zmieniło się tyle, że teraz mam taki error

    error C3867: 'Card::getCard': function call missing argument list; use '&Card::getCard' to create a pointer to member
    Spróbowałem takiego czegoś (tego & który każą użyć nie da się nigdzie wcisnąć by nie uzyskać błędu)
    Kod:
    int main(void){
    	Deck *deckOfCards = new Deck();
    
    	cout << deckOfCards[0].Card::getCard();	
    
    	system("PAUSE");
    }
    No i jest mały sukces... kompiluje się bez problemu, ale zamiast
    "ace of hearts"
    mam
    " of s"

    Czyli tak jakby pod danym adresem były puste obiekty, a nie stworzone przez klasę Deck
    @Pumpkin ;
    też mi się to dziedziczenie średnio podoba no ale bez tego jest coś takiego:


    Co do rozdrabniania... w Javie robiłem x klas, tworzyłem w danej klasie obiekt innej klasy i mogłem działać. Rozumiem, że tutaj nie mogę tego tak robić?
    Ostatnio zmieniony przez hefalump : 02-02-2017, 16:28

  6. #5

    Data rejestracji
    2010
    Posty
    13
    Siła reputacji
    0

    Domyślny

    deck.h
    Kod:
    #include <iostream>
    #include "card.h"
    
    using namespace std;
    card.h
    Kod:
    #include <iostream>
    #include <string>
    
    using namespace std;
    test.cpp
    Kod:
    #include <iostream>
    #include "deck.h
    
    using namespace std;
    Tak to powinno wyglądać. Includujesz pliki *.h, a nie *.cpp. No i do tego include guardy.

    Dodatkowo twoje Card deck[52] powinno być publiczne. I twoje: cout << deckOfCards[0]...
    Powinno wyglądać tak: cout << deckOfCards.deck[0].getCard();

    A jak bardzo chcesz mieć Card deck[52] prywatne to powinieneś dodać metodę do klasy deck przyjmującej w argumencie indeks karty. Ewentualnie możesz przeładować operator [].
    Ostatnio zmieniony przez Buraczek : 02-02-2017, 16:54

  7. #6
    Avatar Chels
    Data rejestracji
    2013
    Wiek
    29
    Posty
    2,824
    Siła reputacji
    13

    Domyślny

    po pierwsze to odwolania do method lub pol publicznych gdy poslugujemy sie wskaznikiem jest '->' a nie kropka

    Kod:
    Deck *DeckOfCards = new Deck;
    DeckOfCards -> GetCard();
    po drugie czemu wywolujesz DeckOfCards[0] skoro nie stworzyles tablicy


    Kod:
    Deck *DeckOfCards = new Deck[N];
    to jest tworzenie dynamicznej tablicy w c++


    no i na koncu nie zapomnij o deletach w desktruktorze lub w funkcji w ktorej tworzysz i alokujesz wskaznik ;p


    i jak nie musisz to nie dziedzicz
    Ostatnio zmieniony przez Chels : 02-02-2017, 16:52

  8. #7
    Avatar Pumpkin
    Data rejestracji
    2010
    Posty
    3,034
    Siła reputacji
    16

    Domyślny

    zarowno
    DeckOfCards -> GetCard();
    jak i
    deckOfCards[0].GetCard();

    zrobi dokładnie to samo czyli zwróci odziedziczone pole z klasy Card. I w ogóle nie ruszy tej tablicy kart. Skad by nawet mialo widziec ktory indeks pobrac? Żeby ruszył tablice kart to musisz wywołać coś takiego:
    deckOfCards->deck[0].GetCard();
    I wtedy nie potrzebujesz żadnego dziedziczenia.
    Tylko z twoim rozwiązaniem się to nie uda bo u ciebie deck jest prywatny więc byś go musiał zrobić publicznym albo stworzyć jakąs metode publiczną żeby go wyciągała
    Ostatnio zmieniony przez Pumpkin : 02-02-2017, 18:17
    Cytuj wampiirr napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Leki które aktualnie mają wartość 200zł, po refundacji płacimy 50 zł, a za Korwina będą kosztowały 10zł. Bardziej tak

    Cytuj wampiirr napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    (...)bo był honorowym rycerzem w porównaniu do tego gościa, który oddał bez walki zamek.

  9. #8

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny

    Ogarnąłem nieco temat, wygląda wszystko dobrze poza jedną rzeczą, no ale od początku.

    Card.h
    Kod:
    #ifndef CARD_H
    #define CARD_H
    
    #include <string>
    using namespace std;
    
    class Card
    {
    private:
    	string face;
    	string suit;
    	int value;
    public:
    	Card();
    	Card(string, string, int);
    	~Card();
    	string getFace();
    	string getSuit();
    	int getValue();
    	string getCard();
    };
    
    #endif
    Card.cpp
    Kod:
    #include "Card.h"
    
    Card::Card(){}
    
    Card::Card(string f, string s, int v){
    	face = f;
    	suit = s;
    	value = v;
    }
    
    Card::~Card(){}
    
    string Card::getFace(){	return face; }
    
    string Card::getSuit(){	return suit; }
    
    string Card::getCard(){ return face + " of " + suit + "s"; }
    
    int Card::getValue(){ return value; }
    Deck.h
    Kod:
    #ifndef DECK_H
    #define DECK_H
    
    #include <cstdlib>
    #include <time.h>
    #include "Card.h"
    
    class Deck
    {
    private:
    	Card *deck = new Card[52];
    public:	
    	Deck();
    	~Deck();
    	Card selectCard(int);
    	void shuffle();
    };
    
    #endif
    Deck.cpp
    Kod:
    #include "Deck.h"
    Deck::Deck(){		
    		deck[0] = *new Card("two", "heart", 2);
    		deck[1] = *new Card("three", "heart", 3);
    .............. i tak dalej, kolejno wszystkie karty
    	        deck[50] = *new Card("king", "spade", 10);
    		deck[51] = *new Card("ace", "spade", 11);
    	}	
    
    Deck::~Deck(){}
    
    	Card Deck::selectCard(int i){
    		return deck[i];
    	}
    
    	void Deck::shuffle(){		
    		for (int i = 0; i < 52; i++){
    			int rnd = rand() % 52;
    			Card temp = deck[rnd];
    			deck[i] = deck[rnd];
    			deck[rnd] = temp;
    		}
    	}
    main.cpp
    Kod:
    #include <iostream>
    #include "Deck.h"
    #include "Card.h"
    
    int main(void){
    	srand(time(0));
    	Deck *deck = new Deck();
    	deck->shuffle();
    
    	cout << "Pair 1" << endl;
    	cout << deck->selectCard(0).getCard() << endl;
    	cout << deck->selectCard(2).getCard() << endl;
    	cout << "Score " << deck->selectCard(0).getValue() + deck->selectCard(2).getValue() << endl;
    		
    	cout << endl << "Pair 2" << endl;
    	cout << deck->selectCard(1).getCard() << endl;
    	cout << deck->selectCard(3).getCard() << endl;
    	cout << "Score " << deck->selectCard(1).getValue() + deck->selectCard(3).getValue();
    
    	cout << endl;
    	system("PAUSE");
    }
    no i tak sobie odpalam kilka razy, wszystko wydaje się zgadzać aż tu nagle...


    odpaliłem n razy i znów pojawiło się powtórzenie, nawet 3 takie same karty wylosowane (inne niż w przypadku wyżej)
    ewidentnie jest coś spieprzone z funkcją shuffle(), ale co?
    gdy wypiszę karty przed tasowaniem to wyjdą 52 różne karty, sprawdzałem.

  10. #9
    Avatar zakius
    Data rejestracji
    2008
    Położenie
    The Internets
    Wiek
    33
    Posty
    11,075
    Siła reputacji
    24

    Domyślny

    Kod:
                   
    Card temp = deck[rnd];
    deck[i] = deck[rnd];
    deck[rnd] = temp;
    popatrz na to dokładnie
    tutaj kopiujesz kartę usuwając jedną inną, poza tym daj więcej przetasowań
    Problem z komputerem? Instrukcja diagnostyczna
    Cytuj Vegeta napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Baby maja wymagania jak windows vista, takze nigdy nie wiesz.
    Cytuj Dzzej napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Moje posty to esencja głupoty.
    "Don't worry, I'm just a pervert"

  11. #10

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny

    Cytuj zakius napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Kod:
                   
    Card temp = deck[rnd];
    deck[i] = deck[rnd];
    deck[rnd] = temp;
    popatrz na to dokładnie
    tutaj kopiujesz kartę usuwając jedną inną, poza tym daj więcej przetasowań
    kurde, głupi błąd, dzięki

    nie jestem tylko pewien czy dobrze rozumiem więcej przetasowań... odpalić funkcję shuffle() kilka razy ? XD

  12. #11
    Avatar zakius
    Data rejestracji
    2008
    Położenie
    The Internets
    Wiek
    33
    Posty
    11,075
    Siła reputacji
    24

    Domyślny

    trochę mi po prostu ten algorytm nie leży, puść kilkanaście razy od 0 i wypisz stan 1 przebiegu, aż sam jestem ciekawy skuteczności
    Problem z komputerem? Instrukcja diagnostyczna
    Cytuj Vegeta napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Baby maja wymagania jak windows vista, takze nigdy nie wiesz.
    Cytuj Dzzej napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Moje posty to esencja głupoty.
    "Don't worry, I'm just a pervert"

  13. #12

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny

    Cytuj zakius napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    trochę mi po prostu ten algorytm nie leży, puść kilkanaście razy od 0 i wypisz stan 1 przebiegu, aż sam jestem ciekawy skuteczności
    Kod:
    	for (int i = 1; i < 100; i++){
    		deck->shuffle();		 
    			cout << deck->selectCard(0).getCard() << " , ";

    niżej zliczyłem nawet ilość danych kolorów, dla pojedynczych kart nie chce mi się już tego robić, to i tak mały projekcik by przesiąść się jako tako z javy na cpp

  14. #13
    Avatar arturave
    Data rejestracji
    2007
    Położenie
    Prabuty
    Wiek
    29
    Posty
    527
    Siła reputacji
    17

    Domyślny

    a czemu chcesz się przesiąść z javy an ++C ? :D

  15. #14

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    15

    Domyślny

    Szukałem praktyk w Javie i nie udało się (w sumie przez brak znajomości niemieckiego :D). No a akurat kilka ofert jest z c++ więc czemu nie, skoro i tak ani Javy ani C++ nie znam na nawet średnim poziomie. No i Java do głównie web developerka a ja już za dzieciaka chciałem gry pisać :D
    @arturave ;


    edit#


    jedyne +/- 550 linijek kodu xDD
    Ostatnio zmieniony przez hefalump : 03-02-2017, 16:37

Reklama

Informacje o temacie

Użytkownicy przeglądający temat

Aktualnie 1 użytkowników przegląda ten temat. (0 użytkowników i 1 gości)

Podobne tematy

  1. Dlaczego gra nie widzi karty graficznej?
    Przez ZefirEU w dziale Sprzęt i oprogramowanie
    Odpowiedzi: 6
    Ostatni post: 17-03-2021, 17:48
  2. Odpowiedzi: 5
    Ostatni post: 15-01-2018, 16:47
  3. [TORG GRA] Clash of Clans - strategiczna gra na telefon
    Przez Pelikan w dziale O wszystkim i o niczym
    Odpowiedzi: 3
    Ostatni post: 02-08-2017, 12:36
  4. Brak Karty graficznej a Tibia
    Przez Didier w dziale Tibia
    Odpowiedzi: 7
    Ostatni post: 30-08-2011, 22:20

Zakładki

Zakładki

Zasady postowania

  • Nie możesz pisać nowych tematów
  • Nie możesz pisać postów
  • Nie możesz używać załączników
  • Nie możesz edytować swoich postów
  •