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

gra konsolowa i funkcja getDamage

Ostatnio zmodyfikowano 2013-08-11 12:27
Autor Wiadomość
Echelon
Temat założony przez niniejszego użytkownika
gra konsolowa i funkcja getDamage
» 2013-08-10 13:39:15
Witam!
Jestem nowy w C++ ale juz przeszedłem kurs i wciąż poszerzam swoją wiedzę(m.in. kupiłem książkę thinking in C++) ale to nie ważne.

Otóż mam problem.
w celu sprawdzenia umiejętności(no i dla zabawy oczywiscie też :)) postanowilem napisać grę, ale nie w 3D...ani nie w 2D...(wyższa szkoła jazdy) tylko w konsoli.
Gra jest barbarzyńsko prosta.
Jest oparta na turach.Gracz pierwszy wybiera akcje(na razie jest tylko attack), która wywołuje effekt(zadaje obrażenia).Po zakonczonej turze wyswietlane sa statystyki przeciwnika (health,mana) i tura należy do gracza 2.
Jak się można domyślić gra kończy się gdy jeden gracz pokona drugiego :)
a teraz problem:
po wpisaniu w konsole słowa attack obrażenia nie zostają zadane.Myślę że błąd leży w funkcji tura1/tura2 albo w funkcji getDamage,ale nie mam pojęcia o co dokładnie chodzi.
kod:
C/C++
#include <iostream>

using namespace std;
class player
{
public:
    int health = 100;
    int mana = 100; //statystyki obydwu graczy
    void getDamage( int damage ) //funkcja odpowiadająca za obrażenia
    {
        health -= damage;
    }
   
};
class player1
    : public player //dziedziczenie statystyk i funkcji getDamage
{
public:
   
};
class player2
    : public player //dziedziczenie statystyk i funkcji getDamage
{
public:
};
void tura1( string turn ) //funkcja odpowiadająca za ruch gracza1
{
    player1 Object1;
    if( turn == "attack" )
    {
        Object1.getDamage( 10 ); //po wpisaniu w czasie tury attack przeciwnik otrzymuje 10 obrażeń
    }
    //miejsce na pozostale umiejetnosci
}
void tura2( string turn ) //funkcja odpowiadająca za ruch gracza2
{
    player2 Object2;
    if( turn == "attack" )
    {
        Object2.getDamage( 10 ); //po wpisaniu w czasie tury attack przeciwnik otrzymuje 10 obrażeń
    }
    //miejsce na pozostale umiejetnosci
}
int main()
{
    player1 Object1;
    player2 Object2;
   
   
    string turn1;
    string turn2;
   
   
    while( Object1.health > 0 || Object2.health > 0 )
    {
        cin >> turn1; //wpisujesz rodzaj ruchu,ktory chcesz wykonac.
        tura1( turn1 );
        cout << "Player 1 health:" << Object2.health << " Player 1 mana:" << Object2.mana << endl;
        cin >> turn2; //wpisujesz rodzaj ruchu,ktory chcesz wykonac.
        tura2( turn2 );
        cout << "Player 2 health:" << Object1.health << " Player 2 mana:" << Object1.mana << endl;
    }
    return 0;
}

Najpierw próbowałem to zrobić na switch'ach zamiast na if'ach ale okazało się że switch nie przyjmuje string'ów.
Tak czy inaczej z góry dziękuje za pomoc

PS: gra jeszcze nie jest gotowa, dodane zostaną nowe umiejętności i inne takie. Kto mi pomoże obiecuje pełną wersję gry za free :D
P-89890
kubawal
» 2013-08-10 14:45:43
Po co masz dwie klasy dla obydwu graczy dziedziczące po player (player1 i player2), jak tak i tak są takie same?
P-89897
kubawal
» 2013-08-10 14:47:54
C/C++
void tura1( string turn ) //funkcja odpowiadająca za ruch gracza1
{
    player1 Object1;
    if( turn == "attack" )
    {
        Object1.getDamage( 10 ); //po wpisaniu w czasie tury attack przeciwnik otrzymuje 10 obrażeń
    }
    //miejsce na pozostale umiejetnosci
}
void tura2( string turn ) //funkcja odpowiadająca za ruch gracza2
{
    player2 Object2;
    if( turn == "attack" )
    {
        Object2.getDamage( 10 ); //po wpisaniu w czasie tury attack przeciwnik otrzymuje 10 obrażeń
    }
    //miejsce na pozostale umiejetnosci
}

Przy każdym wywołaniu funkcji tworzy się nowy gracz i się usuwa.
Przekazuj w argumencie tych funkcji referencję do gracza.
P-89898
Echelon
Temat założony przez niniejszego użytkownika
» 2013-08-10 21:57:18
hmm...
Po co masz dwie klasy dla obydwu graczy dziedziczące po player (player1 i player2), jak tak i tak są takie same?

