找回密码
 点一下
查看: 2493|回复: 13

【响应活动】键盘控制系统&物品合成系统

[复制链接]
发表于 2011-6-21 08:32:23 | 显示全部楼层 |阅读模式
某幻来凑个热闹~
话说三个题目某幻都有做~其实也不是某幻苦力~主要是自己的地图里三个系统都有涉及的说~而且都不是什么高深的算法~
先放出两个测试版~随机迷宫由于要改的东西太多~过两天再放出来~

(用红字表示新加的内容)
话说小学期的课灰常给力,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)

评分

参与人数 1威望 +13 GA币 +1000 收起 理由
疯人¢衰人 + 13 + 1000 很好地解答了问题

查看全部评分

 楼主| 发表于 2011-6-21 08:55:36 | 显示全部楼层
大清早大概没人来~寂寞地抱着沙发的说~
回复

使用道具 举报

发表于 2011-6-21 09:25:20 | 显示全部楼层
中午找时间测试吧,看说明完成度挺高的……
实际上多对多的物品合成基本上就是考察数据合成的算法。
另外随机迷宫注意执行上限
回复

使用道具 举报

 楼主| 发表于 2011-6-21 10:20:02 | 显示全部楼层
引用第2楼疯人¢衰人于2011-06-21 09:25发表的  :
中午找时间测试吧,看说明完成度挺高的……
实际上多对多的物品合成基本上就是考察数据合成的算法。
另外随机迷宫注意执行上限

嗯,300000字节码的限制。实在不行可以用trigger反复刷(我的存档加密算法就是用刷的……)。
回复

使用道具 举报

发表于 2011-6-21 11:15:30 | 显示全部楼层
引用第3楼幻之皮卡丘于2011-06-21 10:20发表的  :


嗯,300000字节码的限制。实在不行可以用trigger反复刷(我的存档加密算法就是用刷的……)。
可以用0秒timer,如果没返回值,否则用wait也行,不过wait(0)可能不行……
回复

使用道具 举报

发表于 2011-6-21 12:47:53 | 显示全部楼层
控制系统完成的不错,暂时没发现什么问题,只是吐槽下,有个技能我实在发不出来。效率方面没有测试
回复

使用道具 举报

发表于 2011-6-21 13:05:29 | 显示全部楼层
物品合成系统也没啥问题,只是有点小毛病。GAB最后一起给。
毛病在于,如果我拆分了一个物品,然后再捡取一个无关物品,拆分原料又自动合成了……
回复

使用道具 举报

 楼主| 发表于 2011-6-21 19:15:20 | 显示全部楼层
引用第6楼疯人¢衰人于2011-06-21 13:05发表的  :
物品合成系统也没啥问题,只是有点小毛病。GAB最后一起给。
毛病在于,如果我拆分了一个物品,然后再捡取一个无关物品,拆分原料又自动合成了……

我的分解函数的注释里有写,实际应用的时候强烈推荐大家让分解的物品掉在地上,这里只是演示下系统支持分解后物品留在身上,而不会造成死循环。

嗯,正式版改成“必须有新捡起或新合成的物品参与的配方才能生效”吧,这样分解后必须把某样东西扔掉再捡起才会重新合成了。
回复

使用道具 举报

发表于 2011-6-21 22:49:57 | 显示全部楼层
另外拆分的物品最好支持不同的拆分方式,即拆分出的必然是此物品的合成原料,叠加物品还是单个拆分为好,毕竟物品叠加后无法拆分开
回复

使用道具 举报

 楼主| 发表于 2011-6-21 23:13:16 | 显示全部楼层
不同的拆分方式是什么?现在已经支持单独的合成公式、单独的分解公式、合成分解公用公式三种模式了~只要不用单独的分解公式,就可以保证分解的物品一定可以合成回去~
分解嘛,弄个模式开关吧,控制是拆一个还是全拆。个人比较喜欢全拆的说~
啊,发现一个bug,关于可合并物品合成的。已修复。
回复

使用道具 举报

发表于 2011-6-22 06:06:47 | 显示全部楼层
就是如果c可以由a+b或d+e合成,那么拆分c时依据合成来源拆分成ab或de,当然这个只是建议而已,公式注册时会覆盖这点很不爽,要么单一合成配方,要么多配方物品不可拆分,要么就支持多种拆分方式。实际上现在这个系统就可以实现效果,复制c为c1.c2即可
回复

使用道具 举报

 楼主| 发表于 2011-6-22 19:51:12 | 显示全部楼层
引用第10楼疯人¢衰人于2011-06-22 06:06发表的  :
就是如果c可以由a+b或d+e合成,那么拆分c时依据合成来源拆分成ab或de,当然这个只是建议而已,公式注册时会覆盖这点很不爽,要么单一合成配方,要么多配方物品不可拆分,要么就支持多种拆分方式。实际上现在这个系统就可以实现效果,复制c为c1.c2即可

虽然不是不能做到,但是那样就要想办法记录物品相关的一个值(即它的合成来源),用自定义值的话可能会和其它系统冲突,存在表里又难免物品以意外方式消失后句柄被新物品重用。。导致新物品会按奇怪的方式分解。。所以就没那么设计
回复

使用道具 举报

发表于 2011-6-23 06:30:07 | 显示全部楼层
所以只是建议而已……
回复

使用道具 举报

 楼主| 发表于 2011-7-5 00:19:45 | 显示全部楼层
自己顶一下~封稿了~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-12-22 15:35 , Processed in 0.194235 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表