繁体   English   中英

生成随机运动游戏结果C ++

[英]Generate random sport game result c++

我被要求编写一个程序,以生成涉及10个国家/地区的10个体育比赛的随机结果,并根据结果显示奖牌总数。

我能够生成游戏的结果,但不知道如何总结结果(即每个国家获得的不同奖牌的数量)。

以下是我生成随机游戏结果的代码的一部分。

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];
    }
}

我需要一些建议来解决这个问题。 谢谢。

您将需要遍历奖牌阵列并确定每个阵列中每个国家有多少个实例,因此如果您遍历金牌阵列。

如何执行此操作取决于您。

例如,如果您遍历GoldArray并找到3个国家“ B”的实例,那么它们就有3枚金牌。 您可以提供一个简单的解决方案,其中每个国家都有一个柜台。

int CountryAGoldM;

每次您击中数组中的国家“ A”时,都会将CountryAGoldM加1,我认为这是家庭作业。

将来,您将看到其他方法来更有效地重写它,但我认为您只是在学习,因此在这种情况下,简单的解决方案始终是最好的:P

您无需在每个rand()结果中添加time(0)。 而是使用srand(time(0))

您的方法可以使同一国家获得多个奖牌。

您可以使用std :: map来计数奖牌。 无需将任何中间结果存储在gctry,sctry和bctry中。

您可以为此使用std :: count(),同时遍历各个国家/地区(尽管我更喜欢使用stl容器):

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

我知道我不应该这样做,但是有时候您可以通过阅读代码来学习;)

#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;
    }
}

您有两个要解决的问题。 您没有提到其中一个:

问题1

您需要显示获得的奖牌总数。 这些金额将按国家/地区和奖牌类型分组,但不会按游戏分组。

您已经创建了国家列表和三个阵列,每种奖牌类型一个。 这些数组的索引是游戏,而这些数组的值是赢得相关奖牌的国家/地区。

解决方案1

解决此问题的一种方法是遍历两个嵌套循环。

对于每个国家/地区,在国家/地区循环中启动金牌,银牌和铜牌的计数器。

然后,对于每场比赛,检查他们是否是金牌,银牌或铜牌的获胜者,如果是,则将其加到相应的计数中。 完成所有游戏后,请打印出当前国家/地区赢得的每种类型的奖牌数。

然后继续下一个国家。

问题2

一个国家能否在一场比赛中赢得两枚不同的奖牌? 如果没有,您将如何解决?

解决方案2

由于您没有直接提出这个问题,所以我不会提出解决方案。 但是您可以考虑如何生成唯一的组合(例如概率数学类),然后选择一个随机组合。 您想做10选3。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM