C++ D&D点购买点跟踪? 我通过编码一个D&D 5E字符创造者来教自己C++。我知道这将至少是一个三步的过程,其中我1学习语言,2实现数据验证,然后3学习并实现适当的约定
我试图只使用标准库。现在我正在研究能力积分购买系统。也许我已经筋疲力尽了,但我不确定如何正确跟踪积分支出 请看,在积分购买系统中,您可以在六个能力分数中分配27分。他们每人8点出发。每增加一个点,最多13个,然后每增加2个点,最多15个。超过15和低于8的数值是不允许的 我得到了要跟踪的点,并且识别了上下限。我只是想不出任何方法,更不用说简单而优雅的方法了,比如我更喜欢调整进入或离开14或15分的分数成本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
#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,使代码变得可行。我无法回答这个问题,因为它是闭合的,但请查看使用数组的和使用映射的。基本上,你想要的是一个每个关卡需要多少点数的数组。我想我知道你得到了什么,但我必须消化它,以充分理解切换和退出范围。这正是我一直在寻找的优雅解决方案!