命令方块吧 关注:6,143贴子:69,109

【E.C.Tec】【乙烯】汉字输入法

只看楼主收藏回复

Hello,大家好,我是乙烯。今天呢,给大家带来我前几天做的一个小玩意儿——拼音输入法。希望大家喜欢。
在前排特别鸣谢来自TCP的 @lichi2050 帮我做了一部分文案工作。
我将其用在了我的作品Line内,擂台赛结束,故在此放个帖子。
http://www.bilibili.com/video/av3666844/


IP属地:江苏本楼含有高级字体1楼2016-02-14 22:36回复
    下面分模块进行讲解。
    软键盘-防溢出模块
    下面是一个指令样本。
    tellraw @a [{"text":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","color":"green"},{"selector":"@e[-8,4,1,r=0,name=!print]"},{"selector":"@e[-8,4,2,r=0,name=!print]"},{"selector":"@e[-8,4,3,r=0,name=!print]"},{"selector":"@e[-8,4,4,r=0,name=!print]"},{"selector":"@e[-8,4,5,r=0,name=!print]"},{"selector":"@e[-8,4,6,r=0,name=!print]"},{"selector":"@e[-8,4,7,r=0,name=!print]"},{"selector":"@e[-8,4,8,r=0,name=!print]"},{"selector":"@e[-8,4,9,r=0,name=!print]"},{"selector":"@e[-8,4,10,r=0,name=!print]"},{"text":"\n"},{"text":"【←】","color":"green","clickEvent":{"action":"run_command","value":"/tp @e[0,4,-1000,dz=2000,dx=0,dy=0,type=ArmorStand] ~ ~ ~10 "}},{"text":" "},{"selector":"@e[0,4,1,r=0]","clickEvent":{"action":"run_command","value":"/setblock -7 4 -4 minecraft:redstone_block"}},{"text":" "},{"selector":"@e[0,4,2,r=0]","clickEvent":{"action":"run_command","value":"/setblock -8 4 -4 minecraft:redstone_block"}},{"text":" "},{"selector":"@e[0,4,3,r=0]","clickEvent":{"action":"run_command","value":"/setblock -9 4 -4 minecraft:redstone_block"}},{"text":" "},{"selector":"@e[0,4,4,r=0]","clickEvent":{"action":"run_command","value":"/setblock -10 4 -4 minecraft:redstone_block"}},{"text":" "},{"selector":"@e[0,4,5,r=0]","clickEvent":{"action":"run_command","value":"/setblock -11 4 -4 minecraft:redstone_block"}},{"text":" "},{"selector":"@e[0,4,6,r=0]","clickEvent":{"action":"run_command","value":"/setblock -12 4 -4 minecraft:redstone_block"}},{"text":" "},{"selector":"@e[0,4,7,r=0]","clickEvent":{"action":"run_command","value":"/setblock -13 4 -4 minecraft:redstone_block"}},{"text":" "},{"selector":"@e[0,4,8,r=0]","clickEvent":{"action":"run_command","value":"/setblock -14 4 -4 minecraft:redstone_block"}},{"text":" "},{"selector":"@e[0,4,9,r=0]","clickEvent":{"action":"run_command","value":"/setblock -15 4 -4 minecraft:redstone_block"}},{"text":" "},{"selector":"@e[0,4,10,r=0]","clickEvent":{"action":"run_command","value":"/setblock -16 4 -4 minecraft:redstone_block"}},{"text":"【→】\n","color":"green","clickEvent":{"action":"run_command","value":"/tp @e[0,4,-1000,dz=2000,dx=0,dy=0,type=ArmorStand] ~ ~ ~-10 "}},{"text":"\n"},{"selector":"@e[-10,4,1,r=0,name=!check]"},{"selector":"@e[-10,4,2,r=0,name=!check]"},{"selector":"@e[-10,4,3,r=0,name=!check]"},{"selector":"@e[-10,4,4,r=0,name=!check]"},{"selector":"@e[-10,4,5,r=0,name=!check]"},{"selector":"@e[-10,4,6,r=0,name=!check]"},{"text":"\n","clickEvent":{"action":"run_command","value":"say hi"}},{"text":" [ Q ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 16 minecraft:redstone_block"}},{"text":"[ W ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 22 minecraft:redstone_block"}},{"text":"[ E ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 4 minecraft:redstone_block"}},{"text":"[ R ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 17 minecraft:redstone_block"}},{"text":"[ T ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 19 minecraft:redstone_block"}},{"text":"[ Y ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 24 minecraft:redstone_block"}},{"text":"[ U ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 20 minecraft:redstone_block"}},{"text":"[ I ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 8 minecraft:redstone_block"}},{"text":"[ O ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 14 minecraft:redstone_block"}},{"text":"[ P ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 15 minecraft:redstone_block"}},{"text":" │ ENTER │\n","clickEvent":{"action":"run_command","value":"say hi"}},{"text":" [ A ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 0 minecraft:redstone_block"}},{"text":"[ S ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 18 minecraft:redstone_block"}},{"text":"[ D ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 3 minecraft:redstone_block"}},{"text":"[ F ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 5 minecraft:redstone_block"}},{"text":"[ G ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 6 minecraft:redstone_block"}},{"text":"[ H ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 7 minecraft:redstone_block"}},{"text":"[ J ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 9 minecraft:redstone_block"}},{"text":"[ K ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 10 minecraft:redstone_block"}},{"text":"[ L ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 11 minecraft:redstone_block"}},{"text":" ","clickEvent":{"action":"run_command","value":"say hi"}},{"text":"│ 删除文字│\n","clickEvent":{"action":"run_command","value":"/setblock -15 5 -2 minecraft:redstone_block"}},{"text":" [ Z ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 25 minecraft:redstone_block"}},{"text":"[ X ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 23 minecraft:redstone_block"}},{"text":"[ C ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 2 minecraft:redstone_block"}},{"text":"[ V ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 21 minecraft:redstone_block"}},{"text":"[ B ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 1 minecraft:redstone_block"}},{"text":"[ N ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 13 minecraft:redstone_block"}},{"text":"[ M ]","clickEvent":{"action":"run_command","value":"/setblock -15 4 12 minecraft:redstone_block"}},{"text":" "},{"text":" │ 删除拼音 │","clickEvent":{"action":"run_command","value":"/setblock -15 4 -2 minecraft:redstone_block"}}]
    其效果如上方动图所示。


    IP属地:江苏3楼2016-02-14 22:40
    回复
      缓存模块

      也就是中间那两行目标所在的位置,这个位置呢是非常有趣的。白桦木木板那一行所存储的是拼音,因为拼音最多的可能性为6个字母,所以这里也就有六个位置。橡木木板那一行所存储的是打出的字,作为一个中继缓存。按下enter可以将打好的字转移到指定的位置。
      每行有一个属于自己的指针。拼音那一行由于需要读取数据所以有一排盔甲架。图中的命令方块仅为召唤盔甲架使用,不影响运行。
      summon ArmorStand ~ ~ ~ {CustomName:"set",NoGravity:1,Marker:1}
      这是一个样例的指令。
      读取拼音内容的盔甲架名为set
      拼音行指针名为check
      文字行指针名为print
      按键录入模块
      首先上方有一排高频,用于读取拼音行的内容。
      /scoreboard players set @e[name=set] end 0
      /execute @e[name=a] ~-1 ~ ~ /scoreboard players set @e[r=0,name=set] end 1
      /execute @e[name=b] ~-1 ~ ~ /scoreboard players set @e[r=0,name=set] end 2

      /execute @e[name=y] ~-1 ~ ~ /scoreboard players set @e[r=0,name=set] end 25
      /execute @e[name=z] ~-1 ~ ~ /scoreboard players set @e[r=0,name=set] end 26
      A-Z对应数字1-26,空格对应数字0。
      然后接下来是26排命令方块,对应各个字母,执行一次输入字母的工作。
      以字母A为例。
      /setblock ~1 ~ ~ air
      /execute @e[name=check] ~ ~ ~ kill @e[r=0,name=!check]
      /execute @e[name=check] ~ ~ ~ summon ArmorStand ~ ~ ~ {CustomName:"a",NoGravity:1,Marker:1}
      /execute @e[name=check] ~ ~ ~ detect ~ ~-1 ~1 planks -1 /tp @e[name=check] ~ ~ ~1
      清理一次本格内容以防bug。然后写下“A”,最后向右移动一次指针。


      IP属地:江苏5楼2016-02-14 22:41
      收起回复
        删除模块
        和边上的录入模块工作原理很类似。

        同样的,有删除拼音和删除文字两排指令。
        /setblock ~1 ~ ~ air
        /execute @e[name=print] ~ ~ ~ detect ~ ~-1 ~-1 planks -1 /tp @e[name=print] ~ ~ ~-1
        /execute @e[name=print] ~ ~ ~ kill @e[r=0,name=!print]
        kill @e[0,4,-1000,dz=2000,dx=0,dy=0,type=ArmorStand]
        最后的kill指令是为了刷新候选字。
        候选字模块

        如图所示,我们有十个候选字。
        每个候选字的处理方式如下
        /setblock ~ ~ ~1 air
        /execute @e[name=print] ~ ~ ~ kill @e[r=0,name=!print]
        /tp @e[0,4,1,r=0] @e[name=print]
        kill @e[0,4,-1000,dz=2000,dx=0,dy=0,type=ArmorStand]
        /execute @e[name=print] ~ ~ ~ detect ~ ~-1 ~1 planks -1 /tp @e[name=print] ~ ~ ~1
        /kill @e[-10,4,0,dz=10,name=!check]
        /tp @e[name=check] ~ ~ 1
        差不多意思就是汉字指针清除本格内容防止bug,将现有的候选字传送至指针位置,清除剩余候选字,移动指针。清除拼音。
        字库

        字库是个非常浩大的工程,本输入法支持20811个字,其中不同多音字视为各音节不同的字,累计103个多音字。
        那么这个大的字库我总得有个调用的好办法吧?否则实在是难以使用。
        上文对拼音的详解已经说明了调用办法。
        下文以音“中”为例。
        中= ZHONG
        ={26,8,15,14,7,0}
        以这样一个变幻方式我们可以将任何一个音变为一组6个的数组。
        汉语一共有406种音,所以我们会有406排命令方块。
        这是读取zhong音的命令。
        /execute @e[-11,4,1,r=0,name=set,score_end=26,score_end_min=26] ~ ~ ~ /execute @e[-11,4,2,r=0,name=set,score_end=8,score_end_min=8] ~ ~ ~ /execute @e[-11,4,3,r=0,name=set,score_end=15,score_end_min=15] ~ ~ ~ /execute @e[-11,4,4,r=0,name=set,score_end=14,score_end_min=14] ~ ~ ~ /execute @e[-11,4,5,r=0,name=set,score_end=7,score_end_min=7] ~ ~ ~ /testfor @e[-11,4,6,r=0,name=set,score_end=0,score_end_min=0]
        我们可以很清楚的看到6个数字所代表的位置。
        kill @e[0,4,-1000,dz=2000,dx=0,dy=0,type=ArmorStand]
        然后我们会激活一串清理现在的候选字的指令。
        summon ArmorStand 0 ~ ~ {CustomName:"中",Invisible:1,NoGravity:1,Marker:1}
        然后会在x=0的位置召唤出一条候选字纸带。
        故此我们才能够完整的使用汉字输入法,那么就是这样,希望大家喜欢。


        IP属地:江苏6楼2016-02-14 22:43
        收起回复
          你这个穷举也穷举出艺术了


          IP属地:上海来自Android客户端7楼2016-02-15 05:43
          回复
            大神发存档


            IP属地:重庆来自iPhone客户端8楼2016-02-15 09:13
            回复
              引用原话“不穷举你会变强♂么”


              IP属地:北京来自Android客户端9楼2016-02-15 09:24
              回复
                真心丧病


                IP属地:江苏来自iPhone客户端10楼2016-02-15 09:36
                回复
                  吧主一发帖这字符数量


                  IP属地:北京11楼2016-02-15 17:10
                  回复
                    穷举=有毅力


                    IP属地:陕西来自Android客户端12楼2016-02-15 18:14
                    回复
                      这得穷举多少啊。。。楼主厉害,接在下一跪


                      IP属地:广东来自iPhone客户端13楼2016-02-15 22:42
                      回复
                        从什么时候开始做的?


                        IP属地:重庆来自Android客户端14楼2016-02-16 09:47
                        回复
                          字库跪了……这个真得佩服……


                          IP属地:浙江来自iPhone客户端15楼2016-02-16 11:03
                          回复
                            这叫小玩意儿


                            IP属地:广东16楼2016-02-16 18:46
                            回复
                              穷举小能手乙烯


                              IP属地:广东来自Android客户端17楼2016-02-16 19:24
                              回复