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; };
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; };
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; };
-기본생성자
-생성자("아이템이름", "아이템설명", 필요골드, 아이템개수)
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; };
-기본생성자
-생성자("아이템이름", "아이템설명", 필요골드, 아이템개수)
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>
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 ' 에서는 소스코드를 예쁘게 넣는 방법도 잘 몰랐고
정리방법도 잘 몰랐는데 지인의 조언으로 나름대로 정리를 해봤습니다.
비록 아무도 관심이 없을지라도 기록이 중요한 것 같아 온라인에 기록합니다 (끄적)
지적이나 아무말 환영합니다
'개발일지' 카테고리의 다른 글
[Web] Twitter 개발기 (0) | 2018.10.02 |
---|---|
[Unity] 'Toms And Jerry' - 1인 미니게임개발기 (0) | 2018.01.29 |
[개발일지] '용사가 되자' part 3 (0) | 2018.01.16 |
[개발일지] '용사가 되자' part 1 (0) | 2018.01.07 |