2012-10-26 42 views
1

我有我所能確定的一個簡單的問題,但我無法弄清楚。在下面的代碼中,我希望能夠在案例5之後重新顯示選項。我怎樣才能做到這一點?提前致謝!如何循環回到switch case語句的開頭

// Input the race of your character 
    cout << "Choose a race here: " << endl 
    << "1) Human, 2) Elf, 3) Dark Dwarf, 4) Commoner, 5) Race info, 6) Admin Debug Race : "; 

    cin >> mCharRace; 

    switch (mCharRace) 
     { 
     case 1: 
     cout << "You have chosen Human!" << endl; 
     mExpPoints = 999; 
     mArmor = mArmor + 2; 
     break; 
    case 2: 
     cout << "You have chosen Elf!" << endl; 
     mAccuracy = mAccuracy + 2; 
     mWeapon.mDamageRange.mLow = mWeapon.mDamageRange.mLow + 1; 
     break; 
    case 3: 
     cout << "You have chosen Dark Dwarf!" << endl; 
     mWeapon.mDamageRange.mHigh = mWeapon.mDamageRange.mHigh + 2; 
     mMaxHitPoints = mMaxHitPoints + 3; 
     break; 
    case 4: 
     cout << "You have chosen Commoner! Brave man." << endl; 
     mAccuracy  = mAccuracy - 3; 
     mHitPoints  = mHitPoints - 5; 
     mMaxHitPoints = 8; 
     mExpPoints  = -250; 
     mNextLevelExp = 1500; 
     mArmor   = -1; 
     break; 
    case 5: 
     cout << "Placeholder for explanation text." << endl; 
     break; 
    case 6: 
     cout << "ADMIN POWERS UNITE!!!!!!!" << endl; 
     mAccuracy  = 20; 
     mHitPoints  = 1000; 
     mMaxHitPoints = 1000; 
     mExpPoints  = 0; 
     mNextLevelExp = 1000; 
     mArmor   = 100; 
     mWeapon.mName = "Admin Sword of HNNNG!"; 
     mWeapon.mDamageRange.mLow = 100; 
     mWeapon.mDamageRange.mHigh = 150; 
     mGold   = 1000000; 
     break; 
+1

不是一個答案,「因爲我不希望得到敲定。總是有達夫的設備:http://en.wikipedia.org/wiki/Duff's_device。 –

回答

10

switch-case構造不是一個迭代構造。它只能選擇一個特定的情況並執行它。控制流程由於它而不能恢復。

所以,你不能用它來循環。 將其包裝在中,而用代替代替循環結構。

while(condition){ 
    switch (mCharRace){ 
    ... 
    ... 
    } 
} 

只要打開條件,當你想停止循環。

1

你的第一個COUT

label: 

cout << "Choose a race here: " << endl 
<< "1) Human, 2) Elf, 3) Dark Dwarf, 4) Commoner, 5) Race info, 6) Admin Debug Race : "; 

cin >> mCharRace; 
... 

然後容器5內前添加一個標籤,添加

goto label; 
+0

我可以問爲什麼這是downvoted?它的工作原理很簡單。這只是不好的技術? –

+1

你一定會喜歡彙編,cjamesm :-)在所有其他情況下,**請不要使用goto **(我沒有downvote) –

+1

'goto'應該在C++中避免。有它的用途,但這個不適合。 – Mat

6

裹輸入和開關的代碼在一個循環,並分配一個變量exitLoop退出循環。默認情況下,將該變量設置爲TRUE,除非您希望重複輸入。在那些中,將exitLoop設置爲false。

1

將它放在for(;;)循環中並使用continue代替break。換個breakswitch發言結束後趕上那確實想打破的情況:

for (;;) 
{ 
    switch (x) 
    { 
    case case_that_wants_to_loop: 
     // ... 
     continue; 
    case case_that_wants_to_break: 
     // ... 
     break; 
    } 
    break; 
}