我一直在試圖寫(作爲一個練習 - 學習一點關於序言)一個小代碼片段,打印所有可能的統計組合從筆和紙RPG 。序言:寫作RPG統計打印程序時的算術問題
相關的代碼片段:
%abilities
ability(X) :-
member(X, [str, dex, con, int, wis, cha]).
race(tiefling, planetouched, [[dex, 2], [int, 2], [cha, -2]], [infernalResistance,darkvision,skillAffinity(bluff),skillAffinity(hide)],rogue, 1, medium).
race(human, human, [], [quickToMaster, skilled], any, 0, medium).
racialAttributeBonus(Race, Stat, Bonus) :-
race(Race, _, BonusList, _, _, _, _),
member([Stat, Bonus], BonusList).
racialAttributeBonus(Race, Stat, 0) :-
race(Race, _, BonusList, _, _, _, _),
\+ member([Stat, _], BonusList).
%start ability points is 32
%first 6 points - 1 point per increase
%7, 8 - +2 per increase
%9, 10 - +3 per increase
statDiffCost(Diff, Cost) :-
Range = [Diff, Cost],
member(Range, [
[0, 0],
[1, 1],
[2, 2],
[3, 3],
[4, 4],
[5, 5],
[6, 6],
[7, 8],
[8, 10],
[9, 13],
[10, 16]
]).
raceAttribCost(Race, AttrName, AttrValue, Cost) :-
number(AttrValue),
racialAttributeBonus(Race, AttrName, Bonus),
AttrDiff is AttrValue - Bonus - 8,
statDiffCost(AttrDiff, Cost).
raceAttribCost(Race, AttrName, AttrValue, Cost) :-
number(Cost),
racialAttributeBonus(Race, AttrName, Bonus),
statDiffCost(AttrDiff, Cost),
AttrValue is AttrDiff + Bonus + 8.
raceAttributes(Race, Str, Dex, Con, Int, Wis, Cha) :-
StrCost + DexCost + ConCost + IntCost + WisCost + ChaCost is 32,
raceAttribCost(Race, str, Str, StrCost),
raceAttribCost(Race, dex, Dex, DexCost),
raceAttribCost(Race, con, Con, ConCost),
raceAttribCost(Race, int, Int, IntCost),
raceAttribCost(Race, wis, Wis, WisCost),
raceAttribCost(Race, cha, Cha, ChaCost).
不過,我碰到的幾個相關數字/算術的處理問題。
首先,我會期望
raceAttributes(human, Str, Dex, Con, Int, Wis, Cha).
將打印的參數組合。相反,我得到false
。
其次,我一直無法以優雅的方式處理raceAttribCost
和statDiffCost
中的數值參數。
基本上,我不得不創建raceAttribCost
的兩個版本,因爲根據我指定的參數,其中一個參數需要比較右側的「實例化」變量。
所以,我想知道如何
- 撥打電話到
raceAttributes
實際工作。 - 消除
raceAttribCost
的其中一個版本並僅保留其中一個 - (可選)用更緊湊的東西替換
statDiffCost
。
所有三個是相同的問題,這是混合象徵性的「計算」和數值算術的一部分。
建議嗎?
P.S.我在Windows 7上使用SWI-PL 64位。
iHaveOneAdditionalCommentRegardingYourNamingConvention:you_will_find_using_underscores_much_easier_to_read_for_longer_names! – mat
經過多年的C++開發,我不太可能轉向其他任何東西,對不起。習慣的問題。 – SigTerm
請參閱C++發明人的[命名約定](http://www.stroustrup.com/bs_faq2.html#Hungarian)。值得注意的是:「*我更喜歡用下劃線來區分標識符中的單詞(比如'element_count')而不是其他選項,比如'elementCount'和'ElementCount'。*」 – mat