2013-06-19 2 views
1

맨 먼저 프로그래밍 초보자라고 말하고 싶습니다. 내가 궁금해하는 것에 대해 구체적으로 조언을 구하지 못했습니다.(C++) OOP - 클래스로 초보자 화하기

저는 여러 권의 책을 통해 C++을 배우고 있으며, 제 자신의 작은 아이디어를 생각하고 자신의 능력을 최대한 발휘하여 배우는 것을 사용하고 있습니다. 내가 생각한 한 가지는 분지 선택이 가능한 짧은 텍스트 기반 RPG입니다. 이 RPG에서는 캐릭터를 만들 때 선택할 수있는 여러 종족과 직업이 있습니다. 이전 이벤트 (또는 캐릭터의 속성)에 의해 영향을받을 수있는 여러 이벤트로 구성됩니다. 예를 들어, 첫 번째 이벤트에서 옵션 3을 선택하면 두 번째 이벤트에서 추가 옵션의 잠금을 해제 할 수 있습니다. 또는 캐릭터가 X 인 경우 다른 사람이 가지고있는 옵션이 누락되었을 수 있습니다.

학습을 시작한 후 불과 며칠 만에이 이벤트가 시작되었지만 버그가 없었습니다 (코드는 매우 복잡했습니다). 이제는 객체 지향 프로그래밍에 착수 했으므로 클래스를 사용하여이 프로그램을 다시 수행하기로 결정했습니다. 지금까지 코딩 한 내용은 인종, 직업, 성별 등과 같은 데이터 멤버뿐만 아니라이 모든 것을 가져오고 설정하는 멤버 함수 및 생성을 초기화하는 생성자 (예 : 이 게시물의 끝에 전체 수업을 추가하여이를 검토하고 결함을 지적하거나 개선 할 수있는 방법을 지적하십시오.) 주 함수에서 유일한 것은 charCreate 함수를 호출하는 것입니다.

기본적으로 여기서부터 정확히 어디로 가야할 지 모르겠습니다. 나는 이것에 순전히 객체 지향적 인 접근 방식을 원한다. 다른 이벤트 클래스를 만들어야합니까? 이벤트가 Characters 클래스에 속해야합니까? OOP 방법을 사용하여 분기를 유도하려면 어떻게해야합니까?

나는이 질문의 핵심은 올바른 길로 나를 설정하고 학습자로서 성장하는 데 도움이되는 가치있는 조언을 제공 할 수있는 경험이있는 사람들로부터 조언을 얻는 것이다.

감사

Character.H

#ifndef CHARACTER_H 
#define CHARACTER_H 
#include <string> 

using namespace std; 

class Character 
    { 
public: //these are fairly self explanatory... set/get functions for the data members 
    Character();   
    void charCreate(); 
    void setName(string); 
    void setGender(int); 
    void setRace(int); 
    void setProf(int); 
    string getName(); 
    string getGender(); 
    string getRace(); 
    string getProf(); 
private: 
    string charName; //character name 
    string charGender; //character gender 
    string charRace; //character race 
    string charProf; //character profession 
    int charGold = 50; //initial gold amount 
    int charMana; //this is only relevant for wizards, doesn't matter for other professions 
    string profWep; //profession-exclusive weapons 

}; 

#endif // CHARACTER_H 

Character.cpp

#include "Character.h" 
#include <iostream> 
#include <string> 

using namespace std; 

