2013-06-19 51 views
1

首先我想說的是我是編程的初學者。我無法找到有關我想知道的具體建議。(C++)面向對象的分類 - 初學者的困境

我正在通過幾本書學習C++,並且總是通過提出我自己的小創意並將它們編碼以盡我所能地使用我正在學習的內容。我想到的一個這樣的事情是一個基於短文本的RPG,它具有分支選擇。在這個角色扮演遊戲中,你有幾個不同的種族和職業可供選擇,當你創建你的角色。它被組織成幾個事件,這些事件可能受到你以前的行爲(甚至是你的角色的屬性)的影響 - 例如,如果你在第一個事件中選擇了選項3,那麼你可以在第二個事件中解鎖一個額外的選項。或者如果你的角色是X,你可能會錯過其他人的選擇。

我最初是在我開始學習和編碼4個這樣的事件之後幾天纔開始的,它相當沒有錯誤(但代碼非常混亂)。現在我正在進入面向對象編程,我決定用類來重做這個程序。我到目前爲止編寫的是一個「Character」類,它包含數據成員,如種族,職業,性別等等,以及獲取和設置所有這些成員函數的成員函數,以及初始化創建的構造函數(I在這篇文章的末尾會添加整個班級,這樣你就可以檢查這些內容,並指出任何缺陷或如何改進)。我在主函數中唯一的事情就是調用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

有更深入的瞭解(我的視網膜仍然閃爍)我想你應該得到一些關於[類工廠模式]的知識(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函數內進行;有沒有必要在其它地方,真的。事實上,由於你的程序太小,我不會追求面向對象的方法來進行這個遊戲(除非我打算把它擴展到幾十個充分利用繼承,封裝和多態的面向對象概念的類)。