找回密码
 点一下
查看: 1940|回复: 36

关于输入混合指令的细致区分

[复制链接]
发表于 2013-1-30 04:25:49 | 显示全部楼层 |阅读模式
比如我的地图有Ap模式

也有NoSwap模式

但是在输入NoSwap的时候会因为最后的两个"ap"触发Ap模式

但DOTA的并不会

请问这点要如何处理才能避免?
发表于 2013-1-30 10:54:33 | 显示全部楼层
不是字符串完全匹配就可以避免么?
在输入的触发里面要完全匹配。
如果是部分匹配就是你这种情形了。
回复

使用道具 举报

发表于 2013-1-30 12:02:44 | 显示全部楼层
本帖最后由 chyj4747 于 2013-1-30 21:51 编辑

dota是捕捉到这个字符串后算法处理,dota里具体用到的算法我没看……

比如说事件就是捕捉头字符,dota里是'-',即所有命令都是“-xx”的形式
然后拆这个字符再分别处理
假设输入“NoSwap”
“N”、“No”、“NoS”、“NoSw”、“NoSwa”:没意义
“NoSwap”:是命令,于是储存,然后从'p'后面开始截,发现没有了,那么就停止截取,然后对储存的字符进行处理

假设输入“NoSwapap”
截取了“NoSwap”后还剩“ap”,继续截取

当然具体的截取算法不用这么繁琐,比如命令里最少的位数是两位(即ap),那么直接截取两位而不是一位一位增加,如果截取的两位命令没有符合的话,那么截取下一种较短长度命令,比如“NoSwap”就是除“ap”外最短的了,那么直接截6位

【好吧我错了。。应该截取长的优先……】

点评

