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: #include <iostream>
using namespace std; class player { public: int health = 100; int mana = 100; void getDamage( int damage ) { health -= damage; } }; class player1 : public player { public: }; class player2 : public player { public: }; void tura1( string turn ) { player1 Object1; if( turn == "attack" ) { Object1.getDamage( 10 ); } } void tura2( string turn ) { player2 Object2; if( turn == "attack" ) { Object2.getDamage( 10 ); } } int main() { player1 Object1; player2 Object2; string turn1; string turn2; while( Object1.health > 0 || Object2.health > 0 ) { cin >> turn1; tura1( turn1 ); cout << "Player 1 health:" << Object2.health << " Player 1 mana:" << Object2.mana << endl; cin >> turn2; 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 |
|
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?
|
|
kubawal |
» 2013-08-10 14:47:54 void tura1( string turn ) { player1 Object1; if( turn == "attack" ) { Object1.getDamage( 10 ); } } void tura2( string turn ) { player2 Object2; if( turn == "attack" ) { Object2.getDamage( 10 ); } }
|
Przy każdym wywołaniu funkcji tworzy się nowy gracz i się usuwa. Przekazuj w argumencie tych funkcji referencję do gracza. |
|
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. |
|
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: player Object1; player Object2;
"jak mogę stworzyć referencję do klasy?" Nie masz tworzyć referencji do klasy, ale referencję do obiektu tej klasy. void tura1( player & Object, string turn )
(Oczywiście cały kod można zbudować lepiej) Dodatkowo proponuję korzystać z konstruktorów... |
|
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 |
|
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. 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ś private: int health = 100; int mana = 100; public: int hp() { return health; } int mn() { return mana; } ... while( Object1.hp() > 0 || Object2.hp() > 0 ) { cin >> turn1; Object1.tura( turn1 ); cout << "Player 1 health:" << Object1.hp() << " Player 1 mana:" << Object1.mn() << endl; cin >> turn1; 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 |
|
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. |
|
« 1 » 2 |