2010-10-15 147 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