2010-10-15 148 views
0

我被要求編寫一個程序,該程序可生成10個運動遊戲的隨機結果,其中涉及10個國家,並根據結果顯示獎牌計數。生成隨機運動遊戲結果C++

我能夠產生遊戲的結果,但不知道如何總結結果(即每個國家獲得的不同獎牌的數量)。

下面是我的隨機遊戲結果生成代碼的一部分。

const string ctry[] = {'A','B','C','D','E','F','G','H','I','J'}; //country name 

int main() 
{ 
    string gctry[10]; //gold 
    string sctry[10]; //silver 
    string bctry[10]; //bronze 

    for (int i = 0; i < 10; i++) 
    { 
     gctry[i] = country[(rand() + time(0))%10]; 
     sctry[i] = country[(rand() + time(0))%10]; 
     bctry[i] = country[(rand() + time(0))%10]; 
    } 
} 

我需要一些建議來解決這個問題。謝謝。

+5

我建議你做完全拼寫的習慣取出你的變量名稱(例如國家而不是ctry)。它使代碼更具可讀性,並且不需要任何成本。 – 2010-10-15 10:31:38

+0

需要'家庭作業'標籤嗎? – 2010-10-15 10:48:48

+0

@保羅R:添加它。有人可以刪除它,如果它證明不是功課。 – 2010-10-15 11:09:12

回答

1

您將需要通過獎牌數組並確定每個陣列中每個國家有多少個實例,因此如果您循環訪問金牌陣列。

你如何做到這一點取決於你。

示例如果您通過GoldArray循環並找到3個國家「B」的實例,那麼他們有3枚金牌。你可以提供一個簡單的解決方案,你有一個每個國家的櫃檯。

int CountryAGoldM; 

的每次陣列中打了一個國家「A」時,您可以通過1遞增CountryAGoldM,我想這是功課。

在將來你會看到其他的方式來改寫這個更efficiant但我以爲你只是學習這麼一個簡單的解決方案始終是最好在這種情況下:P

1

你並不需要添加時間( 0)到每個rand()結果。請使用srand(time(0))

您的方法允許同一個國家獲得多個獎牌。

您可以使用std :: map來計算獎牌。不需要在gctry,sctry和bctry中存儲任何中間結果。

1

您可以使用std ::這個數(),而循環在國家(雖然我更喜歡STL容器本):

std::cout << country << ": gold " << std::count(gctry, gctry+10, country); 
0

你有兩個問題要解決這裏。其中一人的你沒有提到:

問題1

你需要顯示獎牌數的總和贏了。這些款項將按國家和獎牌類型分組,但不會按遊戲分組。

您已經創建了一個國家和三個陣列的列表,每個獎牌類型一個。這些陣列的指數就是遊戲,這些陣列的價值就是贏得該獎章的國家。

解決方案1 ​​

一個解決這個辦法是要經過兩個嵌套循環。

對於每個國家,啓動黃金,白銀和銅牌計數器(在國家圈內)。

然後,對於每場比賽,檢查他們是否是金牌,銀牌或銅牌的獲勝者,如果是,則爲相應的計數添加一個。一旦你完成了所有的比賽,打印出當前國家贏得的每種類型的獎牌數量。

然後繼續下一個國家。

問題2

一個國家能否贏得一場比賽兩個不同的獎牌?如果不是,你會如何解決這個問題?

解決方案2

既然你沒有直接問這個問題,我不會把一個解決方案呢。但你可以看看你將如何產生一個獨特的組合(ala你的概率數學課),並且隨機選擇一個組合。你想要做的10挑3

1

我知道我不應該這樣做,但有時你可以通過閱讀代碼學習;)

#include <iostream> 
#include <string> 
#include <algorithm> 
#include <map> 
using namespace std; 

int main() 
{ 
    const int nCountries = 7; 
    string countries[nCountries] = { "C1", "C2", "C3", "C4", "C5", "C6", "C7" }; 
    map<string, int> goldMedals, silverMedals, bronzeMedals; 

    const int nTrials = 10; 

    for (int i = 0; i < nTrials; ++i) 
    { 
     // generate random results for current trial 
     random_shuffle(countries, countries + nCountries); 
     ++goldMedals [countries[0]]; 
     ++silverMedals[countries[1]]; 
     ++bronzeMedals[countries[2]]; 

     //copy(countries, countries + nCountries, ostream_iterator<string>(cout, "\n")); 
     //cout << "====================" << endl; 
    } 

    // sort by medals 
    const int medalMultiplier = nTrials + 1; 
    auto medalValue = [&](const string& c) 
    { 
     return goldMedals[c] * medalMultiplier * 2 + silverMedals[c] * medalMultiplier + bronzeMedals[c]; 
    }; 

    sort(countries, countries + nCountries, [&](const string& c1, const string& c2) { return medalValue(c1) > medalValue(c2); }); 

    // output 
    cout << "Results: \n"; 
    for (auto c = countries; c != countries + nCountries; ++c) 
    { 
     cout << *c << " g" << goldMedals[*c] << " s" << silverMedals[*c] << " b" << bronzeMedals[*c] << endl; 
    } 
} 
+0

現在不是'auto'預發行功能嗎? – 2010-10-15 11:07:08

+0

不僅'自動',是的。希望它畢業後能夠發佈;) – Grozz 2010-10-15 11:11:55