본문 바로가기

개발일지

[개발일지] '용사가 되자' part 2


part 1 에 이은

part 2 입니다

정리에 조금 더 신경 썻습니다

.

.

.

.

[ 주요 업데이트 ]

#1  상점구현

#2  물약섭취

#3  레벨업시에 능력치 변화


변경사항은 이 정도입니다.

일단 소스코드가 긴 점은 이해부탁드립니다.


[ Class ]

 - PotionHp

 - PotionMp

 - Helmet

 - Sword

 - Hero

 - Goblin


class 는 이렇게 6가지가있습니다. 아직 상속을 배우지 않아 코드가 다소 복잡 할 수 있습니다.




class PotionHP{
public:
    PotionHP(){}
    PotionHP(string tempName, string tempDescription, int tempGold, int tempCount, int tempHpAmount){
        name = tempName;
        description = tempDescription;
        gold = tempGold;
        count = tempCount;
        hpAmount = tempHpAmount;
    }
    
    void showInfo(){
        std::cout << "==========================" << std::endl;
        std::cout << "이름 : " << name << std::endl;
        std::cout << "설명 : " << description << std::endl;
        std::cout << "HP회복 : +" << hpAmount << std::endl;
        std::cout << "골드 : " << gold << std::endl;
    }
    int getGold(){
        return gold;
    }
    int getHpAmount(){
        return hpAmount;
    }
    void setCount(int tempCount){
        count -= tempCount;
    }
private:
    string name;
    string description;
    int hpAmount;
    int gold;
    int count;
};

PotionHp 클래스

- 기본생성자
- 생성자("포션이름", "포션 설명", 필요골드, 포션의 개수, 회복량)
- void showInfo()  
- 포션에대한 설명 출력
- int getGold()
- 포션의 가격 return
- int getHpAmount()
- 포션의 회복량 return
- void setCount(int tempCount)
- 상점의 포션 개수 set



class PotionMP{
public:
    PotionMP(){}
    PotionMP(string tempName, string tempDescription, int tempGold, int tempCount, int tempMpAmount){
        name = tempName;
        description = tempDescription;
        gold = tempGold;
        count = tempCount;
        mpAmount = tempMpAmount;
    }
    
    void showInfo(){
        std::cout << "==========================" << std::endl;
        std::cout << "이름 : " << name << std::endl;
        std::cout << "설명 : " << description << std::endl;
        std::cout << "MP회복 : +" << mpAmount << std::endl;
        std::cout << "골드 : " << gold << std::endl;
    }
    int getGold(){
        return gold;
    }
    int getMpAmount(){
        return mpAmount;
    }
    void setCount(int tempCount){
        count -= tempCount;
    }
    
    
private:
    string name;
    string description;
    int gold;
    int count;
    int mpAmount;
};

PotionMp 클래스

- 기본생성자
- 생성자("포션이름", "포션 설명", 필요골드, 포션의 개수, 회복량)
- void showInfo()  
- 포션에대한 설명 출력
- int getGold()
- 아이템의 가격 return
- int getMpAmount()
- 포션의 회복량 return
- void setCount(int tempCount)
- 상점의 포션 개수 set



class Helmet{
public:
    Helmet(){}
    Helmet(string tempName, string tempDescription, int tempGold, int tempCount){
        name = tempName;
        description = tempDescription;
        gold = tempGold;
        count = tempCount;
        armor = 20;
    }
    ~Helmet(){
        std::cout << "~remove HelmetClass" << std::endl;
    }
    void showInfo(){
        std::cout << "==========================" << std::endl;
        std::cout << "이름 : " << name << std::endl;
        std::cout << "설명 : " << description << std::endl;
        std::cout << "골드 : " << gold << std::endl;
    }
    int getGold(){
        return gold;
    }
    int getArmor(){
        return armor;
    }

private:
    string name;
    string description;
    int gold;
    int count;
    int armor;
};

Helmet 클래스


-기본생성자

-생성자("아이템이름", "아이템설명", 필요골드, 아이템개수)

