Cześć,
można powiedzieć, że jestem laikiem w programowaniu, stąd najlepiej uważam, że człowiek uczy się w praktyce - zacząłem więc pisać prosty program/grę rpg, wykorzystując obiektowy c++. I o ile dużo problemów byłem już w stanie rozwiązać samemu, o tyle ten to całkowicie dla mnie ściana nie do przebycia.
Chciałem stworzyć system walki, który opierałby się na wywoływaniu odpowiednich metod wskaźnikiem polimorficznym. Prosty schemat walki: wprowadzenie obiektu klasy Wrog -> ustawienie wskaźnika -> ustawienie zmiennych (punkty życia itd.) -> wyliczenie obrażeń -> zadanie obrażeń postaci. W prostszym schemacie wywoływanych metod: Wrog wilk; wskaźnik; w->statystyki(); w->atak(); p->przyjecie_obrazen().
No i problem leży w tym ostatnim kroku, gdzie metoda klasy Rycerz miałaby przyjąć wartość obrażeń wykalkulowanych przez metodę atak() w klasie Wilk.
Próbowałem więc różnych sposobów, przesyłałem do tej metody tę wartość różnorako, i przez wskaźnik, i przez osobną zmienną, którą stworzyłem w programie głównym, i poprzez wskaźnik polimorficzny (chociaż do końca nie wiem, czy tak się da, ale kompilator nie narzekał). Program, gdy dochodzi do tego momentu, zwraca po prostu dziwnie dużą liczbę i zakończa proces (dokładnie na linijce wskaznikpostaci1->przyjecie_zmiennej(i);, gdyż to już testowałem).
Program główny: https://pastebin.com/EJ11n2LE , nagłówek postac: https://pastebin.com/GKChC1vx , nagłówek wrog: https://pastebin.com/VgtSK2zx .
I nie mam niestety dalej pomysłu, nawet przeczucia, że mogę coś źle robić. (i dodam tylko jeszcze, że funkcja przyjecie_zmiennej jest nowym "nabytkiem", bez niej również nie działało)
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <stdio.h>
using namespace std;
#include "klasapostac.h"
#include "klasawrog.h"
char co;
char imie_postaci[20];
void nadanie_imienia()
{
cout<<"\nPodaj imie postaci: ";
cin.getline(imie_postaci, 20);
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////
void wyborRycerz()
{
Postac *wskaznikpostaci;
Rycerz Gracz1;
wskaznikpostaci = &Gracz1;
wskaznikpostaci->statystyki();
}
void wyborMag()
{
Postac *wskaznikpostaci;
Mag Gracz2;
wskaznikpostaci = &Gracz2;
wskaznikpostaci->statystyki();
}
void wyborLotr()
{
Postac *wskaznikpostaci;
Lotr Gracz3;
wskaznikpostaci = &Gracz3;
wskaznikpostaci->statystyki();
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
void walka(Postac *wskaznikpostaci1,Wrog *wskaznikwroga)
{
system("cls");
cout<<"Napotykasz na lesnej drodze wyglodnialego wilka. Zaczyna biec w twoja strone..."<<endl;
Wilk A;
wskaznikwroga = &A;
wskaznikwroga -> statystyki();
wskaznikwroga -> atak();
int *i;
i = &wskaznikwroga->obrazenia;
cout<<*i;
wskaznikpostaci1->przyjecie_zmiennej(i);
//wskaznikpostaci1->otrzymaj_obrazenia();
//wskaznikpostaci1 -> otrzymaj_obrazenia();
cout<<"\nWilk wbiegl na ciebie z impetem, zadajac ";
cout<<wskaznikwroga->obrazenia;
cout<<" obrazen!\n";
cout<<"Akcje:\n1. Uderz.";
while(true)
{
co=getch();
switch(co)
{
case '1': wskaznikpostaci1 -> atak();
int i; cout<<wskaznikpostaci1->obrazenia;
}
}
}
int main(){
menu:
cout<<"============================\nNajprostsza gra RPG historii\n============================\n";
cout<<"1. Zacznij przygode\n"
<<"2. Tworcy\n"
<<"3. Wyjscie\n";
while(true)
{
co=getch();
switch(co)
{
case '1': goto kontynuacja;
case '2': cout<<"\nPomysl i realizacja - Nikodem Bochnacki\n"
<<"Kod i testy - Nikodem Bochnacki\n"
<<"Wszystkie prawa zastrzezone :)\n\n";
goto menu;
break;
case '3': exit(0);
default: exit(0);
}
}
kontynuacja:
system("cls");
cout<<"TUTORIAL\n";
cout<<"U gory ekranu zawsze wyswietli sie lokacja, w ktorej znajduje sie obecnie postac. Pod nia ewentualne dialogi\n"
<<"i wydarzenia. Nizej wyswietlaja sie dostepne akcje (nie musisz potwierdzac wyboru).\n\nUlepszaj ekwipunek, walcz z potworami i przetrwaj.\nPowodzenia!";
cout<<"\n\n(Nacisnij dowolny klawisz, by rozpoczac gre)\n";
getchar();
system("cls");
cout<<"Budzisz sie na srodku drogi. Pochyla sie nad toba chlop i mowi:\n"
<<"- Zes spadl jak grom z nieba! Jak cie zwa?"
<<"\nNo wlasnie... Jak Cie zwa?";
nadanie_imienia();
system("cls");
cout<<"- "<<imie_postaci<<"? Pracy szukasz moze? Dobrze zbudowany to w polu sie nadasz, a i potworow kilka ubic chyba dasz rade!\n"
<<"Chlop, odwracajac sie, rzucil jeszcze:\n- Idz do tawerny, tam na pewno cos znajdziesz. - i udal sie w swoja strone. "
<<"\nCoz... Chyba nie masz lepszego wyboru.\n\n";
cout<<"Akcje:\n1. Idz do tawerny.\n";
while(true)
{
co=getch();
switch(co)
{
case '1': goto rozmowa;
default: cout<<"\nUps! Zly przycisk...";
}}
rozmowa:
system("cls");
cout<<"- Witaj! Jestem Karczmarzem - potrzebujesz czegokolwiek? Przychodz do mnie! Zawsze \n"
"chetnie pomoge... za odpowiednia zaplata. No, ale opowiedz cos o sobie!\n\n";
cout<<"A wiec jestes...\n";
cout<<"============================\n\tWybor klasy\n============================\n"
<<"1. Rycerzem\n"
<<"2. Magiem\n"
<<"3. Lotrem";
Wrog *wskaznikwroga;
while(true){
co=getch();
switch(co)
{
case '1': wyborRycerz(); system("cls"); goto kontynuacja1;
case '2': wyborMag(); system("cls"); goto kontynuacja1;
case '3': wyborLotr(); system("cls"); goto kontynuacja1;
default: cout<<"\nUps! Zly przycisk..."<<endl;
}}
kontynuacja1:
cout<<"\n- Ach, alez dobrze miec takiego kogos w takich ciezkich czasach. No wiec, jak bedziesz\n"
<<"czegokolwiek potrzebowal - porozmawiaj ze mna. Jak na karczmarza przystalo, mam dostep do wie-\n"
<<"lu przywilejow. Jesli natomiast chcesz wyruszyc w dalsza podroz, zawsze bedziemy tu czekac."<<endl;
cout<<"\n Jak zawsze... Zero bezinteresownosci. No nic, i tak nie masz pieniedzy, wiec pora pokrecic sie\n"
<<"po okolicy."<<endl;
cout<<"\nAkcje:\n1. Wyjdz z tawerny.\n";
Postac *wskaznikpostaci1;
while(true)
{
co=getch();
switch(co)
{
case '1': walka(&*wskaznikpostaci1,&*wskaznikwroga); break;
default: cout<<"\nUps! Zly przycisk..."<<endl;
}
}
return 0;
}
Może istnieje jakiś prostszy sposób, a kombinuję niepotrzebnie? Prosiłbym również o wyrozumiałość, wiem, że kodowi daleko do zoptymalizowania, zapewne nie powinienem również wszystkiego w klasie pochodnej dawać jako "public", ale takimi rzeczami zajmę się, gdy program doprowadzę do końca.
Z góry dzięki za poświęcony czas!