|
某幻来凑个热闹~
话说三个题目某幻都有做~其实也不是某幻苦力~主要是自己的地图里三个系统都有涉及的说~而且都不是什么高深的算法~
先放出两个测试版~随机迷宫由于要改的东西太多~过两天再放出来~
(用红字表示新加的内容)
话说小学期的课灰常给力,10号前看来没时间动we了……于是把之前做得差不多的两个系统重发一下。两个系统后来都改进了些内容,只是搁置了好久可能有些新增的功能想不起来了……大家自己看代码找找看吧~
—————————————————————朴素的分割线—————————————————————
键盘控制系统
关于键盘控制,这个任意键释放实在是一点头绪也没有。。另外自定义键(方向esc之外的)超过12个也不知道怎么弄。。其它的还比较好说。。
功能简介:
支持方向键按下释放,支持最多12个字母键(会在注册连续技的时候自动添加按键),支持用通俗的字符串表达连续技指令,支持方向键持续按下的判定(见“凶鸣百斩剑”的演示),支持同时按下两个键(复合键)的检测。复合键功能可以开关。不过开着的时候字母键连续按非常容易误判成同时按下,测试发现明明是分别按的键居然时刻相同,之间timer都没有走!这个目前也束手无策。。
新改进了手感,并增加了“自动复合检测模式”,当所有连招中复合键都只出现在最后一个键时,开启此模式可以兼容复合键和连续字母键。现在所有招都应该非常好搓。
原理简述:
指令存储采用了树的结构,哈希表里面主索引是“结点”的伪句柄(自己累加生成的),副索引是结点的成员,也就是根据按键指向不同“子结点”的句柄,另外还存有该结点对应的连续技触发。根节点句柄为0,没有触发。每次从根出发,根据按键序列,沿着树走到对应结点,一路上检测是否存在触发,最后执行最后一个触发,也就是指令序列最长的触发。大概就是这样~~这样的好处是效率比较高,每按一个键只需要检测不超过注册的最长的指令长度(也就是树的高度)就可以确认触发~
已按键序列存储在一个循环队列里~用数组实现非常高效且节省空间(只需要(人数*树的高度)那么多空间)~有点不同的是~为了避免冲突~这里记录的是头指针和队列长度~而不是头指针和尾指针~
各种延时超时等都可以在全局变量里调。详细用法等出正式版再写。。<--懒虫一只
演示图的连招只有三个(勉强凑够6个按键。。),具体见注释,按下的按键和发动的技能都会显示。
contest_keys.w3x
(31 KB, 下载次数: 133)
—————————————————————朴素的分割线—————————————————————
物品合成分解合并捡取系统
关于物品合成,这个疯大真是坑人。。都做完了突然要求要支持多合多。。所以那个功能是后加的,也许在整个系统里不很协调。。
功能简介:
支持同类物品合并,支持多阶合成,支持不同配方合成同一物品,支持分解(且支持和合成独立的分解),支持多合多,支持在合成或分解时执行自定义触发,支持按数量合成(例如两种药水合成新药水,有多少瓶就合成多少瓶,两种药水数目不相等则会有剩余)。
现在拆分后的物品不会再合到一起,除非丢下一件再捡起,或捡起的新物品和其中某种物品相同(此时会和新物品合成)。现在按数量分解可以选择一次分解一个还是分解全部。修复了一个bug,现在新物品既可合成又可合并时(出现这种情况是因为刚刚分解过)也能正常合成。改进了效率,不再有多余的单位丢弃/获得物品事件被触发。
原理简述:
存储以“配方”为单位,以物品id为索引,由于结果物品在检索时还不知道,所以作为索引的物品是配方中id最小的物品。原来只考虑了多合一,所以每个配方都没有变数,只有最多7个材料加1个结果,又有一个物品作为索引了,所以要存的只有7个物品id(加上一些和整数不冲突的参数),这就是一个配方的全部数据。所有“配方中id最小的物品”相同的配方存在以该物品id为主索引的同一个子表内,副索引是该配方注册的编号(始于0增量1)乘以7,再加上1~7作为7个物品id各自的索引(注意是1~7而不是0~6)。另外在子表内还存有已存配方数量(副索引0)。配方物品在存储时已经从小到大排序。
检索合成的时候,先将所有材料物品存入数组,然后排序(所有的排序算法都是冒泡,懒得写复杂的了。。况且冒泡好在保序),然后枚举每个物品作为“配方中id最小的物品”,以其为索引检查该子表内所有的配方,再检查配方中的物品。由于配方和物品数组都排过序(而且数组经过压缩,不存在空位),检查只需从该物品之后一次扫到末尾即可,虽然是双重循环但最内语句执行次数不超过物品数量,总复杂度不超过物品数量的平方乘以相关配方数(平均应该不会超过物品数的开方吧),以jass的效率保守起见一次可以参与合成50件物品,应该够了。
由于公用数组,好处是可以在多阶合成中让所有物品都参与合成,不必管物品是在地上还是在身上,全部合成完毕后再统一放回单位身上(原有的物品不取出,也不改变位置),也避免了意外触发的麻烦。坏处当然也有,万一被自定义触发直接或间接误改了就麻烦了。。(不过已经加了判定,不会同时触发两次合成,但也可能极其意外的情况下造成捡起物品不合成的bug)
分解的配方存在待分解物品id为主索引的子表里,副索引为-1~-7分别是7个分解结果(也不是0~-6,因为0留给合成配方数量了)
然后就是多合多。这个我把合成步骤分为两个部分:多合一+一合多,以便改写现有的系统。思路就是首先许多物品合成1个假物品(该物品和配方一一对应),然后假物品独自合成一堆新物品,这样就可以用假物品id来存储了。不过事实上,“假物品”并不真的存在于物编中,它们的id都是负数(和键盘控制系统的伪句柄原理类似,可以理解为配方的句柄),合成时也不会创建假物品,而是直接创建对应的一堆结果物品。假物品“自动合成”的结果储存在假物品id为主索引,结果编号(始于1增量1)为副索引的位置,副索引0的位置则存着结果数量。
注册也很简单,有很详尽的函数和示范,照着做就好了。
另外还能直接用这个系统做满背包商店购买卷轴的功能,只要让商店出售假物品,然后加上假物品独自合成真卷轴的配方就可以了。买来的物品会自动变成卷轴(或其它什么类型的物品)。图中也有演示。
啊,差点忘了说,图中还有一个系统,是某幻自己设计的满背包捡物品系统。因为某幻自己的图是rpg,物品成百上千不可能每个都做2遍,所以设计了这种检测命令的系统。原理就是即使物品栏已满,还是可以检测到发布的捡物品命令,之后只要让单位去捡该物品对应的一个powerup类假物品(怎么又是假物品。。)就可以了,捡到后再把真物品添加给单位。所有物品只需要一个公用的假物品,且算法保证地图里每件物品只对应一件假物品,相关触发也只注册一次,并且也做了特别的排泄。试图捡物品时判断一次可不可以捡取(和合成系统相辅相成),本身就是powerup类物品则无视系统直接捡,可合成、合并的也会捡(只是捡到后不是添加给英雄,而是直接进行合成),否则报错。报错信息采用了金矿含金量低的错误提示(由于和普通错误不同有语音,又懒得写触发所以没用书报错)。
这个设计原本不能作用于商店购买的物品,不过合成系统接管了这部分。此外还有个缺陷,就是会干扰shift指令队列,所以对抗等要求精细操作的地图还是采用一式两份的设计比较好,rpg地图就用这种设计好了~
嗯~字数差不多比疯大多了~就介绍这么多吧~
演示图里有一地物品,还有个商店,地上还有些书,其中力量之书可以参与合成(显然必须最后捡),公式见注释。合成时会显示使用的公式,这个属于“额外触发”的功能。
contest_transmute.w3x
(38 KB, 下载次数: 85)
|
评分
-
查看全部评分
|