铃心自定义——Edice开发几日随笔(掷骰篇)

最近在搞研发的那套,重新捡起了铃心化骰子的工作。

铃心化骰子——或者说用铃心实现骰子的功能,是完全可行的。但是为了让我们所开发的Edice能够完美的契合原有的指令,并且承接到以前我们的掷骰习惯,需要对其作出不少的“妥协工作”。

例如,掷骰表达式的解析,匹配方式的排布,以及储存结构的变化,都是需要我们重新考虑——而不能抄袭dice,直接挪用的。

明确工作重点

有很多人拿到了类似于Edice的项目之后,就立刻开始做什么coc这种可以很快制作出来的功能。

但是我们更应该顺从一种长期开发的角度,相对于我们提前开发那些较为简单容易捏的“软柿子”,不如先从开发一系列规范开始。而对于骰子来说,这个规范就是“掷骰表达式解析”。一切的一切都源于此。

掷骰表达式解析浅谈

掷骰表达式,可以是多个表达式组合起来表达的,如1d6+p+3d6k1
因此,解析掷骰表达式优先应该从解析单个组开始入手

解析单组掷骰表达式

单组掷骰表达式中,可能会出现D、B、P、K,这几种不同的掷骰公式,因此在解析组类的表达式之前,我们应该对最简单的情况进行解析

解析D掷骰表达式函数

在上文的函数中,有一个明确的输入[参数1]和[参数2],分别代表投骰子的数量和骰子的面数。但是你没法找到一个明确的输出,准确说,这个函数甚至不会有任何的输出。

这里就要谈到铃心的一个特性,即变量域作用范围。只要这个回复没有结束,变量的作用域就是整个回复。因此,在这个函数后面返回的【变量返回结果】和【变量返回式】就是我要传出的参数。

同理,其实我也可以不需要[参数1]和[参数2]这样的参数输入,但是为了后人看起来较为明确些,暂且这样先表示了。

解析P掷骰表达式函数

跟上文一样,也是通过【变量返回结果】和【变量返回式】来反馈结果。如果你想返回一个排序过后的式子,你可以用【变量排序列】作为你的返回结果。这就是用变量传递函数参数的最好之处——你可以不考虑用什么结构来传递这些稀奇古怪的输出结果。

解析B掷骰表达式函数

跟P掷骰函数同理,排序方式略有变化。

解析K掷骰表达式函数

提取单组掷骰表达式参数

尽管对所有的情况都进行了处理,还是会有某些情况我们无法解决——比如说3d10k2

通过子正则列和整数判别函数(一个判别结果是否是整数的函数,如果不是整数,就会返回一个空值,用来防止子正则没有取到出现的一些参数错误情况),可以提取出来一堆参数,并且复制到变量中。该函数也是没有直接输出的,但是为了让这个参数能够自由在函数体内传递,我仍旧赋值给了一个【变量传入文本】来长久的保存这个参数,防止在某些函数体内部传递的时候参数出现了错乱。

标准参数情况下的表达式处理

既然参数提取出来了,就要对合法性进行检测,然后传入到之前写入的子函数中。

通过选择的逻辑层层判断,对所有的可能进行遍历,如果遍历完成后还是没有匹配,则说明表达式不合法,会返回1作为错误码让下一级函数适时跳出。
这个函数只有一个数字作为合法性返回值。

单组掷骰表达式综合处理

既然准备就绪,我们就可以开始对单组表达式进行完美的解析和格式化输出了。

其中考虑了几种情况,并且给出了几种错误的返回值。
如2为表达式错误,3为骰数过多,4为有0输入存在。

多轮投掷出目

主要解析#在函数体中发挥的作用。

至此,对于r的表达式解析可以暂时告一段落,但是实际上这里少考虑了一种情况,即#处在表达式后半部的时候,会进行一次轮数roll。但是由于使用者较少,且意义不是特别明确,在此没有考虑在内。

函数调用和格式化输出

一个使用的范本,但并非里面所有的函数都是铃心自带的(笑——

实际效果

综述

尽管是看起来如此不起眼的一个功能,其内部的逻辑是如此的复杂——对于铃心来说,开发者要做的事情就是尽可能缩短代码的量来完成实现功能。而封装好函数则是这一切的一切的前提。
在之后,我会利用数据库储存人物卡数据,通过数据库和铃心的结合,让Edice绽放出比Dice本体更为耀眼的光芒,还请拭目以待。

Yorunina

2 Comments

  • 让Edice绽放出比Dice本体更为耀眼的光芒!
    鸟阿姨太强了~(o´ω`o)ノ

  • 能用铃心的语言做到这种程度的简洁表述,简直是艺术\o/

留下你的评论

*评论支持代码高亮<pre class="prettyprint linenums">代码</pre>

相关推荐