代码在CvTechAI.cpp第197~203行- // If total weight is above 0, choose one above a threshold
- if(m_ResearchableTechs.GetTotalWeight() > 0)
- {
- int iNumChoices =GC.getGame().getHandicapInfo().GetTechNumOptions();
- rtnValue = (TechTypes) m_ResearchableTechs.ChooseFromTopChoices(iNumChoices, &fcn, "Choosing tech from Top Choices");
- LogResearchChoice(rtnValue);
- }
复制代码 和CvWeightVector.h第230~249行(即ChooseFromTopChoices()函数的代码)- // Get the total weight
- for (i = 0; i < iNumChoices; i++)
- {
- elem = m_pItems[i];
- TotalTopChoicesWeight += elem.m_iWeight;
- }
- // Random roll up to total weight
- iChoice = (*rndFcn)(iTotalTopChoicesWeight, szRollName);
- // Find out which element was chosen
- for (i = 0; i < iNumChoices; i++)
- {
- elem = m_pItems[i];
- Choice -= elem.m_iWeight;
- if (iChoice < 0)
- {
- return elem.m_Element;
- }
- }
复制代码 在执行这段代码之前,所有可以研究的科技都会被按权重从大到小的顺序排列。由于科技的选择取决于前一段代码中rtnValue的值,即ChooseFromTopChoices()的返回值,所以ChooseFromTopChoices()函数的执行将会影响最终AI的决策。后一段代码中第一个循环将所允许选择的科技(即权重排前iNumChoices个的科技)的权值相加,iChoice取得一个随机数,由第二个循环决策选择哪个科技。 |