- void showInfo()  
- 아이템에대한 설명 출력
- int getGold()
- 아이템의 가격 return
- int getArmor()
- armor값 return



class Sword{
public:
    Sword(){}
    Sword(string tempName, string tempDescription, int tempGold, int tempCount){
        name = tempName;
        description = tempDescription;
        gold = tempGold;
        count = tempCount;
        damage = 10;
    }
    ~Sword(){
        std::cout << "~remove SwordClass" << std::endl;
    }
    void showInfo(){
        std::cout << "==========================" << std::endl;
        std::cout << "이름 : " << name << std::endl;
        std::cout << "설명 : " << description << std::endl;
        std::cout << "골드 : " << gold << std::endl;
    }
    int getGold(){
        return gold;
    }
    int getAttack(){
        return damage;
    }

private:
    int damage;
    string name;
    string description;
    int gold;
    int count;
};


Sword 클래스


-기본생성자

-생성자("아이템이름", "아이템설명", 필요골드, 아이템개수)

- void showInfo()  
- 아이템에대한 설명 출력
- int getGold()
- 아이템의 가격 return
- int getAttack()
- damage값 return


class Hero{
public:
    Hero(){
        name = "김용사";
        MAXHP = 100;
        MAXMP = 150;
        MAXEXP = 100;
        hp = 100;
        mp = 150;
        armor = 10;
        damage = 20;
        exp = 0;
        level = 1;
        gold = 0;
        helmet = nullptr;
        sword = nullptr;
        potionHpCount = 0;
        potionMpCount = 0;
    }
    Hero(string userName){
        name = userName;
        MAXHP = 100;
        MAXMP = 150;
        MAXEXP = 100;
        hp = 100;
        mp = 150;
        armor = 10;
        damage = 20;
        exp = 0;
        level = 1;
        gold = 0;
        helmet = nullptr;
        sword = nullptr;
        potionHpCount = 0;
        potionMpCount = 0;
    }
    ~Hero(){
        std::cout << "~remove HeroClass" << std::endl;
    }
public:
    void showStat(){
        std::cout << "=============================" << std::endl;
        std::cout << "Name : " << name << std::endl;
        std::cout << "Level : " << level << std::endl;
        std::cout << "HP : " << hp << " / " << MAXHP << std::endl;
        std::cout << "MP : " << mp << " / " << MAXMP << std::endl;
        std::cout << "Armor : " << armor <<" (+ "<< (helmet == nullptr ? 0 : helmet->getArmor()) << ")" << std::endl;
        std::cout << "Attack : " << damage <<" (+ " << (sword == nullptr ? 0 : sword->getAttack()) << ")" << std::endl;
        std::cout << "Exp : " << exp << " / " << MAXEXP << std::endl;
        std::cout << "Gold : " << gold << std::endl;
        std::cout << "=============================" << std::endl;
    }
    string getName(){
        return name;
    }
    int getHp(){
        return hp;
    }
    int getMAXHP(){
        return MAXHP;
    }
    int getMp(){
        return mp;
    }
    int getArmor(){
        return armor;
    }
    int getAttack(){
        return damage;
    }
    int getGold(){
        return gold;
    }
    int getPotionHpCount(){
        return potionHpCount;
    }
    int getPotionMpCount(){
        return potionMpCount;
    }
    
