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

반복되는 부분이 많아서 생략하고 첨부파일로 올림.

minirpg.zip


메인 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
Posted by misty_
,