[c++] Problem z klasami

Problemy dotyczące programowania.

Moderatorzy: Moderatorzy, Administratorzy

GameBoy
Użytkownik
Posty: 30
Rejestracja: 2006-11-10, 22:47

[c++] Problem z klasami

Post autor: GameBoy »

Witam mam nastepujące 2 klasy:
monster.h

Kod: Zaznacz cały


#ifndef MONSTER_H
#define MONSTER_H

#include "random.h"
#include "weapon.h"
#include "player.h"
#include <string>


class Monster
{
public:
    Monster(const std::string& name, int hp, int acc, int xpReward, int armor, const std::string& weaponName,
            int lowDamage, int highDamage);

    bool isDead();
    int getXPReward();
    std::string getName();
    int getArmor();

    void attack(Player& player);
    void takeDamage(int damage);
    void displayHitPoints();

private:
    std::string mName;
    int mHitPoints;
    int mAccuracy;
    int mExpReward;
    int mArmor;
    Weapon mWeapon;
};

#endif //MONSTER_H
player.h

Kod: Zaznacz cały


#ifndef PLAYER_H
#define PLAYER_H

#include "weapon.h"
#include "monster.h"
#include <string>


class Player
{
public:
    Player();
    bool isDead();
    std::string getName();
    int getArmor();
    void takeDamage(int damage);
    void createClass();
    bool attack(Monster& monster);
    void levelUp();
    void rest();
    void viewStats();
    void victory(int xp);
    void gameover();
    void displayHitPoints();

private:
    std::string mName;
    std::string mClassName;
    int mAccuracy;
    int mHitPoints;
    int mMaxHitPoints;
    int mExpPoints;
    int mNextLevelExp;
    int mLevel;
    int mArmor;
    Weapon mWeapon;
};


#endif //PLAYER_H
monster.cpp

Kod: Zaznacz cały

#include "monster.h"
#include <iostream>

using namespace std;

    Monster::Monster(const std::string& name, int hp, int acc, int xpReward, int armor, const std::string& weaponName, int lowDamage, int highDamage)
    {
        mName = name;
        mHitPoints = hp;
        mAccuracy = acc;
        mExpReward = xpReward;
        mArmor = armor;
        mWeapon.mName = weaponName;
        mWeapon.mDemageRange.mLow = lowDamage;
        mWeapon.mDemageRange.mHigh = highDamage;
    }

    bool Monster::isDead()
    {
        return mHitPoints <=0;
    }

    int Monster::getXPReward()
    {
        return mExpReward;
    }

    std::string Monster::getName()
    {
        return mName;
    }
    int Monster::getArmor()
    {
        return mArmor;
    }

    void Monster::attack(Player& player)
    {
        cout<<"A "<<mName<<" attack you "<<"with a "<<mWeapon.mName<<endl;
        if(Random(0,20) < mAccuracy)
        {
            int damage=Random(mWeapon.mDemageRange);
            int totalDamage=damage-player.getArmor();

            if(totalDamage<=0)
            {
                cout<<"The monster attack faild to penetrate your armor."<<endl;
            }
            else
            {
                cout<<"You are hit for "<<totalDamage<<" Damage!"<<endl;
                player.takeDamage(totalDamage);
            }
        }
        else
        {
            cout << " The "<<mName<<" missed!"<<endl;
        }
        cout << endl;
    }   

    void Monster::takeDamage(int damage)
    {
        mHitPoints -=damage;
    }   

    void Monster::displayHitPoints()
    {
        cout<<mName<<" 's hitpoints = "<<mHitPoints << endl;
    }

player.cpp

Kod: Zaznacz cały

#include "player.h"
#include <iostream>

using namespace std;

Player::Player()
{
    mName="Default";
    mClassName="Default";
    mAccuracy=0;
    mHitPoints=0;
    mMaxHitPoints=0;
    mExpPoints=0;
    mNextLevelExp=0;

}

bool Player::isDead()
{
    return mHitPoints <=0;
}

int Player::getArmor()
{
    return mArmor;
}

void Player::takeDamage(int damage)
{
    mHitPoints-=damage;
}

void Player::createClass()
{
    cout<<"Character Class Generator"<<endl;
    cout<<"========================="<<endl;

    cout<<"Enter your character name: ";
    getline(cin,mName);
    cout<<"Pleas select a character class number..."<<endl;
    cout<<"1)Fighter 2)Wizard 3)Cleric 4)Thief: ";

    int characterNum=1;
    cin>>characterNum;

    switch(characterNum)
    {
    case 1:
        mClassName="Fighter";
        mAccuracy=10;
        mHitPoints=20;
        mMaxHitPoints=20;
        mExpPoints=0;
        mNextLevelExp=1000;
        mLevel=1;
        mArmor=4;
        mWeapon.mName="Long Swoard";
        mWeapon.mDemageRange.mLow=1;
        mWeapon.mDemageRange.mHigh=8;
        break;

    case 2:
        mClassName="Wizard";
        mAccuracy=5;
        mHitPoints=10;
        mMaxHitPoints=10;
        mExpPoints=0;
        mNextLevelExp=1000;
        mLevel=1;
        mArmor=1;
        mWeapon.mName="Staff";
        mWeapon.mDemageRange.mLow=1;
        mWeapon.mDemageRange.mHigh=4;
        break;

    case 3:
        mClassName="Cleric";
        mAccuracy=8;
        mHitPoints=15;
        mMaxHitPoints=15;
        mExpPoints=0;
        mNextLevelExp=1000;
        mLevel=1;
        mArmor=3;
        mWeapon.mName="Flail";
        mWeapon.mDemageRange.mLow=1;
        mWeapon.mDemageRange.mHigh=6;
        break;

    default:
        mClassName="Thief";
        mAccuracy=7;
        mHitPoints=12;
        mMaxHitPoints=12;
        mExpPoints=0;
        mNextLevelExp=1000;
        mLevel=1;
        mArmor=2;
        mWeapon.mName="Short Swoard";
        mWeapon.mDemageRange.mLow=1;
        mWeapon.mDemageRange.mHigh=6;
        break;
}
}

