小记一个自动匹配PK的BUG
前天就遇到个匹配PK的BUG,原本客户定制的副本里需要用到系统自动匹配PK,于是自己写了一段代码后发现有点小问题,但客户又着急要,在客户的建议下就直接是抄自于其他LUA的自动匹配PK的代码,本以为没啥问题,万万没想到这奇葩的设定会出一个很大的问题。
问题如下:
按照原本的PK战里是不允许进入到匹配的地图里,这样不会发生任何问题。但客户定制的这个副本是允许玩家重复进入匹配的地图里,结果就导致了当玩家第一次匹配完后输的人如果再次进入副本地图后,就会出现匹配到地图以外的其他地图的人进行PK。翻来覆去找了2天的问题所在和修复总算解决。
出问题的代码如下:
start = math.random(char.getPlayerMaxNum())
for i = 0, char.getPlayerMaxNum() - 1 do
charaindex1 = (start + i) % char.getPlayerMaxNum()
if char.check(charaindex1) == 1 then
if char.getInt(charaindex1, "地图号") == floormap[id] then
if char.getWorkInt(charaindex1, "组队") == 0 and char.getWorkInt(charaindex1, "战斗") == 0 then
charaindex2 = -1
for j = 0, char.getPlayerMaxNum() - 1 do
if char.check(j) == 1 then
if char.getInt(j, "地图号") == floormap[id] then
if char.getWorkInt(j, "组队") == 0 and char.getWorkInt(j, "战斗") == 0 then
if charaindex1 ~= j then
charaindex2 = j
if math.random(3) == 1 then
break
end
end
end
end
end
end
end
end
if char.check(charaindex2) == 1 then
battleindex = battle.CreateVsPlayer(charaindex1, charaindex2)
if battleindex > -1 then
battle.setLUAFunctionPointer(battleindex, "结束事件", "PlayerBattleFinish", "")
end
end
end
end
从代码上乍一看似乎没啥问题,索引都进行了地图判断,按理说应该不会出现匹配地图以外的人,第一次进入地图都不会存在问题,只有输的人重新进入地图就会大概率的发生,经过调试就发现当玩家二次进入到地图后,原本循环的索引j要指定给变量charaindex2,就会发生charaindex2不会判断地图号了,此时就必须在检查索引charaindex2有效的时候再次进行判断地图号。这样才能避免匹配到地图以外的玩家进行PK。