    void setHp(int tempHp){ //HP관리(전투)
        hp = tempHp;
    }
    void setMp(int tempMp){ //MP관리(전투)
        mp = tempMp;
    }
    void usePotionHp(int tempHp){ //hp물약사용
        if(hp + tempHp > MAXHP){
            tempHp = MAXHP - hp;
        }
        else
            hp += tempHp;
        std::cout << "[체력이 회복되었습니다]  + " << tempHp << std::endl;
        std::cout << "HP : " << hp << " / " << MAXHP << std::endl;
    }
    void usePotionMp(int tempMp){ //mp물약사용
        if(mp + tempMp > MAXMP)
            tempMp = MAXMP - mp;
        else
            mp += tempMp;
        std::cout << "[마나가 회복되었습니다]  + " << tempMp << std::endl;
        std::cout << "MP : " << mp << " / " << MAXMP << std::endl;
    }
    void setPotionHpCount(int potionCount){ // hp포션 개수
        potionHpCount += potionCount;
    }
    void setPotionMpCount(int potionCount){ // mp포션 개수
        potionMpCount += potionCount;
    }
    void setHelmet(Helmet *temp){ // 헬멧장착
        helmet = temp;
        setArmor(temp->getArmor());
        std::cout << "[헬멧 장착완료!]" << std::endl;
    }
    void setSword(Sword *temp){ // 소드장착
        sword = temp;
        setAttack(temp->getAttack());
        std::cout << "[소드 장착완료!]" << std::endl;
    }
    void setGold(int tempGold){ //  골드획득
        if(gold + tempGold < 0){
            gold = 0;
        }
        else
            gold += tempGold;
    }
    void setExp(int tempExp){ // 경험치획득
        if(exp + tempExp < MAXEXP){
            exp += tempExp;
        }
        if(exp + tempExp >= MAXEXP){
            exp = exp + tempExp;
            exp -= MAXEXP;
            levelUp();
        }
        if(exp + tempExp < 0){
            exp = exp + tempExp;
            exp += MAXEXP;
            levelDown();
        }
    }
    void levelUp(){ // 레벨업
        level++;
        MAXHP += 40;
        MAXMP += 30;
        MAXEXP += 30;
        damage += 10;
        armor += 5;
        hp = MAXHP;
        mp = MAXMP;
        exp = 0;
    }
    void levelDown(){ // 레벨다운
        if(level == 1){
            level = 1;
        }
        else{
            level--;
            MAXHP -= 40;
            MAXMP -= 30;
            MAXEXP -= 30;
            damage -= 10;
            armor -= 5;
            hp = MAXHP;
            mp = MAXMP;
            exp = MAXEXP - 100;
        }
    }
    void setArmor(int tempArmor){
        armor += tempArmor;
    }
    void setAttack(int tempDamage){
        damage += tempDamage;
    }
    void showInventory(){
        std::cout << "================================" << std::endl;
        std::cout << "[ 인벤토리 ]" << std::endl;
        std::cout << "현재 골드 : " << gold << std::endl;
        std::cout << "빨간 물약 : " << potionHpCount << std::endl;
        std::cout << "파란 물약 : " << potionMpCount << std::endl;
        std::cout << "================================" << std::endl;
    }
    void showGold(){
        std::cout << "현재 골드 : " << gold << std::endl;
    }
    
private:
    string name;
    int MAXHP;
    int MAXMP;
    int MAXEXP;
    int hp;
    int mp;
    int armor;
    int damage;
    int exp;
    int level;
    int gold;
    int potionHpCount;
    int potionMpCount;
    Helmet *helmet;
    Sword *sword;
};

Hero 클래스


- 기본생성자

- 생성자("용사이름")

- void showStat()

- 스탯출력

- string getName()

- 이름리턴

- int getHp()

- hp값 return

- int getMAXHP()

- MAXHP값 return

- int getMp()

- mp값 return

- int getArmor()

- armor값 return

- int getAttack()

- damage값 return

- int getGold()

- gold값 return

- int getPotionHpCount()

- hp포션개수 return

- int getPotionMpCount()

- mp포션개수 return

- void setHp(int tempHp)

- hp값 set (전투 시)

- void setMp(int tempMp)

- mp값 set (전투 시)

- void usePotionHp(int tempHp)

- tempHp로 회복량을 받아서 현재체력 증가

- void usePotionMp(int tempMp)

- tempMp로 회복량을 받아서 현재마나 증가

- void setPotionHpCount(int potionCount)

- potionCount값 받아서 현재 포션양 set

- void setPotionMpCount(int potionCount)

- potionCount값 받아서 현재 포션양 set

- void setHelmet(Helmet *temp)

- 뚝배기를 끼면 아머 증가

- void setSword(Sword *temp)

- 소드를 끼면 공격력 증가

- void setGold(int tempGold)

- 골드획득 (전투)