对战初始化 事件 玩家 - 玩家1(红色) 输入的聊天信息包含 NoSwap ,匹配方式: 包含字符串 条件 (截取 (输入的聊天信息) 的 1 - 1 字节部分) 等于 - 动作 设置 I = ((输入的  详情 回复 发表于 2013-1-30 18:43
回复

使用道具 举报

发表于 2013-1-30 16:29:37 | 显示全部楼层
首先完全匹配长的命令

对于两个字母的组合命令,每次截取两个字符判断是否为有效命令,如果是有效命令,执行命令并继续截取,否则全部跳过。
回复

使用道具 举报

发表于 2013-1-30 17:14:22 | 显示全部楼层
本帖最后由 zhuzeitou 于 2013-1-30 17:16 编辑

严格地从头匹配,优先匹配长项,立即跳过已匹配内容,永远保证一个指令不可能是另一个指令的前缀,不出现二义性

点评

好深奥。。  详情 回复 发表于 2013-1-30 17:54
回复

使用道具 举报

发表于 2013-1-30 17:54:56 | 显示全部楼层
zhuzeitou 发表于 2013-1-30 17:14
严格地从头匹配,优先匹配长项,立即跳过已匹配内容,永远保证一个指令不可能是另一个指令的前缀,不出现二 ...

好深奥。。

点评

lo
其实猪头的意思就是匹配过的内容立即删除,然后保证指令的名字不易混淆,避免歧义……  详情 回复 发表于 2013-1-30 17:57
回复

使用道具 举报

发表于 2013-1-30 17:57:56 | 显示全部楼层
asd8645123123 发表于 2013-1-30 17:54
好深奥。。

其实猪头的意思就是匹配过的内容立即删除,然后保证指令的名字不易混淆,避免歧义……
回复

使用道具 举报

 楼主| 发表于 2013-1-30 18:43:33 | 显示全部楼层
chyj4747 发表于 2013-1-30 12:02
dota是捕捉到这个字符串后算法处理,dota里具体用到的算法我没看……

比如说事件就是捕捉头字符,dota里 ...

对战初始化
    事件
        玩家 - 玩家1(红色) 输入的聊天信息包含 NoSwap ,匹配方式: 包含字符串
    条件
        (截取 (输入的聊天信息) 的 1 - 1 字节部分) 等于 -
    动作
        设置 I = ((输入的聊天信息)的长度)
        For循环整数A从 1 到 I, 做动作
            Loop - 动作
                设置 S = (截取 (输入的聊天信息) 的 2 - ((I + 1) x 2) 字节部分)



按你的思路尝试写了一下,由于无法判断大小写的原因没办法准确判定指令啊……
回复

使用道具 举报

发表于 2013-1-30 21:57:55 | 显示全部楼层
冷漠 发表于 2013-1-30 18:43
对战初始化
    事件
        玩家 - 玩家1(红色) 输入的聊天信息包含 NoSwap ,匹配方式: 包含字符串

[trigger]test
    事件
        玩家 - 玩家 1 (红色) types a chat message containing NoSwap as 完全匹配
    环境
    动作
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - 环境
                (Entered chat string) 等于 noswap
            Then - 动作
                游戏 - Display to (All players) the text: True
            Else - 动作
                游戏 - Display to (All players) the text: false
[/trigger]
QQ截图20130130090042.png

传说中的大小写?……

点评

输入指令为包括项吧,还有-号和其他模式混合呢……  详情 回复 发表于 2013-1-30 23:28
回复

使用道具 举报

 楼主| 发表于 2013-1-30 23:28:47 | 显示全部楼层
chyj4747 发表于 2013-1-30 21:57
[trigger]test
    事件
        玩家 - 玩家 1 (红色) types a chat message containing NoSwap as 完 ...

输入指令为包括项吧,还有-号和其他模式混合呢……
回复

使用道具 举报

发表于 2013-1-31 03:21:03 | 显示全部楼层
本帖最后由 chyj4747 于 2013-1-31 22:43 编辑
冷漠 发表于 2013-1-30 23:28
输入指令为包括项吧,还有-号和其他模式混合呢……


自己截取啊~
PS:之前我说错了,应该按猪头和lo说的先截长的
回复

使用道具 举报

发表于 2013-1-31 08:27:54 | 显示全部楼层
其实如果保证任何一个指令不是另一个指令的前缀的话,不一定需要先截长的
回复

使用道具 举报

发表于 2013-1-31 09:11:51 | 显示全部楼层
本帖最后由 lfglvstory 于 2013-1-31 09:16 编辑

刚好近期写了个字符串系统,LZ可以参考一下。截取实际捕获命令的这段贴出来:
  1. function Trig_SinglePlayer_Actions takes nothing returns nothing
  2.     local player p = GetTriggerPlayer()
  3.     local integer id = GetPlayerId(p)
  4.     local string msg = StringCase(GetEventPlayerChatString(),false) // 获取当前的聊天字符串,并且做小写转换操作
  5.     local integer l = StringLength(msg)
  6.     local integer data
  7.     local integer parentKey = GetHandleId(p)
  8.     local trigger orderTrig_ability
  9.     local trigger orderTrig_ability
  10.     //call Debug(SubString(msg,0,6))
  11.      // 截取字符串与-lvlup匹配,也可以写成 SubString(msg,0,StringLength("-lvlup"))=="-lvlup",建议这么写,将命令封装一下就更好
  12.     if SubString(msg,0,6) == "-lvlup" then
  13.         set data = S2I(SubString(msg,6,l))
  14.         call SaveInt(parentKey,StringHash("level"),data)
  15.         call DestroyGroup(GetUnitsInRectMatching(GetPlayableMapRect(),Condition(function LvlupFilter)))
  16.         call FlushChildHashtable(udg_HT,parentKey)
  17.     elseif SubString(msg,0,5) == "-gold" then
  18.         set data = S2I(SubString(msg,5,l))
  19.         call SetPlayerState(p,PLAYER_STATE_RESOURCE_GOLD,GetPlayerState(p,PLAYER_STATE_RESOURCE_GOLD)+data)
  20.     elseif SubString(msg,0,7) == "-lumber" then
  21.         set data = S2I(SubString(msg,7,l))
  22.         call SetPlayerState(p,PLAYER_STATE_RESOURCE_LUMBER,GetPlayerState(p,PLAYER_STATE_RESOURCE_LUMBER)+data)
  23.     elseif SubString(msg,0,5) == "-nocd" then
  24.         set udg_orderTrig_ability = CreateTrigger()
  25.         call TriggerRegisterAnyUnitEventBJ( orderTrig_ability, EVENT_PLAYER_UNIT_SPELL_EFFECT )
  26.         call TriggerAddAction( orderTrig_ability, function NoCD_Actions )
  27.         //call ConditionalTriggerExecute( order_nocd )
  28.     elseif SubString(msg,0,7) == "-nomana" then
  29.         set udg_orderTrig_ability = CreateTrigger()
  30.         call TriggerRegisterAnyUnitEventBJ( orderTrig_ability, EVENT_PLAYER_UNIT_SPELL_EFFECT )
  31.         call TriggerAddAction( orderTrig_ability, function NoMana_Actions )
  32.         //call ConditionalTriggerExecute( order_nomana )
  33.     endif
  34.     set p = null
  35. endfunction

  36. //===========================================================================
  37. function InitTrig_SinglePlayer takes nothing returns nothing
  38.     local integer index = 1
  39.     set gg_trg_SinglePlayer = CreateTrigger(  )
  40.     loop
  41.         call TriggerRegisterPlayerChatEvent( gg_trg_SinglePlayer, Player(index), "", false )
  42.         set index = index + 1
  43.         exitwhen index > 11
  44.     endloop
  45.     call TriggerAddAction( gg_trg_SinglePlayer, function Trig_SinglePlayer_Actions )
  46. endfunction
复制代码

点评

看不懂Jass……  详情 回复 发表于 2013-1-31 18:55
回复

使用道具 举报

发表于 2013-1-31 14:35:13 | 显示全部楼层
問題出在這裡 QQ截圖20130131143536.png
你應該要用全等字串而不是包含字串
另外包含字串也可以
不過寫法不同,如下圖
QQ截圖20130131143536.png
這個好處是可以1T完成多種指令不過要記得加上紅框裡的條件喔!!

点评

这个办法你无法判断输入字符的大小写,并且这样做就需要输入时必须按这个输入顺序……  详情 回复 发表于 2013-1-31 18:56
回复

使用道具 举报

 楼主| 发表于 2013-1-31 18:55:15 | 显示全部楼层
lfglvstory 发表于 2013-1-31 09:11
刚好近期写了个字符串系统,LZ可以参考一下。截取实际捕获命令的这段贴出来:

看不懂Jass……

点评

如上图,魔兽头提供字符串的大小写转换函数。  详情 回复 发表于 2013-1-31 19:42
回复

使用道具 举报

 楼主| 发表于 2013-1-31 18:56:08 | 显示全部楼层
貓野椰 发表于 2013-1-31 14:35
問題出在這裡
你應該要用全等字串而不是包含字串
另外包含字串也可以

这个办法你无法判断输入字符的大小写,并且这样做就需要输入时必须按这个输入顺序……

点评

不用按順序阿 我兩個判斷條件是獨立的  详情 回复 发表于 2013-2-1 06:20
回复

使用道具 举报

发表于 2013-1-31 19:42:19 | 显示全部楼层
冷漠 发表于 2013-1-31 18:55
看不懂Jass……

截图20130131194606.png
如上图,魔兽头提供字符串的大小写转换函数。

点评

噢,对哦,忘记可以先转换为全小写再判断了。  详情 回复 发表于 2013-1-31 21:49
回复

使用道具 举报

 楼主| 发表于 2013-1-31 21:49:43 | 显示全部楼层
lfglvstory 发表于 2013-1-31 19:42
如上图,魔兽头提供字符串的大小写转换函数。

噢,对哦,忘记可以先转换为全小写再判断了。
回复

使用道具 举报

发表于 2013-1-31 22:45:47 | 显示全部楼层
冷漠 发表于 2013-1-31 18:56
这个办法你无法判断输入字符的大小写,并且这样做就需要输入时必须按这个输入顺序……

你说的没法判断大小写到底是什么啊……


[trigger]未命名触发器 001
    事件
        玩家 - 玩家1(红色) 输入 - ,信息过滤方式 包含字符串
    条件
    动作
        如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 动作)
            If - 条件
                (截取 (输入的聊天信息) 的 1 - 2 字节部分(不包括首字节)) 等于 M
            Then - 动作
                游戏 - 对 玩家1(红色) 在屏幕位移(0.00,0.00)处显示文本: true
            Else - 动作
                游戏 - 对 玩家1(红色) 在屏幕位移(0.00,0.00)处显示文本: false
[/trigger]
QQ截图20130131094604.png

点评

意思就是无论你输入大写还是小写或者任何指令任何位置都能触发  详情 回复 发表于 2013-1-31 23:13
回复

使用道具 举报

 楼主| 发表于 2013-1-31 23:13:51 | 显示全部楼层
chyj4747 发表于 2013-1-31 22:45
你说的没法判断大小写到底是什么啊……


[trigger]未命名触发器 001

意思就是无论你输入大写还是小写或者任何指令任何位置都能触发
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 22:01 , Processed in 1.112180 second(s), 34 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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