Unit 클래스를 상속받아 전사, 마법사, 적, 보스를 만들고
오버라이딩하여 공격 및 피격을 각각 다르게 적용되게 만드는 상속 연습예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #pragma once class Unit { protected : int power; int mpower; int defense; int mdefense; int hp; int mp; int id; public: Unit(); ~Unit(); virtual int Attack() = 0; virtual int MAttack() = 0; virtual void Hit(int atk) = 0; virtual void MHit(int matk) = 0; virtual int getHP() = 0; virtual int getMP() = 0; virtual int getID(); }; | cs |
Unit은 선언만 되어있고, 정의는 되어있지않음.
선언, 정의는 반복 (생략)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include "Unit.h" #pragma once class knight : public Unit { public: knight(); ~knight(); int Attack(); int MAttack(); void Hit(int atk); void MHit(int matk); int getHP(); int getMP(); int getID(); }; | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #include "stdafx.h" #include "knight.h" #include <iostream> knight::knight() { power = 10; mpower = 0; defense = 5; mdefense = 4; hp = 30; mp = 0; id = 0; // 전사 } knight::~knight() { } int knight::Attack() { return power; } int knight::MAttack() { mp -= 10; return mpower; } void knight::Hit(int atk) { int damage = atk - defense; if (damage > 0) { hp -= damage; std::cout << damage << "의 데미지를 입었다.\n"; } } void knight::MHit(int matk) { int damage = matk - mdefense; if (damage > 0) { hp -= damage; std::cout << damage << "의 데미지를 입었다.\n"; } } int knight::getHP() { return hp; } int knight::getMP() { return mp; } int knight::getID() { return id; } | cs |
반복되는 부분이 많아서 생략하고 첨부파일로 올림.
메인 cpp파일
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | #include "stdafx.h" #include "Unit.h" #include "knight.h" #include "magician.h" #include "enemy.h" #include "boss.h" #include <iostream> #include <time.h> using namespace std; int main() { srand(time(0)); int job; cout << "직업을 선택하세요 \n" << "1 전사 / 2 마법사 : "; cin >> job; Unit* character = nullptr; if (job == 1) { character = new knight; } else if (job == 2) { character = new magician; } int death = 1; int clear = 1; int count = 0; Unit* monster = new enemy; while (clear && death) { cout << "\n"; int atktype; if (character->getID() == 0) // 전사이면 { cout << "전사 \n" << "1 일반공격 : "; cin >> atktype; } else if (character->getID() == 1) // 마법사이면 { cout << "마법사 \n" << "1 일반공격 2 마법공격 : "; cin >> atktype; } cout << "\n" << "=======================================\n"; if (atktype == 1) // 일반공격이면 { cout << "일반공격 \n"; monster->Hit(character->Attack()); } else if (atktype == 2) // 마법공격이면 { cout << "마법공격 \n"; if(character->getMP() > 0) monster->MHit(character->MAttack()); else { cout << "마나가 부족하여 일반공격합니다. \n"; monster->Hit(character->Attack()); } } if (monster->getHP() > 0) // 몬스터의 피가 남았다면 유저공격 { cout << "Enemy : HP - " << monster->getHP() << " MP - " << monster->getMP() << "\n"; if (monster->getID() == 2) // 일반 몬스터면 { cout << "\n적의 일반공격 \n"; character->Hit(monster->Attack()); } else if (monster->getID() == 3) // 보스면 { if (rand() % 2) // 랜덤으로 일반공격 or 마법공격 { cout << "\n보스의 일반공격 \n"; character->Hit(monster->Attack()); } else { cout << "\n보스의 마법공격 \n"; if(monster->getMP() > 0) character->MHit(monster->MAttack()); else { cout << "마나가 부족하여 일반공격합니다. \n"; character->Hit(monster->Attack()); } } } if (character->getHP() > 0) cout << "Character : HP - " << character->getHP() << " MP - " << character->getMP() << "\n"; else { death = 0; cout << "캐릭터가 사망했습니다. \n"; } } else // 몬스터의 피가 없다면 { cout << "적이 쓰러졌습니다. \n\n"; if (monster->getID() == 3) // 보스를 죽였다면 클리어 { clear = 0; cout << "축하합니다. 게임을 클리어하셨습니다. \n"; } else // 보스가 아니면 적생성 { if (count == 0) // 처음이면 적을 생성 { cout << "새로운 적 등장\n"; delete monster; monster = new enemy; count++; } else if (count == 1) // 2번째 적이 죽으면 보스생성 { cout << "보스 등장\n"; delete monster; monster = new boss; } } } cout << "=======================================\n"; } return 0; } | cs |
'프로그래밍 공부 > C++' 카테고리의 다른 글
템플릿(template) (0) | 2018.03.21 |
---|---|
2중 포인터 (0) | 2018.03.21 |
사각형, 원 충돌 체크 (상속 예제) (0) | 2018.03.21 |
상속, 오버라이딩 (0) | 2018.03.21 |
문자열 연결 및 비교(연산자 오버로딩 예제) (0) | 2018.03.21 |