- void setExp(int tempExp)

- 경헙치획득 (전투)

- void levelUp()

- 레벨업 ( 레벨업시 최대체력, 아머, 공격력등등 기본능력치 향상)

- void levelDown()

- 레벨다운 (많이죽으면)

- void setArmor(int tempArmor)

- 용사의 armor값 set

- void setAttack(int tempDamage)

- 용사의 damage값 set

- void showInventory()

- 용사의 인벤토리를 보여줌

- void showGold()

- 용사의 현재골드를 보여줌




class Goblin{
public:
    Goblin(){
        name = "고블린";
        MAXHP = 60;
        hp = 60;
        armor = 10;
        damage = 10;
        exp = 25;
        gold = 30;
    }
    void showStat(){
        std::cout << "이름 : " << name << std::endl;
        std::cout << "체력 : " << hp << " / " << MAXHP << std::endl;
        std::cout << "방어력 : " << armor << std::endl;
        std::cout << "공격력 : " << damage << std::endl;
    }
    string getName(){
        return name;
    }
    int getHp(){
        return hp;
    }
    int getMAXHP(){
        return MAXHP;
    }
    int getArmor(){
        return armor;
    }
    int getAttack(){
        return damage;
    }
    int getExp(){
        return exp;
    }
    int giveGold(){
        return gold;
    }
private:
    string name;
    int MAXHP;
    int hp;
    int armor;
    int damage;
    int exp;
    int gold;
};
<textarea>

Goblin 클래스

- 기본 생성자
- 고블린의 체력, 경험치 등등 초기화
- void showStat()
- 고블린의 스탯을 보여줌
- int getHp()
- 고블린의 hp return
- int getMAXHP()
- 고블린의 MAXHP return
- int getArmor()
- 고블린의 armor return
- int getAttack()
- 고블린의 damage return
- int getExp()
- 고블린의 exp return
- int giveGold()
- 고블린의 고유 gold return




