【发布时间】:2019-11-13 05:57:16
【问题描述】:
我有一个棋盘游戏引擎的评估函数,它使用一组变量以类似于以下方式计算分数:
eval_params.h
const int bonusA=somevaluea;
const int bonusB=somevlaueb;
const MyEnumType bonusM[]={/*......*/};
和
eval.h
int eval(player p)
{
int score=0;
/*.....*/
if(p.featureA) score+=bonusA;
if(p.featureB) score+=bonusA;
if(p.featureM) score+=bonusM[p.featureM.type];
/*......*/
return score;
}
以及需要能够修改评估参数并在调整期间使用新值校准评估函数的调整器,不幸的是,由于多种原因,我不能将参数手动分组到单个数组或向量中“一个其中是可读性,它们有数百个,并且在不调整时需要将它们分开”,是否有可能使用宏、模板或任何其他语言功能以某种方式实现这一点(即使它是 c++2y 的一部分)无需删除原始代码? 例如像
eval_params.h
int bonusA=somevaluea;
int bonusB=somevlaueb;
MyEnumType bonusM[]={/*......*/};
TUNE(bonusA,bonusB,MyEnumType);
会导致将 RHS 添加到全局向量中并将变量转换为指向此类向量或任何类似数据的引用吗?
*我发现的最接近的是来自名为 stockfish 的国际象棋引擎的代码: tune.h ucioption 但我不知道它是如何工作的。
【问题讨论】:
-
未调整数据时如何组织数据?这么灵活吗?最终,因为数据在不同的地方,所以在调用
eval -
@parktomatomi,需要调整的大部分数据都包含在一个头文件“eval_params.h”中,其中在评估函数中声明了一些变量,我需要一个不需要的解决方案修改评估函数本身。
-
感谢您的澄清。我要问的是,
p.feature<X>的值的来源在哪里?例如,是否有一堆不同的结构具有feature成员? player 中的feature成员每个都是指向对象的指针吗? -
@parktomatomi 我不认为来源很重要,但无论如何这只是一个例子,在实际代码中,这些功能是在评估期间计算的游戏状态的复杂属性,所以我将它们替换为给定示例中的简化语句。
-
感谢您对我的耐心@arthur。您的整个游戏状态是否都在
player结构中?是否有只修改部分数据的操作?
标签: c++ templates macros metaprogramming