德州扑克-allin主池边池,分池算法

        最近做完了德州扑克项目,对里面的一个allin分池算法有点感悟,值得记录下来,我大概看了一个老项目的分池算法,代码非常复杂,有100多行,对此我觉得可以优化一下的,实在没必要搞得这么复杂。

为此我重构了一下,采用了另外一个思路,大概用了50行,思路清晰,代码如下:

      
function TableFrame:CountChiZi(lChiZiScore, bChiZiPlayer)
	local  vecUserScore ={}
    local  lTotalScore=mytools.clone(self.m_lTotalScore)
    local count=0;

    while (true) do
		vecUserScore={}
		for i = 1, DEF.GAME_PLAYER do
			if(lTotalScore[i]>0 and self.m_cbPlayStatus[i]==1 )then
							
				local PlayScore={}
				PlayScore.wChairID=i;
				PlayScore.lScore=lTotalScore[i]; 
			    table.insert(vecUserScore,PlayScore)
                table.sort(vecUserScore,function( first, second)
                    return (first.lScore0)then
			for i = 1, DEF.GAME_PLAYER do
				if (self.m_cbPlayStatus[i]~=1 and count==0)then
				--    //主池要算弃牌者
					lChiZiScore[count+1]=lChiZiScore[count+1]+lTotalScore[i];
					lTotalScore[i]=lTotalScore[i]-lTotalScore[i];
					bChiZiPlayer[count+1][i]=true;
				
				elseif(lTotalScore[i]>=vecUserScore[1].lScore )then
					lChiZiScore[count+1]=lChiZiScore[count+1]+vecUserScore[1].lScore;
					lTotalScore[i]=lTotalScore[i]-vecUserScore[1].lScore;
					bChiZiPlayer[count+1][i]=true;

                end
            end
        end
        if(count>=DEF.GAME_PLAYER or lChiZiScore[count+1]==0)then
            break;
        end
		count=count+1
     end
	return count;
end

---使用示例
 local	lChiZiScore={0, 0, 0,0,0,0,0,0,0}			    --//主池和边池
        local	bChiZiPlayer={{},{},{},{},{},{},{},{},{}}			    --//主池和边池
        local count= self:CountChiZi(lChiZiScore,bChiZiPlayer);

为什么要分池,主要是因为allin时,有的人钱多,有的人钱少,不能以小博大的,就有了这分池这么一个算法,这个算法的思路是先对下注的分数进行排序,第1个池(也叫主池)是以最小的下注者为均分线,弃牌的直接算进里面,不论钱多少。比方:有6个人分别下注,6,20,30,50,100,200那么第一个池(也叫主池)就是6*6,第二个池就是第二个人下注剩下的钱作为均分线,也就是20-6=14,也就是14*5,第三个池是剩下钱的均分线是30-20=10,也就是池大小10*4,依此类似,算完所有钱为止,理论上多少个人就可能有多少个池。bChiZiPlayer变量是用来记录那个池谁参与了,最后算分时好计算。

 

 

你可能感兴趣的:(计算机,算法,lua,后端,数据结构,算法)