int main() {
    int num = 0;
    int itemSelect;
    int buyCount;
    int actionNum;
    
    Hero* h = new Hero(getName());
    h->showStat();
    
    PotionHP *hp = new PotionHP("빨간포션", "피를 50 회복", 50, 99, 50);
    PotionMP *mp = new PotionMP("파란포션", "마나를 40 회복", 60, 99, 40);
    Helmet *helmet = new Helmet("오토바이헬멧", "아머가 20 증가", 200, 99);
    Sword *sword = new Sword("목검", "공격력 10 증가", 150, 99);
    
    while(num != 5){
        num = selectMenu();
            switch(num){
                case 1: { // 전투하기
                    Goblin *goblin = new Goblin();
                    Goblin *tempG = goblin;
                    Hero *tempH = h;
                    battle(tempH, tempG);
                    break;
                }
                case 2: { // 능력치보기
                    h->showStat();
                    break;
                }
                case 3: { //상점가기
                    showItemList(hp, mp, helmet, sword);
                    std::cout << std::endl;
                    h->showGold();
                    std::cout << std::endl;
                    itemSelect = getInputNum();
                    switch(itemSelect){ // 구입전 gold체크 후 구입여부 판단 함
                        case 1:
                            std::cout << "몇개를 구입하시겠습니까 ?" << std::endl;
                            buyCount = getInputNum(); //구입 전 개수 입력
                            if(h->getGold() >= (hp->getGold() * buyCount)){ // 가지고있는 gold >= 사려는것의 가격
                                h->setGold(-(hp->getGold() * buyCount));
                                h->setPotionHpCount(buyCount);
                                hp->setCount(buyCount);
                                std::cout << "[빨간물약]을  " << buyCount << "개 구입했습니다" << std::endl;
                                std::cout << "Gold : -" << (hp->getGold() * buyCount) << std::endl;
                                h->showGold();
                            }
                            else{
                                std::cout << (hp->getGold() * buyCount) - h->getGold() << "골드가 부족합나다" << std::endl;
                                h->showGold();
                            }
                            break;
                        case 2:
                            std::cout << "몇개를 구입하시겠습니까 ?" << std::endl;
                            buyCount = getInputNum();
                            if(h->getGold() >= (mp->getGold() * buyCount)){
                                h->setGold(-(mp->getGold() * buyCount));
                                h->setPotionMpCount(buyCount);
                                mp->setCount(buyCount);
                                std::cout << "[파란물약]을  " << buyCount << "개 구입했습니다" << std::endl;
                                std::cout << "Gold : -" << (mp->getGold() * buyCount) << std::endl;
                            }
                            else{
                                std::cout << (mp->getGold() * buyCount) - h->getGold() << "골드가 부족합나다" << std::endl;
                                h->showGold();
                            }
                            break;
                        case 3:
                            if(h->getGold() >= helmet->getGold()){
                                h->setGold(-(helmet->getGold()));
                                h->setHelmet(helmet);
                                std::cout << "[오토바이헬멧] 을 구입했습니다" << std::endl;
                                std::cout << "Gold : -" << (helmet->getGold()) << std::endl;
                            }
                            else{
                                std::cout << helmet->getGold() - h->getGold() << "골드가 부족합니다" << std::endl;
                                h->showGold();
                            }
                            break;
                        case 4:
                            if(h->getGold() >= sword->getGold()){
                                h->setGold(-(sword->getGold()));
                                h->setSword(sword);
                                std::cout << "[목검] 을 구입했습니다" << std::endl;
                                std::cout << "Gold : -" << (sword->getGold()) << std::endl;
                            }
                            else{
                                std::cout << sword->getGold() - h->getGold() << "골드가 부족합니다" << std::endl;
                                h->showGold();
                            }
                            break;
                    }
                    break;
                }
                case 4:{ //인벤토리가기
                    h->showInventory();
                    showAction();
                    actionNum = getInputNum();
                    switch(actionNum){
                        case 1:
                            if(h->getPotionHpCount() > 0){
                                h->usePotionHp(hp->getHpAmount());
                                h->setPotionHpCount(-1);
                                std::cout << "현재 HP포션 : " << h->getPotionHpCount() << std::endl;
                            }
                            else
                                std::cout << "[포션이 없습니다]" << std::endl;
                            break;
                        case 2:
                            if(h->getPotionMpCount() > 0){
                                h->usePotionMp(mp->getMpAmount());
                                h->setPotionMpCount(-1);
                                std::cout << "현재 MP포션 : " << h->getPotionMpCount() << std::endl;
                            }
                            else
                                std::cout << "[포션이 없습니다]" << std::endl;
                            break;
                        case 3:
                            std::cout << "[메뉴로 나갑니다]" << std::endl;
                            break;
                    }
                    break;
                }
                case 5: { //나가기
                    std::cout << "[ 용사가 잠들었습니다 ]" << std::endl;
                    break;
                }
            }
    }


    delete h;
    return 0;
}


main


에는 중요한 부분들만 주석을 걸었습니다!



[ 알게 된 점 ]

- 객체지향을 잘써야겠다. 편하다

- 상속이 필요하다. 노가다이다 (다음 주 상속 예정)

- 내 마음대로 만들어서 재밌다

- 갈길이 멀다


[ 고쳐야 할 점 ]

- 일단 많은 것 같다

- 상속이 절실히 필요하다

- 쓸데없이 중복되는 메서드가 많은 것 같다

- 메인메뉴가 난잡한데 경험이 부족해서 그런 것 같다. 다른사람들의 소스코드를 비교 해 봐야겠다.

- 멤버변수 이름이나, 함수이름을 좀 제대로 써야 할 것 같다. 작명센스도 중요 요소임에 틀림없다.



여러가지 긴 글  봐주셔서 감사합니다

사실 ' [개발일지] part 1 ' 에서는 소스코드를 예쁘게 넣는 방법도 잘 몰랐고

정리방법도 잘 몰랐는데 지인의 조언으로 나름대로 정리를 해봤습니다.

비록 아무도 관심이 없을지라도 기록이 중요한 것 같아 온라인에 기록합니다 (끄적)


지적이나 아무말 환영합니다