卧龙先生
发表于 2010-11-19 23:45:27
检查代码必须做这个判断,要知道是否可以用这些数字代替 引号内的字符
一个规则最多容纳多少个 事实 或 动作,以及 or and not 范围内的多个 事实 是否当作一个来计算?现在弄清楚,可以早日开工
[ 本帖最后由 卧龙先生 于 2010-11-19 23:48 编辑 ]
老胡V1
发表于 2010-11-20 00:02:32
不会 这些使用比的语句
卧龙先生
发表于 2010-11-20 00:19:32
我的帝国删除了,所以这些要拜托你。勉为其难吧!
老胡V1
发表于 2010-11-20 08:36:02
哦,我一开始误解了,我是说自动补全的数字没用。而数字固然可以代替字符串。如果直接写在两引号之间不会有问题,就直接说出数字。或者使用另外的专门用来发字符串号码的语句,就没用引号,而且是送出在language.dll里面的对话。
总而言之,有上面提到的CHAT和LOAD什么的就有双引号,内容是什么都不会违法
老胡V1
发表于 2010-11-20 08:38:12
送出字符串号码的有专门语句,额,据教程说必须是有用的字符串号码,但另外一方面如果写别的似乎不会报错。(这说的报错是游戏开始时弹框)
卧龙先生
发表于 2010-11-20 08:49:54
老胡: 刚发现,chat-to-all 用于发送自定字符,至于内置的常量字符串用的是另一个命令 chat-to-player-using-id
787918944: 很感谢!现在可以开始了。不过 or and not 尚未明确之前,不做判断!
我的 qq: 117289747 谁愿意加我!:)
[ 本帖最后由 卧龙先生 于 2010-11-20 08:50 编辑 ]
卧龙先生
发表于 2010-11-20 10:58:26
把你所知道的告诉我吧:
#load-if-defined 判断语句会出现在 规则 里吗?就像这样:
(defrule
#load-if-not-defined PERSIAN-CIV
(goal unit-goal knight)
#end-if
(goal control-goal 0)
(unit-type-count villager > 90)
(or
(strategic-number sn-current-age >= ci-transit)
(and
(food-amount > 400)
(gold-amount < 200)
)
)
=>
(set-goal control-goal militiaman-line)
(disable-self)
)
这种结构的 if 语句正常吗:
#load-if
#load-if
#else
#else
#if-end
#if-end
[ 本帖最后由 卧龙先生 于 2010-11-20 11:36 编辑 ]
老胡V1
发表于 2010-11-20 16:51:48
第一个,不能…只能LOAD包含DEFRULE。
第二,不正常,应该是LOAD.LOAD.ELSE.ENDIF.ELSE.ENDIF(如果你指的是一个条件性读取包含另一个)
老胡V1
发表于 2010-11-20 17:28:20
那个,我问过了,简单地说,一个规则内,最多能有16个开括号,不包括defrule那一个。别的不用理,解释起来麻烦。另外至少一个事实和动作
卧龙先生
发表于 2010-11-20 21:05:55
很不错!不过下面还有...
(or
()
()
)
上面的当作几个? 一个?两个?三个?
那么就是说,一个规则内 动作 和 事实 相加不能超越 16 个?不仅仅是 动作?
[ 本帖最后由 卧龙先生 于 2010-11-20 21:11 编辑 ]
老胡V1
发表于 2010-11-20 21:40:43
说了,不理会动作还是事实也不管逻辑判断 只要数左括号
(defrule
(or
()
()
)
)
就是是3个
[ 本帖最后由 老胡V1 于 2010-11-20 21:42 编辑 ]
卧龙先生
发表于 2010-11-21 00:10:32
你不能理解严谨的态度在开发方面的重要性!
老胡V1
发表于 2010-11-21 08:52:32
额 详细一点的描述是 “一个规则最多可以有16个成分,事实、动作、逻辑判断符等都视作成分”
我觉得对于你编写程序来说直接数左括号更简单罢了
卧龙先生
发表于 2010-11-21 09:05:22
描述的好!
语法检查是个严谨的过程,要考虑的问题很多,比如 (chat-to-all "1234 (56) 789") . 这句正确的语句,单纯搜索符号 ) 来做判断,那就错的离谱了.所以,尽管现在不判断语句的参数正确性,但包含字符串参数的语句还是要优先处理的.这就是我问题那么多的原因.
考虑过这种格式正确的语句吗:
(
chat-to-all
"123" )
从编译角度来讲是正确的,帝国应该也要并且会支持这种方式.
这不是个小工作,目前虽然写了 500 多行,不过距离成功还有很长的路.
[ 本帖最后由 卧龙先生 于 2010-11-21 09:20 编辑 ]
老胡V1
发表于 2010-11-21 09:36:05
哦 也对我疏忽了 感谢提醒
卧龙先生
发表于 2010-11-21 11:08:09
加了不发信息,找不到人{38}
卧龙先生
发表于 2010-11-23 13:56:11
0.99i 发布!
写了一千多行代码.脚本检查测试版最终搞定.
下面的 delphi 常量是这次工作的脚印,也让大家见识下本人的 chinesenglish:
const
_diUnknowNumber = '未知用途的数字:';
_diUnknowName = '未知用途的单词:';
_diUnknowText = '不可识别的内容:';
_diUnknowEmblem = '未知用途的符号:';
_diUnknowElse = '#else 前方缺乏 #load-if* 语句';
_diUnknowEnd = '#end 前方缺乏 #load-if* 语句';
_diNoFoundCharofEnd = '找不到期望的结束符: ")"';
_diNoString = '找不到期望的字符串描述';
_diLoadRandomPercentError = 'load-random 要求的百分比参数计数不正确.';
_diLoadRandomItemCountError = 'load-random 项目数量少于两条,或者你应该调整"剩余百分比项目"作为最后一个项目.';
_diDefconstValueError = '无效的常量值描述';
_diRuleCountTooLong = '规则描述太长.提示:一个规则里最多容纳 16 个配对的括号,运算符 "OR AND NOT" 同样在计算范围内.';
_diNoFoundFacts = '至少拥有一个"事实"';
_diNoFoundActives = '至少拥有一个"动作"';
_diRepeatBlock = '重复的分割符"=>"';
_diOrAndNotError = '空白的逻辑运算符.';
_diOddCharOfEnd = '多余的结束括号 ")"';
_diNoSYM1 = '并非有效的系统定义符';
_diPosError = '颠倒的"动作/事实"位置';
_diRuleError = '存在错误的规则';
_diAIfNeedEnd = '缺乏 #end-if 的判断语句';
[ 本帖最后由 卧龙先生 于 2010-11-23 13:58 编辑 ]
老胡V1
发表于 2010-11-23 22:58:00
恭喜哈!回去用几个错误样本测试下,争取不断完善,因为短时间内是无法全部列出来的…卧龙先生的编程水平果然强大…我还在为今年NOIP纠结呢,希望是省二等吧…反正省三等一定有
老胡V1
发表于 2010-11-23 23:06:14
如果能知道帝国AI编译器的运作方式就好了…就这样吧,先用一会,大家发现有错误没查出可以专门在这反映。最后对卧龙先生致以衷心感谢,以及对之前自己不了解的鲁莽表示歉意。
卧龙先生
发表于 2010-11-24 00:35:49
多谢支持!如此和谐,有啥过意不去的! :)
找到错误时,编辑器输入焦点将转移到出错所在位置.用方向键可以快速找到.错误提示显示于右下边的小编辑器.
也许应该在出错的时候,将错误所在行用红色背景凸显一下.改天再看看!
该功能用 F5 调用,多用快捷键是个好习惯!
补充: 再次更新了一点点,版本依旧为 0.99i,如有需要,请重下一份 : "当错误被找到的时候,错误所在行将被置于编辑器正中央"
更新到此,大概告一段落.
[ 本帖最后由 卧龙先生 于 2010-11-24 10:35 编辑 ]