jeżeli chodzi o klasy to popraw mnie jeżeli się mylę ale...Gdybym nie stworzył dwóch oddzielnych klas player1 i player2 a skorzystał za to z klasy bazowej player i klasy pochodnej player1 nie tworząc klasy player2 to obrażenia zadawane graczowi pierwszemu byłyby zadawane także graczowi drugiemu, jako że player1 pochodzi od player.Mam na dzieje że o to ci chodziło.

Przy każdym wywołaniu funkcji tworzy się nowy gracz i się usuwa.
Przekazuj w argumencie tych funkcji referencję do gracza.

mógłbyś pokazać dokładniej o co chodzi? jak mogę stworzyć referencję do klasy? umiem stworzyć tylko referencję do zmiennej
i do obiektu, nie wiedziałem że da się stworzyć referencję do klasy. Fragment kodu byłby pomocny.
P-89941
rafixxx25
» 2013-08-10 23:50:14
Chyba źle zrozumiałeś pojęcie klasy. Proponuję jeszcze raz przerobić ten temat z kursu/książki.
W twoim wypadku wystarczy klasa player oraz stworzenie 2 obiektów:
C/C++
player Object1;
player Object2;
"jak mogę stworzyć referencję do klasy?"
Nie masz tworzyć referencji do klasy, ale referencję do obiektu tej klasy.
C/C++
void tura1( player & Object, string turn )
(Oczywiście cały kod można zbudować lepiej)
Dodatkowo proponuję korzystać z konstruktorów...
P-89949
domin568
» 2013-08-10 23:54:13
Wszystkie zmienne powinno umieszczać sie w modyfikatorze private , żeby użytkownik nie miał do nich dostępu . I w publiczna tworzysz sobie proste funkcje zwracajace te zmienne . Poczytaj jeszcze trochę o obiektowosci , statystyki postaci powinieneś początkowo zapisać w konstruktorze , a potem jak będziesz dxiedziczyl ta klasę to poprostu uruchomisz jej konstruktor i będziesz miał statystyki postaci 2 w postaci 1 , lecz jak bedą sie bili hp będzie ubywalo to będziesz musiał napisać odpowiednia funkcje do aktualizowania tego , ale to już będzie proste :) powodzenia , pisałem bardzo podobna grę rpg moge wysłać ci kod na PW gg : 42590524
P-89950
Echelon
Temat założony przez niniejszego użytkownika
» 2013-08-11 08:40:40
rafixxx25
Jestes genialny! Nie wpadłem na to że można z 1 klasy zrobić kilka obiektów, facepalm. Dzięki tobie raz,że działa a dwa że jest o połowe mniej kodu.Wielkie thx
domin568
Twoja rada jest równierz dobra, ale nie mogę już użyć konstruktora ponieważ zgodnie z radą rafixxxa usunąłem dziedziczenie :). Zamiast tego stworzyłem dwa obiekty z jednej klasy.

C/C++
player Object1;
player Object2;

Dlatego użycie konstruktora nie wchodzi w grę.Ale wziąłem sobie do serca to,co mówiłeś o privacie i zrobiłem takie coś

C/C++
private:
int health = 100;
int mana = 100; //statystyki obydwu graczy
public:
int hp()
{
    return health;
}
int mn()
{
    return mana;
}
...
while( Object1.hp() > 0 || Object2.hp() > 0 )
{
    cin >> turn1; //wpisujesz rodzaj ruchu,ktory chcesz wykonac.
    Object1.tura( turn1 );
    cout << "Player 1 health:" << Object1.hp() << " Player 1 mana:" << Object1.mn() << endl;
    cin >> turn1; //wpisujesz rodzaj ruchu,ktory chcesz wykonac.
    Object2.tura( turn1 );
    cout << "Player 2 health:" << Object2.hp() << " Player 2 mana:" << Object2.mn() << endl;
}
PS: z tym za free to mówiłem pół żartem pół serio, bo przecież i tak nie będe sprzedawał tej gry więc pewnie wkleje po prostu kod pełnej gry na forum, coby każdy mógł sobie zagrać.
PS 2:domin 586 chętnie zobacze twoją grę,może będzie dla mnie stanowić inspirację :D
P-89959
rafixxx25
» 2013-08-11 09:01:42
Ale zrobienie konstruktora i tak jest zalecane ;)
Poczytaj dokładniej o klasach jeszcze.
Do konstruktora możesz podawać parametry danego gracza(życie, atak ew. inne w przyszłości) i dzięki temu będą mogli mieć oni różne statystyki, a nie na stałe ustalone w klasie.
P-89960
« 1 » 2
  Strona 1 z 2 Następna strona