Character::Character() 
{ 
Character::charCreate(); //constructor initializes the character creation function below 
} 
void Character::charCreate(){ 

string name; 
bool gender; 
int race; 
int prof; 




cout << "\n\n\n\nFirst, what is your name? (23 characters max) "; 
getline(cin,name); 

setName(name); 

cout << "\n\nAre you male or female? (0 for female, 1 for male)"; 
cin >> gender; 
    while (gender > 1 || gender < 0){ 
     cout << "\n\nInvalid. Please select a valid option."; 
     cin >> gender; 
} 

setGender(gender); 

cout << "\n\nSelect your race: \n\n" 
     "1 - Human\n" 
     "2 - Dwarf\n" 
     "3 - Elf\n\n"; 
cin >> race; 
    while (race > 3 || race < 1){ 
     cout << "\n\nInvalid. Please select a valid option."; 
     cin >> race; 
    } 
setRace(race); 

cout << "\n\nFinally, select your class: \n\n" 
     "1 - Warrior\n" 
     "2 - Thief\n" 
     "3 - Wizard\n\n"; 
cin >> prof; 
    while (prof > 3 || prof < 1){ 
     cout << "\n\nInvalid. Please select a valid option."; 
     cin >> prof; 
    } 
setProf(prof); 
} 

void Character::setName(string name){ 
if (name.length() <= 23){ 
    charName = name; 
} 
else{ 
    charName = name.substr(0,23); 
    cout << "\nName too long; limiting to 23 characters.\n\n" 
      "Your name is " << charName << "."; 
    } 
} 
void Character::setGender(int gender){ 
if(gender == 1){ 
charGender = "male" ; 
} 
else if (gender == 0){ 
charGender = "female"; 
    } 
} 
void Character::setRace(int race){ 
if (race == 1){ 
    charRace = "human"; 
} 
else if (race == 2){ 
    charRace = "dwarf"; 
} 
else if (race == 3){ 
    charRace = "elf"; 
    } 
} 
void Character::setProf(int prof){ 
if (prof == 1){ 
    charProf = "warrior"; 
    profWep = "sword & shield"; 
} 
else if (prof == 2){ 
    charProf = "thief"; 
    profWep = "dagger"; 
} 
else if (prof == 3){ 
    charProf = "wizard"; 
    profWep = "staff"; 
    } 
} 
string Character::getName(){ 
    return charName; 
} 
string Character::getGender(){ 
    return charGender; 
} 
string Character::getRace(){ 
    return charRace; 
} 
string Character::getProf(){ 
    return charProf; 
    return profWep; //the weapon is linked to the class, so I decided 
        //to have them both returned together 
} 
+0

모든 긴 텍스트, 변명 및 샘플에서 질문을 알아낼 수 없습니다! 포인트를 가지고, 당신이 가지고있는 것은 적어도이 포럼을위한 것이 아닙니다. ... –

+0

더 깊은 표정 (내 망막이 여전히 깜박입니다) 나는 당신이 [class factory patterns] (http : //en.wikipedia.org/wiki/Factory_method_pattern) 및 OOP [디자인 패턴] (http://en.wikipedia.org/wiki/Design_Patterns)을 참조하십시오. 이것은 도움이 될 수 있습니다 ... –

+0

여기에서 원하는 것을 원하십니까? – ikis

답변

0

당신의 우주에서 추상 엔티티를 대표해야하는 클래스; Warrior 클래스와 Enemy 클래스를 만들면 비슷한 속성 (예 : life)을 공유한다는 것을 알 수 있습니다. 이 경우 레벨을 올라서 Entity 클래스를 만들고이 클래스에서 WarriorEnemy을 유도 할 수 있습니다.

그러나 이것은 필요하지 않습니다. 당신은 클래스의 메소드 안에 전체 프로그램을 작성하고 제대로 작동하게 할 수 있습니다. 정말 중요한 것은 개념 객체 지향 디자인입니다. 무엇 가야 어디이유? C++와 같은 객체 지향 도구는 이러한 아이디어를 안전하게 구현할 수 있도록합니다.

기존의 모든 객체와 해당 객체를 확인하고 이에 따라 클래스를 구현하십시오. 현재 하나의 Character 클래스가 있습니다. 분기는 main 함수 내에서 수행 할 수 있습니다. 정말로 다른 장소에 배치 할 필요가 없습니다.실제로 프로그램이 너무 작기 때문에 상속, 캡슐화 및 다형성과 같은 OO 개념을 최대한 활용하여 수십 개의 클래스로 확장하지 않는 한이 게임에 대한 OO 접근 방식을 추구하지 않습니다.