小记一个自动匹配PK的BUG - 神奇石器时代技术研究交流
神奇石器技术研究交流网 - 业务联系QQ:420004208

小记一个自动匹配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。


版权声明:若无特殊注明,本文皆为《sa60》原创,转载请保留文章出处。

本文链接:小记一个自动匹配PK的BUG - http://sa60.com/post-281.html

本文标签:

小记一个自动匹配PK的BUG