簡體   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