Autor Wątek: C++ Problem ze stworzeniem ekwipunku.  (Przeczytany 23205 razy)

Offline Ziemowit

  • Użytkownik
    • Ziemowit DevBlog

# Styczeń 19, 2014, 01:16:02
Zmień nazwę parametrów, bo kompilator nie odróżnia ich od nazw pól klasy( np. tak jak zrobił Xirdus, przez "_" ).


Kompilator odróżnia (dowodem tego jest to, że kod się skompilował), tylko autor tematu chyba nie za bardzo...
atakMin != this->atakMin.

Zanim zaczniesz pisać grę (tym bardziej RPGa, sic!) naprawdę, poczytaj Megatutorial, Symfonię, Thinking in C++ (bardzo fajna książka, a autor udostępnia po angielsku za darmo w formacie HTML), poćwicz, i wróć, jak już będziesz wiedział co robiłeś i dlaczego nie działało :)

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Acarin1995

  • Użytkownik

# Styczeń 19, 2014, 15:05:02
Dzięki za pomoc... A gdzie mogę znaleźć coś o wskaźnikach na pola wektora np. pole 1 to klasa Bron obiekt miecz...

Offline Xirdus

  • Redaktor

# Styczeń 19, 2014, 16:07:12
W C++ nie da się wprost sprawdzić, do jakiej klasy należy dany obiekt. Musisz zrobić metodę wirtualną zwracającą typ albo trzymać typ w polu klasy.

Offline Xion

  • Redaktor
    • xion.log

# Styczeń 19, 2014, 17:41:32
@up: Niezupełnie, vide typeid() tudzież dynamic_cast<>.

Offline koirat

  • Użytkownik

# Styczeń 19, 2014, 17:50:22
@up Ale dokładną nazwę jak w źródle z tego chyba nie da się wydobyć ?
Przynajmniej zawsze żyłem z takim przekonaniem. Ale też c++ to nie "mój język".

Offline Ziemowit

  • Użytkownik
    • Ziemowit DevBlog

# Styczeń 19, 2014, 17:55:00
@Xirdus:
nie do końca, istnieje coś takiego jak operator typeid ;)

@EDIT:
ubiegliście mnie ;p
koirat:
ale można porównywać typ znany z nieznanym: if(typeid(ptr) == typeid(Klasa)).
Użycie tego jednak raczej nie jest zaliczane do dobrych praktyk programistycznych ;)
« Ostatnia zmiana: Styczeń 19, 2014, 17:59:34 wysłana przez Ziemowit »

Offline Acarin1995

  • Użytkownik

# Styczeń 19, 2014, 18:06:33
mam problem z kompilacją kodu ( robię nowy system walki ):
//main.cpp
#include <iostream>
#include "Postac.hpp"
#include "Przeciwnik.hpp"

using namespace std;
int main()
{
CPostac Postac;
CPrzeciwnik *przeciwnik=new CPrzeciwnik("Szczur",20,20,1,2);
Postac.atak(*przeciwnik);
cout<<przeciwnik->zycie<<endl;

return 0;
}
//Postac.hpp
#ifndef Postac_hpp
#define Postac_hpp
#include <string>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include "Przeciwnik.hpp"
using namespace std;
class CPostac
{
public:
string nazwa;
int zycie;
int zycieMax;
int obrazeniaMin;
int obrazeniaMax;
CPostac();
int atak(CPrzeciwnik&);
};

#endif
//Postac.cpp
#include "Postac.hpp"
using namespace std;
CPostac::CPostac()
{
nazwa="gracz";
zycieMax=20;
zycie=zycieMax;
obrazeniaMin=1;
obrazeniaMax=3;
}

int CPostac::atak(CPrzeciwnik& cel)
{
srand(time(NULL));
int obrazenia = rand() % (obrazeniaMax - obrazeniaMin+1) + obrazeniaMin;
cel.zycie -= obrazenia;

cout << nazwa << " Atakujesz " << cel.nazwa << " zadajac " << obrazenia << " obrazen!" << endl;
cout << " Przeciwnikowi pozostalo " << cel.zycie << " zycia..." << endl;
}
//Przeciwnik.hpp
#ifndef Przeciwnik_hpp
#define Przeciwnik_hpp
#include <string>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include "Postac.hpp"
using namespace std;
class CPrzeciwnik
{
public:
string nazwa;
int zycie;
int zycieMax;
int obrazeniaMin;
int obrazeniaMax;
CPrzeciwnik(string nazwa, int zycie,int zycieMax,int obrazeniaMin,int obrazeniaMax);
int atak(CPostac&);
};

#endif
//Przeciwnik.cpp
#include "Przeciwnik.hpp"
CPrzeciwnik::CPrzeciwnik(string nazwa_, int zycie_,int zycieMax_,int obrazeniaMin_,int obrazeniaMax_)
{
nazwa_=nazwa_;
zycie=zycie_;
zycieMax=zycieMax_;
    obrazeniaMin = obrazeniaMin_;
    obrazeniaMax = obrazeniaMax_;
}
int CPrzeciwni::atak(CPostac& cel)
{
srand(time(NULL));
int obrazenia = rand() % (obrazeniaMax - obrazeniaMin+1) + obrazeniaMin;
cel.zycie -= obrazenia;

cout << nazwa << " Atakuje cie " << cel.nazwa << " zadajac " << obrazenia << " obrazen!" << endl;
cout << " Pozostalo ci" << cel.zycie << " zycia..." << endl;
}
log:Kompilator: MinGW GCC 4.7.2 32-bit Release
Building Makefile "C:\Users\Acarin\Desktop\Nevermore\Makefile.win"
Wykonywanie  make...
mingw32-make.exe -f "C:\Users\Acarin\Desktop\Nevermore\Makefile.win" all
g++.exe -c Postac.cpp -o Postac.o -I"C:/Program Files/Dev-Cpp/MinGW32/include" -I"C:/Program Files/Dev-Cpp/MinGW32/lib/gcc/mingw32/4.7.2/include/c++"

In file included from Postac.hpp:7:0,
                 from Postac.cpp:1:
Przeciwnik.hpp:18:12: error: 'CPostac' has not been declared

C:\Users\Acarin\Desktop\Nevermore\Makefile.win:31: recipe for target 'Postac.o' failed

mingw32-make.exe: *** [Postac.o] Error 1

Compilation failed after 0,62 seconds with errors
Przy okazji nasuwa mi si e pytanie czy system walki ma istnieć w int main czy w jakimś innym miejscu?

Offline MatlertheGreat

  • Użytkownik

# Styczeń 19, 2014, 18:27:04
Z tego, co widzę to Postac.hhp include'uje Przeciwnik.hpp, i odwrotnie. Przez to Przeciwnik.hpp nie "widzi" Postac.hpp( bo zostało zdefiniowane makro Postac_hpp i zadziałały dyrektywy #ifndef ). Gdybyś pouczył się trochę o klasach( taka mała aluzja :D ) to wiedziałbyś, że zależności między plikami należy jak najbardziej ograniczać. Do metody atak przekazuj wskaźnik, wywal odpowiednie #include'y i zastąp je forward declaration.

W ogóle nie rozumiem podziału na Postać i Przeciwnik. Nie wiem jak chciałbyś ogarnąć interakcje między nimi, ale na pewno z takiego kodu za dużo nie wyklepiesz. Zbyt dużo zależności. Klasy się w sobie zawierają, jakiś taki bałagan.

Ja stworzyłbym jedną klasę( interfejs ), np." class Entity ", która zawierałaby życie, atak, itp. i po której dziedziczyłyby inne klasy.

I błagam nie nazywaj klas/funkcji/metod/pól/itp. po polsku. Strasznie to wygląda. Aż oczy mi krwawią.

//Edit:
Jeszcze raz apeluję: Wracaj do nauki! Nie chcę Cię tu ośmieszać, tylko pomóc. Po Twoim kodzie widać, że nie wiesz, co piszesz i stąd Twoje błędy.
« Ostatnia zmiana: Styczeń 19, 2014, 18:30:32 wysłana przez MatlertheGreat »

Offline Acarin1995

  • Użytkownik

# Styczeń 22, 2014, 13:59:03
Dzięki... Macie rację, muszę się przyłożyć do nauki... Uczę się z najnowszej symfonii c++, i z "Od zera do gier kodera". Już wiem gdzie popełniłem niektóre błędy.
#include "main.hpp"
#include "Postac.hpp"
#include "Bron.hpp"
int main()
{
int i;
CPostac Postac;
CBron* bron = new CBron("Miecz",1,1,3,25,1);
Postac.plecak.push_back(bron);
bron = new CBron("Sztylet",2,2,2,15,1);
Postac.plecak.push_back(bron);
bron = new CBron("Mlot",3,0,4,20,1);
Postac.plecak.push_back(bron);
CPrzedmiot *przedmiot = Postac.plecak[i];
cout<<"Podaj numer slotu"<<endl;
cin>>i;
if (przedmiot->typ==1) //typ 1 oznacza bron
Postac.uzywane_eq[6] = Postac.plecak[i];
cout<<Postac.uzywane_eq[6]->nazwa;

i=0;
return 0;
}
Coś mi w powyższym programie niezbyt działa... Kompiluję się kod po czym zawiesza.
« Ostatnia zmiana: Styczeń 22, 2014, 19:35:40 wysłana przez Acarin1995 »

Offline Xirdus

  • Redaktor

# Styczeń 22, 2014, 21:58:04
Jak zakomentujesz cin to się już nie zawiesza?

BTW, dobrze by było zainicjalizować inta zerem, albo minus jedynką (to drugie tylko jeśli będziesz sprawdzał czy liczba mieści się w zakresie wektora ekwipunku, z tym że i tak będziesz musiał to zrobić, a 0 to przecież pierwszy przedmiot, przez co nie do końca poprawne jest inicjalizowanie nim tej zmiennej).

Offline Acarin1995

  • Użytkownik

# Luty 04, 2014, 14:18:17
Dziękuję za pomoc. ;)

Offline Acarin1995

  • Użytkownik

# Luty 18, 2014, 13:49:31
Mam sprawe na priv.
« Ostatnia zmiana: Luty 18, 2014, 21:42:29 wysłana przez Acarin1995 »

Offline Xirdus

  • Redaktor

  • +1
# Luty 18, 2014, 18:50:36
Jak masz sprawę na priv, to dawaj na priv, a nie na GG. A jeśli twoje pytanie jest o problem z programowaniem, to nie na priv tylko normalnie załóż temat czy kontynuuj ten - większa szansa na otrzymanie pomocy. A jak chcesz ze mnie zrobić interaktywny tutorial... cóż, nie lubię cię na tyle by się poświęcać :)

Offline koirat

  • Użytkownik

# Luty 18, 2014, 19:03:34
Zaraz zostaniesz zatrudniony do pisania pracy zaliczeniowej ;)

Offline Xirdus

  • Redaktor

# Luty 18, 2014, 19:19:38
Zaraz zostaniesz zatrudniony do pisania pracy zaliczeniowej ;)
Niestety umowa mi zabrania. :(