2015-10-01 24 views
0

我已經在這裏工作了幾個小時。我正在C++中做一個小型遊戲,我想弄清楚如何從函數內部編輯變量。我可以將變量放在main()中並將它們編輯爲沒有問題,但我無法弄清楚我需要從函數編輯什麼。以下是功能。如何從C++的主腳本中修改函數中的變量

void HeroSelect(string& hero) 
{ 
    int gold = 20, health = 5, attack = 5, stats[2] = { health, attack }; 
    string weapon; 
    cout << "Please choose your hero.\n"; 
    cin >> hero; 
    if (hero == "Warrior" || hero == "warrior") 
    { 
     weapon = "Broad Sword"; 
     cout << "You are a Warrior wielding a " << weapon << endl; 
     cout << "Good choice.\n" 
      << "You start out with " << gold << " gold." << endl 
      << "You have " << stats[0]<< " health and " << stats[1] << " attack.\n"; 
    } 

以上是函數的定義,我希望能夠當玩家受到攻擊編輯的健康,或者說得到更強的武器。以下是腳本的main()。

void main() 
{ 
    double enter, room1, room2, room3, room4, BossRoom; 
    int, gold = 20; //This is used as part of check inventory and will be subtracted when necessary 
    string hero, weapon; 


    //Set decimal two places 
    cout.setf(ios::fixed); 
    cout.setf(ios::showpoint); 
    cout.precision(2); 

    Intro(enter); 

    cout << "The first step in this adventure is to choose your hero. You can choose a warrior, a wizard, or an archer.\n"; 

    HeroSelect(hero); 

那麼,假設他獲得了一個新的武器,它給了+1攻擊我該如何反映這個函數?我會爲此創建一個單獨的功能嗎?

當玩家經歷遊戲時,他們可以隨時鍵入「統計數據」,當他們想要顯示他們當前的健康和攻擊,然後基本上只是循環回到房間的開始或打架都在。

我知道我可以對變量進行更改,如果我在main()中創建了所有的循環和所有if-else語句,但我想試試這個並保持主腳本清潔。我做了一個數組的統計數據,因爲我認爲將數組作爲列表打印是很好的。任何幫助都會很棒。謝謝!

+3

我認爲你需要重新開始你的設計。讓我們考慮一下這個設計吧,你有一個「英雄」,聽起來像是一個物體。你有一個「武器」,另一個對象。 「英雄」應該怎麼知道他或她有什麼「武器」?也許這個「英雄」可能有某種包含「武器」的集合? 「英雄」還有什麼?也許像「健康」或「力量」這樣的屬性?這怎麼可能被納入「英雄」的對象? –

+0

爲了讓變量在你的函數中可見,最簡單的方法是將它們移出'main'並使它們成爲[全局變量](http://stackoverflow.com/questions/9702053/how-to-declare-a -global可變式-C)。這樣可以更好地匹配您當前使用的編程風格,但全局變量和缺少存儲數據的結構都被認爲是[反模式](https://en.wikipedia.org/wiki/Anti-pattern)標籤:C++]。嘗試瞭解一下[class design](http://www.cprogramming.com/tutorial/class_design.html),然後再回到遊戲中。 – MooseBoys

+0

感謝您的意見,如同其他人提到的那樣,我會更深入地查看課程並重寫它。仍在學習! – Matt

回答

4

您可能需要重新編寫C++和OOP。你的概念並不差,但你可以做得更好。 (如果你真的想以某種特定的方式做某件事,並且你能夠以這種方式做到這一點,那麼一定要這樣做:P)。

正如您的評論所述,可能需要重新設計遊戲設計。你會想要建立一個英雄類,有多個變量或子類作爲屬性(例如:力量,健康點,武器類,護甲類等等)(我們可以進入更低級別的描述,但是我不會如果你打算擁有多種武器,武器類也是一個好主意,例如你可以定義武器屬性:攻擊傷害,攻擊速度,武器耐久度等等......

在這些類中,你可以創建「助手函數」,然後你可以使用它來改變關聯對象的屬性。助手函數可以是公共函數,它允許你增加/減少英雄的健康狀況或者可能會增加的助手函數攻擊傷害?

看起來好像你正在做一個好j ob學習,所以希望你可以在這裏想象這個想法。無論哪種方式,請繼續研磨,隨時隨時要求更深入的答案!當您準備好進行一些測試時,我很樂意看到您的遊戲!

+0

我對你在說什麼有了一個想法,我覺得這就是我正在做的事情。顯然不是!我很欣賞這些建議,並會更詳細地閱讀您列出的內容。我很榮幸能在完成時向您展示它!謝謝 – Matt

2

有幾種方法可以解決這個問題。 首先是創建一個在評論和ejsd1989答案中涵蓋的類。

第二個選項是通過在main中創建這些變量來使這些變量成爲全局變量,並通過引用將它們傳遞給每個函數。這可以讓你的主幹像你想要的那樣乾淨。

例如:

void HeroSelect(string& hero, int &gold, int &health) 

第三個選項是非常類似於第二,它是這些變量存儲在數組中,只是修改與每個功能的陣列。

本質上,它歸結爲創建一個類或將變量傳遞給您希望使用的函數。

+0

修改數組是個好主意。讓數組顯示所有的統計數據,然後在函數中提供數組更改是很好的。我也可以嘗試。 – Matt

0

主不是一個腳本,並且有問題的設計有一些概念問題。逐字回答將是:通過參考傳遞函數參數。但這對於這項任務來說不是一個好的解決方案。 請考慮下面這個例子:

uint menu; 
Hero * hero; 
Room entrance, next[5]; 

entrance.Enter(); 

std::cout << "1st step in this adventure is to choose your hero." <<std::endl; 
std::cout << "You can choose " <<std::endl; 
std::cout << "(1)  a warrior " << std::endl; 
std::cout << "(2) ,  a wizard" << std::endl; 
std::cout << "(3) , or an archer." << std::endl; 
std::cout << "Please choose your hero." << std::endl; 
std::cin >> menu; 
switch(menu) 
{ 
    case 3 : { hero = new Archer; break; } 
    case 2 : { hero = new Wizard; break; } 
    default : { hero = new Warrior; break; } 
} 
hero->Weapon(); 
hero->Gold(); 
hero->Health(); 
hero->Attack(); 

std::cout << "Which room to enter? 1..5" << std::endl; 
std::cin >> menu; 

next[menu - 1].Enter(); 
if(5 == menu) 
{ 
    std::cout << "You are attacked by a troll!" << std::endl; 
    hero->SetHealth(hero->GetHealth() >> 1); 
} 
hero->Health(); 

您可以處理的英雄類型的,機房情況下這種方式。查找可能被泛化的屬性,並通過成員或繼承來區分。仔細設計它,你可以最小化e。 G。噸couts和重複的代碼分支。

class Room 
{ 
    static uint cntr; 
    std::string name; 
public: 
    Room() : name ("Room#") { if(cntr < 5) { name[ name.size() - 1 ] = cntr + '0'; } else { name = "BossRoom"; } ++cntr; } 
    void Enter() { std::cout << "You have entered " << name << "!" << std::endl; } 
}; 

uint Room::cntr; 

struct Limint 
{ 
    uint max; 
    uint curr; 
    Limint(uint init) : max (init), curr(init) {} 
}; 

class Hero 
{ 
protected: 
    std::string  type; 
    uint   gold; 
    Limint   hp; 
    Limint   attack; 
    std::string  weapon; 
public: 
    Hero() : type("Hero"), gold(20), hp(50), attack(5), weapon("Kitchen knife") {} 
    uint GetHealth() { return hp.curr; } 
    void SetHealth(uint health) { health = std::min(health, hp.max); hp.curr = health; } 
    void Weapon() { std::cout << "You are a " << type << " wielding a " << weapon << ". Good choice!" << std::endl; } 
    void Gold() { std::cout << "You start out with " << gold << " gold." << std::endl; } 
    void Health() { std::cout << "You have " << hp.curr << "/" << hp.max << " health." << std::endl; } 
    void Attack() { std::cout << "You have " << attack.curr << "/" << attack.max << " attack." << std::endl; } 
}; 

class Warrior : public Hero 
{ 
public: 
    Warrior() { type = "Warrior"; weapon = "Broad sword"; } 
}; 

class Wizard : public Hero 
{ 
public: 
    Wizard() { type = "Wizard"; weapon = "Magic stick"; } 
}; 

class Archer : public Hero 
{ 
public: 
    Archer() { type = "Archer"; weapon = "Crossbow"; } 
}; 

玩得開心!

相關問題