如何在每个数组中使用相同的骰子对骰子进行排序并创建新数组,Yahtzee,C ++

时间:2016-02-28 17:58:04

标签: c++ arrays c++11

我正在用C ++制作一个Yahtzee游戏,我的目标是在那里建立一个智能游戏场,游戏将向用户提供他或她可以放置结果的示例。为了做到这一点,我必须将骰子从低到高排序,然后制作新的数组,这些骰子的一个数组彼此相等,每个数组的大小必须与其中的骰子数一样大。

这是我的基础课:

投掷每个骰子的功能。

void InGame::setDice(int dice){
    if (this->diceCapacity <= this->nrOfDices){
        this->expandDice();
    }
    for (int i = 0; i < nrOfDices; i++){
        die[i]->roll(6);
    }
}

setDice工作正常。在此之后,我在一个名为scoreCalculator的子类中对所有5个骰子进行排序。

排序功能:

void ScoreCalculator::sortDie(int arr[], int nrOfDieces){
    int temp = -1;
    int minIndex = 0;
    for (int i = 0; i < nrOfDieces - 1; i++){
        minIndex = i;
        for (int k = (i + 1); k < nrOfDieces; k++){
            if (arr[k] < arr[minIndex]){
                minIndex = k;
            }
        }
        temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
    }
}

现在我要将每个相同的骰子填充到不同的数组中,这些数组只保存那些彼此相等的骰子。

这是我到目前为止所做的事情

void ScoreCalculator::equalDie(int dice[]){
    dice[5];
    this->sortDie(dice, 5);
    int count = 0;
    int equal[5];
    for (int i = 0; i < 5; i++){
        for (int x = 1; x < 6; x++){
            if (dice[i] == dice[x]){
                for (int y = 0; y < 5; y++){
                    equal[y] = dice[i];
                    equal[y + 1] = dice[x];
                    y++;
                }
            }
        }
    }
}

这最后的功能根本不起作用

1 个答案:

答案 0 :(得分:0)

为了说明没有c样式数组的事情,我已经创建了一个包含一卷骰子的结果的Roll类。该类可以使用vector来存储骰子的值。然后std::sort可用于对骰子进行排序,vector::operator==可用于比较滚动的相等性。方法counts可以以索引i是值为i+1的die的数量的格式返回卷。 Roll可能如下所示:

class Roll
{
public:

    Roll()
        : die_( 6 )
    {
        roll();
    }

    void roll()
    {
        std::generate_n( die_.begin(), 6, [&] { return dist_( rng_ ); } );

        std::sort( die_.begin(), die_.end() );
    }

    friend bool operator==( Roll const& lhs, Roll const& rhs )
    {
        return lhs.die_ == rhs.die_;
    }

    friend bool operator!=( Roll const& lhs, Roll const& rhs )
    {
        return !(lhs == rhs);
    }

    std::vector<int> counts() const
    {
        std::vector<int> counts(6, 0);

        for( char dice : die_ )
            counts[dice-1]++;

        return counts;
    }

private:

    static std::mt19937 rng_;
    static std::uniform_int_distribution<int> dist_;

    std::vector<char> die_;
};

两个骰子的简单滚动,检查相等并输出六个可能值中的每一个的模具数量如下所示:

Roll r1;
Roll r2;
bool equal = r1 == r2;

std::cout << equal << std::endl;

auto c1 = r1.counts();
auto c2 = r2.counts();

for( int i = 0; i < 6; ++i  )
{
    std::cout << i + 1 << " : " << c1[i] << " " << c2[i] << std::endl;
}

<强> Live on Coliru