bool Player::attack(Monster& monster)
{
    int selection=1;
    cout<<"1) Attack 2)Run: ";
    cin >> selection;
    cout <<endl;

    switch(selection)
    {
        case 1:
            cout << "You attack an " << monster.getName() << " with a " <<mWeapon.mName << endl;

            if(Random(0,20) < mAccuracy)
            {
                int damage = Random(mWeapon.mDemageRange);
                int totalDamage=damage-monster.getArmor();
                if(totalDamage<=0)
                {
                    cout<<"Your Attack faild to penetrate " << "the armor"<<endl;
                }
                else
                {
                    cout<<"You attack for "<<totalDamage<<" damage!"<<endl;
                }
            }
            else
            {
                cout <<"You Miss"<<endl;
            }
            cout<<endl;
            break;
        
        case 2:
            int roll=Random(1,4);
            if(roll ==1)
            {
                cout<<"You ran away!"<<endl;
                return true;
            }
            else
            {
                cout<<"You could not escape!"<<endl;
                break;
            }
    }
}

void Player::levelUp()
{
    if(mExpPoints >=mNextLevelExp)
    {
        cout <<" You gained a level!"<<endl;
        mLevel++;
        mNextLevelExp=mLevel * mLevel * 1000;
        mAccuracy +=Random(1,3);
        mMaxHitPoints += Random(2,6);
        mArmor +=Random(1,2);
        
        mHitPoints=mMaxHitPoints;
    }
}

void Player::rest()
{
    cout << "Resting ..."<<endl;
    mHitPoints=mMaxHitPoints;
}

void Player::viewStats()
{
    cout << "Player STATS"<<endl;
    cout << "============"<<endl;
    cout << endl;

    cout << "Name            = "<< mName <<endl;
    cout << "Class           = "<< mClassName <<endl;
    cout << "Accuracy        = "<< mAccuracy <<endl;
    cout << "Hitpoints       = "<< mHitPoints <<endl;
    cout << "MaxHitpoints    = "<< mMaxHitPoints <<endl;
    cout << "XP              = "<< mExpPoints <<endl;
    cout << "XP for next Lvl = "<< mNextLevelExp <<endl;
    cout << "Level           = "<< mLevel <<endl;
    cout << "Armor           = "<< mArmor <<endl;
    cout << "Weapon Name     = "<< mWeapon.mName <<endl;
    cout << "Weapon Damage   = "<< mWeapon.mDemageRange.mLow << "-" << mWeapon.mDemageRange.mHigh <<endl;
    
    cout << endl;
    cout << "END PLAYER STATS"<<endl;
    cout << "================"<<endl;
    cout << endl;
}

void Player::victory(int xp)
{
    cout << " You Won the Battle!!!" << endl;
    cout << " You win " << xp << " expirencee points!" << endl<<endl;
    mExpPoints += xp;
}

void Player::gameover()
{
    cout<<"You died in battle..."<<endl;
    cout<<endl;
    cout<< "===================="<<endl;
    cout<< "GAME OVER!"<<endl;
    cout<< "Pres 'q' to quit: ";
    char q='q';
    cin >>q;
    cout <<endl;
}

void Monster::displayHitPoints()
{
    cout<< mName << " 's hitpoints = " << mHitPoints << endl;
}



main.cpp

Kod: Zaznacz cały

#include <iostream>
#include <string>
#include "player.h"
#include "weapon.h"
#include "monster.h"

using namespace std;

int main()
{
    Weapon sword;
    Player player;
    player.createClass();
    sword.mName="miecz";
    sword.mDemageRange.mHigh=5;
    Monster* ork= new Monster("Ork samo zlo",10,10,10,10,"topur",1,10);
    
}

podczas kopilacji wyskakuje mi następujący błąd

Kod: Zaznacz cały

g++ main.cpp weapon.h  -o main
    In file included from player.h:5,
    from main.cpp:3:
    monster.h:21: error: ‘Player’ has not been declared
Prosze o pomoc w czym tkwi problem.

Pozdrawiam

GameBoy
maho
Użytkownik
Posty: 455
Rejestracja: 2006-03-25, 12:28
Lokalizacja: Kielcowo

Re: [c++] Problem z klasami

Post autor: maho »

To nie lepiej zrobic, by attack zwracal ilosc punktow ataku?
np.

Kod: Zaznacz cały

Player->isAttacked(Monster->attack());
Ostatnio zmieniony 2010-02-14, 22:59 przez maho, łącznie zmieniany 1 raz.
mati0712
Użytkownik
Posty: 65
Rejestracja: 2007-05-18, 20:05

Re: [c++] Problem z klasami

Post autor: mati0712 »

Klasa Player potrzebuje Monster, a klasa Monster Player. Rozwiązaniem jest dodanie

Kod: Zaznacz cały

class Player;
przed

Kod: Zaznacz cały

class Monster { ...
ODPOWIEDZ