C++ D&D点购买点跟踪? 我通过编码一个D&D 5E字符创造者来教自己C++。我知道这将至少是一个三步的过程,其中我1学习语言,2实现数据验证,然后3学习并实现适当的约定

C++ D&D点购买点跟踪? 我通过编码一个D&D 5E字符创造者来教自己C++。我知道这将至少是一个三步的过程,其中我1学习语言,2实现数据验证,然后3学习并实现适当的约定,c++,C++,我试图只使用标准库。现在我正在研究能力积分购买系统。也许我已经筋疲力尽了,但我不确定如何正确跟踪积分支出 请看,在积分购买系统中,您可以在六个能力分数中分配27分。他们每人8点出发。每增加一个点,最多13个,然后每增加2个点,最多15个。超过15和低于8的数值是不允许的 我得到了要跟踪的点,并且识别了上下限。我只是想不出任何方法,更不用说简单而优雅的方法了,比如我更喜欢调整进入或离开14或15分的分数成本 #include <iostream> #include <string

我试图只使用标准库。现在我正在研究能力积分购买系统。也许我已经筋疲力尽了,但我不确定如何正确跟踪积分支出

请看,在积分购买系统中,您可以在六个能力分数中分配27分。他们每人8点出发。每增加一个点,最多13个,然后每增加2个点,最多15个。超过15和低于8的数值是不允许的

我得到了要跟踪的点,并且识别了上下限。我只是想不出任何方法,更不用说简单而优雅的方法了,比如我更喜欢调整进入或离开14或15分的分数成本

#include <iostream>
#include <string>

using namespace std;

int main()
{
    const string abilities[6] = { "STR", "DEX", "CON", "INT", "WIS", "DEX" };

    bool editing = 1;

    int stats[6] = { 8, 8, 8, 8, 8, 8 };
    int points = 27;

    while (editing == 1)
    {
        int select = 0;
        int adjust = 0;
        int result = 0;
        int remainder = 0;

        cout << "You have " << points << " points to spend on your ability scores." << endl;
        cout << "Select a number to adjust that ability's score:\n1) STR = " << stats[0] << "\n2) DEX = " << stats[1] << "\n3) CON = " << stats[2] << "\n4) INT = " << stats[3] << "\n5) WIS = " << stats[4] << "\n6) CHA = " << stats[5] << endl;
        cout << "Select a number outside the above range to finalize your ability scores.\n";
        cin >> select;

        while (cin.fail())
        {
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            cout << "Invalid entry; try again: ";
            cin >> select;
        }

        select -= 1;

        if (select < 0 || select > 5)
        {
            editing = 0;
            break;
        }

        cout << "Adjust " << stats[select] << " " << abilities[select] << " by how much? ";
        cin >> adjust;

        result = (stats[select] + adjust);

        if (result < 8)
        {
            cout << "Ability scores cannot be lower than 8 in the point buy system.\n";
        }
        else if (result > 15)
        {
            cout << "Ability scores cannot be higher than 15 in the point buy system.\n";
        }
        else
        {
            remainder = stats[select] - result;
            points += remainder;
            if (points < 1)
            {
                cout << "You do not have the points for that operation.";
                break;
            }
            else if (points > 27)
            {
                cout << "You cannot accrue more than 27 points.";
                break;
            }
            stats[select] = result;
        }
    }
}
有人有什么建议或例子我可以撕碎吗

编辑:

…替换上面代码中从第四行到最后一行,为我的查询制定一个乏味而不雅观的解决方案:

            if (stats[select] == 15 && result == 14)
            {
                points += remainder + 1;
            }
            else if (stats[select] == 15 && result < 14)
            {
                points += remainder + 2;
            }
            else if (stats[select] == 14 && result < 14)
            {
                points += remainder + 1;
            }
            else if (result == 15 && stats[select] == 14)
            {
                points += remainder - 1;
            }
            else if (result == 15 && stats[select] < 14)
            {
                points += remainder - 2;
            }
            else if (result == 14 && stats[select] < 14)
            {
                points += remainder - 1;
            }
            else
            {
                points += remainder;
            }
            stats[select] = result;

这仍然不是完美的;条件的额外点数独立于检查是否有足够的点数来执行操作。

与其对调整进行算术运算,为什么不直接查找stat to points cost

// outside main()
int stat_cost(int stat) {
    switch (stat){
        case 8: return 0;
        case 9: return 1;
        case 10: return 2;
        case 11: return 3;
        case 12: return 4;
        case 13: return 5;
        case 14: return 7;
        case 15: return 9;
        default: throw std::out_of_range("stat must be between 8 and 15 (inclusive)");
    }
}

// after checking result is in range
int points_result = points - stat_cost(result) + stat_cost(stats[select]);
if (points_result < 0)
{
    std::cout << "You do not have the points for that operation.";
    break;
}
else if (points_result > 27) // N.b. This condition can never be true
{
    std::cout << "You cannot accrue more than 27 points.";
    break;
}
points = points_result;
stats[select] = result;

欢迎就如何改进现有的任何其他代码提出任何建议。请记住,我昨天开始编写代码,所以我理解您的建议的能力可能有限。请尝试更简单的方法。尝试在没有用户输入的情况下编写一个程序,使用一个函数获取分数和点数,并将分数增加1,如果分数足够,则相应地减少分数。main可以使用不同的参数调用它几次,并打印结果。在你尝试任何更复杂的事情之前,让它完美地工作。@Beta,你的建议让我学习了随机数生成,但它没有回答我的问题。我没有找到我想要的解决方案,但是,我通过输入一系列if-else语句,从原始值和/或结果为14或15的事件中的点总数中加/减1/2,使代码变得可行。我无法回答这个问题,因为它是闭合的,但请查看使用数组的和使用映射的。基本上,你想要的是一个每个关卡需要多少点数的数组。我想我知道你得到了什么,但我必须消化它,以充分理解切换和退出范围。这正是我一直在寻找的优雅解决方案!