本帖最后由 shenji 于 2022-7-22 02:56 PM 编辑
感谢xxhy的指路
众所周知,偷学任务被魔性般地颠倒语句,因此npc发出的招式和慕容复要求的招式并不能严格匹配。
本来我是破罐子破摔,通过不重复地偷学招式来尽可能完成任务,后来在xxhy的指引下,发现了比较两个数组元素相似度的函数,因此得出下面的方案。
一.比较两个数组的相似度
- function levenshtein(strA, strB)
- local tempTb = {}
- for m = 1, (#strA + 1), 1 do
- tempTb[m] = {}
- tempTb[m][1] = m - 1
- end
- for n = 1, (#strB + 1), 1 do
- tempTb[1][n] = n - 1
- end
- for i = 2, (#strA + 1) , 1 do
- for j = 2, (#strB + 1), 1 do
- local x = tempTb[i - 1][j] + 1 --删除
- local y = tempTb[i][j - 1] + 1 --插入
- local z = 0
- if strA[i - 1] == strB[j - 1] then --替换
- z = tempTb[i -1][j - 1]
- else
- z = tempTb[i -1][j - 1] + 1
- end
复制代码
二.将慕容复需要的招式分割成单个文字存入数组
- tx_pfm = {} --储存需要偷学的招式
- tx_c = 1
- function tx_split(str)
- local tx_str = tostring(str)
- local str_i_max = tonumber(string.len(str)) --string.len()返回string的单字符长度
- local tx_s = {}
- local i = 1
- while i <= str_i_max do
- table.insert(tx_s,string.sub(tx_str,i,i+1)) --tx_s中存放的是一句招式分割后的所有单个汉字、标点符号
- i = i + 2
- end
- tx_pfm[tx_c] = tx_s --将表格 tx_s嵌套到表格 tx_pfm中,每一句招式存一次
- tx_c = tx_c + 1
复制代码
三.确保不会重复偷学npc的招式
function tx(str)
--Note("开始匹配")
for k, v in pairs(tx_npfm) do
if string.find(v, str) ~= nil then
--Note("第"..k.."招匹配成功")
break
elseif string.find(v, str) == nil then
k = k + 1
if tx_npfm[k] == nil then
table.insert(tx_npfm,str)
--Note("开始偷学")
tx_cp(str)
break
end
end
end
end
四.根据npc招式和慕容复要求之间的相似度决定是否偷学
- function tx_cp(str)
- local tx_str = tostring(str)
- local str_i_max = tonumber(string.len(str))
- local tx_s = {}
- local i = 1
- while i <= str_i_max do
- table.insert(tx_s,string.sub(str,i,i+1)) --首先将npc招式分割成单个汉字,存入表格,才能进行下一步的比较
- i = i + 2
- end
- --tprint(tx_s)
- for k, v in pairs(tx_pfm) do
- if levenshtein(tx_pfm[k],tx_s) < 50 then --这里的50是相似度,如果定得太高,可能会导致匹配不成功学不到所有招式,定得太低,可能会导致学习到不需要的招式,暂定50以观后效
- --Note("第"..k.."招匹配不成功,继续:")
- k = k + 1
- if tx_pfm[k] == nil then
- break
- end
- elseif levenshtein(tx_pfm[k],tx_s) >= 50 then
- --Note("第"..k.."招匹配成功")
- Send("touxue "..GetVariable("tx_id")) --匹配度达标才进行偷学操作
- break
- end
- end
- end
复制代码
效果:
慕容复在你的耳边悄声说道:
刘雨伏地一个滚翻,一招「伏虎」,听风钢杖挟呼呼风声迅猛扫向高梦香的足胫!
段月叶一招「平地龙飞」,全身滴溜在地溜地上打个大转,举棍向牛圣的胸腹间戳去!
李劲潜运真力,一招「苍龙归海」,钢杖顿时长了数丈,般直矫龙射盖杰的世豪胸口!
龚颖一招「投流」鞭断,钢杖高举,以雷霆万钧之势对准独孤蓉瑾的天灵当头劈下!
柴立颖一招「黄石纳履」,手中钢杖如蜻蜓点水般,招招向豪杰盖世的下盘要害点去!
慕容复在你的耳边悄声说道:其人名曰孔八劲,正在小山村一带活动。
>/tprint(tx_pfm)
1: 1="一"、2="个"、3="滚"、4="翻"、5=","、6="一"、7="招"、8="「"、9="伏"、10="虎"、11="」"、12=","、13="听"、14="风"、15="钢"、16="杖"、17="挟"、18="呼"、19="呼"、20="风"、21="声"、22="迅"、23="猛"、24="扫"、25="向"、26="高"、27="梦"、28="香"、29="的"、30="足"、31="胫"、32="!" 2: 1="招"、2="「"、3="平"、4="地"、5="龙"、6="飞"、7="」"、8=","、9="全"、10="身"、11="滴"、12="溜"、13="在"、14="地"、15="溜"、16="地"、17="上"、18="打"、19="个"、20="大"、21="转"、22=","、23="举"、24="棍"、25="向"、26="牛"、27="圣"、28="的"、29="胸"、30="腹"、31="间"、32="戳"、33="去"、34="!" 3: 1="真"、2="力"、3=","、4="一"、5="招"、6="「"、7="苍"、8="龙"、9="归"、10="海"、11="」"、12=","、13="钢"、14="杖"、15="顿"、16="时"、17="长"、18="了"、19="数"、20="丈"、21=","、22="般"、23="直"、24="矫"、25="龙"、26="射"、27="盖"、28="杰"、29="的"、30="世"、31="豪"、32="胸"、33="口"、34="!" 4: 1="「"、2="投"、3="流"、4="」"、5="鞭"、6="断"、7=","、8="钢"、9="杖"、10="高"、11="举"、12=","、13="以"、14="雷"、15="霆"、16="万"、17="钧"、18="之"、19="势"、20="对"、21="准"、22="独"、23="孤"、24="蓉"、25="瑾"、26="的"、27="天"、28="灵"、29="当"、30="头"、31="劈"、32="下"、33="!" 5: 1="招"、2="「"、3="黄"、4="石"、5 ="纳"、6="履"、7="」"、8=","、9="手"、10="中"、11="钢"、12="杖"、13="如"、14="蜻"、15="蜓"、16="点"、17="水"、18="般"、19=","、20="招"、21="招"、22="向"、23="豪"、24="杰"、25="盖"、26="世"、27="的"、28="下"、29="盘"、30="要"、31="害"、32="点"、33="去"、34="!"
(为了方便查看已经转换方向)
偷学完毕之后 >/tprint(tx_npfm)
1="已学招数" 2="潜运真力,一招「苍龙归海」,铁杖顿时长了数丈,矫龙般直射你的胸口!" --与要求第三式匹配 3="一招「流星赶月」,身棍合一,棍端逼成一条直线,流星般向顶向你的头部!" --多余招式 4="把铁杖平提胸口,一拧身,一招「勒马停锋」,铁杖猛地撩向你的颈部!" --多余招式 5="一招「流星赶月」,身棍合一,棍端逼成一条直线,流星般向顶向你的颈部!" --多余招式、与已学第二式重复(因为确保不重复偷学时用的是严格匹配而不是相似度匹配,这里可以进行优化) 6="一招「投鞭断流」,铁杖高举,以雷霆万钧之势对准你的天灵当头劈下!" --与要求第四式匹配 7="双手持棍划了个天地大圈,一招「红霞贯日」,一棍从圆心正中击出,撞向你的胸口!" --多余招式 8="一招「平地龙飞」,全身滴溜溜地在地上打个大转,举棍向你的胸腹间戳去!" --与要求第二式匹配 9="伏地一个滚翻,一招「伏虎听风」,铁杖挟呼呼风声迅猛扫向你的足胫!" --与要求第一式匹配 10="一招「黄石纳履」,手中铁杖如蜻蜓点水般,招招向你的下盘要害点去!" --与要求第五式匹配 11="往东离开。"
你向慕容复打听有关『finish』的消息。
你向慕容复细细分说偷学到的『韦驮棍』招式。
慕容复说道:「不错不错,有了这些招式,我的斗转星移肯定能更进一步。」
完成慕容复偷学任务,你获得了8271点经验,4624点潜能和1084点江湖声望的奖励。
你完成了29次慕容偷学任务。
|