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

11 篇文章 2 订阅
9 篇文章 2 订阅

        最近做完了德州扑克项目,对里面的一个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.lScore<second.lScore)
                end); 
            end
        end
		if (#vecUserScore>0)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变量是用来记录那个池谁参与了,最后算分时好计算。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源说明】 基于深度强化学习的德州扑克AI算法优化python源码+项目说明+模型.zip基于深度强化学习的德州扑克AI算法优化python源码+项目说明+模型.zip基于深度强化学习的德州扑克AI算法优化python源码+项目说明+模型.zip基于深度强化学习的德州扑克AI算法优化python源码+项目说明+模型.zip基于深度强化学习的德州扑克AI算法优化python源码+项目说明+模型.zip 基于深度强化学习的德州扑克AI算法优化python源码+项目说明+模型.zip基于深度强化学习的德州扑克AI算法优化python源码+项目说明+模型.zip 基于深度强化学习的德州扑克AI算法优化python源码+项目说明+模型.zip基于深度强化学习的德州扑克AI算法优化python源码+项目说明+模型.zip 基于深度强化学习的德州扑克AI算法优化python源码+项目说明+模型.zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
德州扑克是一种非常流行的扑克牌游戏,它的算法代码可以用来实现游戏的逻辑和规则。以下是一个简单的JavaScript德州扑克算法代码示例: ```javascript // 定义扑克牌的花色和点数 const suits = ["♠", "♥", "♦", "♣"]; const ranks = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"]; // 生成一副完整的扑克牌 function generateDeck() { const deck = []; for (let suit of suits) { for (let rank of ranks) { deck.push(rank + suit); } } return deck; } // 洗牌函数 function shuffle(deck) { for (let i = deck.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [deck[i], deck[j]] = [deck[j], deck[i]]; } } // 发牌函数 function dealCards(deck, numPlayers, numCards) { const hands = []; for (let i = 0; i < numPlayers; i++) { hands.push([]); } for (let j = 0; j < numCards; j++) { for (let i = 0; i < numPlayers; i++) { hands[i].push(deck.pop()); } } return hands; } // 判断牌型函数 function evaluateHand(hand) { // 实现牌型判断的逻辑 // ... return "牌型"; } // 使用示例 const deck = generateDeck(); shuffle(deck); const hands = dealCards(deck, 4, 2); for (let i = 0; i < hands.length; i++) { console.log("玩家" + (i +1) + "的手牌:" + hands[i].join(", ")); } const handType = evaluateHand(hands[0]); console.log("玩家1的牌型是:" + handType); ``` 这段代码实现了德州扑克的基本逻辑,包括生成一副扑克牌、洗牌、发牌和判断牌型等功能。你可以根据需要进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值