当前位置: 首页 > 编程语言 > C#

c#DirectCheckPoker分享

时间:2023-04-10 14:33:22 C#

c#DirectCheckPoker我正在尝试用c#写一个扑克手牌评估方法。我已经成功地使用linq为除直线以外的每一手扑克牌做到了这一点。对于那些不直接玩的人,每副牌由5张牌组成,增量为1。A可以是高牌也可以是低牌。我创建了一个名为card的对象,它具有花色、等级和价值(J=11、Q=12等)。我的方法将传递一个包含7张牌(底牌和棋盘)的对象列表。另一件要记住的事情是,如果玩家有5或10,他们只能直走。请参阅下文了解我针对其他扑克手牌的方法,如果您知道直接方法,请告诉我。伪代码也无所谓。publicboolCheckPair(Listcards){//查看两张牌是否完全相同。返回cards.GroupBy(card=>card.Rank).Count(group=>group.Count()==2)==1;}publicboolCheckTwoPair(Listcards){//查看是否有2批恰好2张相同等级的牌。返回cards.GroupBy(card=>card.Rank).Count(group=>group.Count()>=2)==2;}publicboolCheckTrips(Listcards){//查看是否恰好有3张卡片排名相同。返回cards.GroupBy(card=>card.Rank).Any(group=>group.Count()==3);}publicboolCheckStraight(Listcards){//按降序排列以查看顺序varcardsInOrder=cards.OrderByDescending(a=>a.Value).ToList();//检查ace的高低if(cardsInOrder.First().Rank=="A"){//检查带有ace的顺子是否有2个值boolhighStraight=cards.Where(a=>a.Rank=="K"||a.Rank=="Q"||a.Rank=="J"||a.Rank=="10").Count()==4;boollowStraight=cards.Where(a=&g吨;a.Rank=="2"||a.Rank=="3"||a.Rank=="4"||a.Rank=="5").Count()==4;//如果顺子有ace则返回trueif(lowStraight==true||highStraight==true){returntrue;}}else{//在这里直接检查returntrue;}//如果到达这里就没有直线。返回假;}publicboolCheckFlush(Listcards){//查看是否有5张或更多张卡片相同等级。返回cards.GroupBy(card=>card.Suit).Count(group=>group.Count()>=5)==1;}publicboolCheckFullHouse(Listcards){//检查trips和pair是否为真returnCheckPair(cards)&&CheckTrips(cards);}publicboolCheckQuads(Listcards){//查看是否恰好有4张卡片排名相同。返回cards.GroupBy(card=>card.Rank).Any(group=>group.Count()==4);}//需要检查相同的5张牌publicboolCheckStraightFlush(Listcards){//检查同花顺和顺子是否为真。返回CheckFlush(卡片)&&CheckStraight(卡片);}这可能不是性能力最好的检查,但我会说它非常容易读,通通常是一个很好的属性,只需抓取5张卡片,跳过您已经在每次迭代中查看过的卡片,并检查每个序列的直线。如果有序序列不包含双打并且第一张和最后一张牌之间的差为5,则它是直的。publicboolCheckStraight(Listcards){//为了性能,可能首先检查5和10varordered=cards.OrderByDescending(a=>a.Value).ToList();for(i=0;ifiveOrderedCards){vardoubles=cards.GroupBy(card=>card.Rank).Count(group=>group.Count()>1);varinARow=cards[4]-cards[0]=5;//A为0return!doubles&&inARow;我对Glubus的回答做了一个小改动。下面的代码可以完成这项工作,但您必须手动检查轮子(A、1、2、3、4、5)。publicboolCheckStraight(Listcards){//为了性能可能先检查5和10varordered=cards.OrderByDescending(a=>a.Value).ToList();对于(vari=0;icards){returncards.GroupBy(card=>card.Value).Count()==cards.Count()&&cards.Max(card=>(int)card.Value)-cards.Min(card=>(int)card.Value)==4;}好吧,functionboolIsStraight(IEnumerablecards){varorderedCards=cards.OrderBy(n=>n).ToList();vartest=orderdCards.Zip(orderdCards.Skip(1),(a,b)=>b-a);变量计数=0;foreach(varnintest){if(n==1){count++;如果(计数==4){返回真;}}else{计数=0;}}返回假;我想不出真正的课堂回合,因为A可能是1或14,但这应该没问题:intc=5;//有多少张牌boolAis1=cards.OrderBy(a=>a.Value).Select((i,j)=>i.Value-j).Distinct().Skip(1).Count()(a.Value==1?14:a.Value)).Select((i,j)=>(i.Value==1?14:i.Value)-j).Distinct().Skip(1).Count()(更新-感谢Janne,我已经修复了代码)以上是C#学习教程:c#直请查看德州扑克分享的所有内容。如果对您有用,需要了解更多C#学习教程,希望您多加关注---本文收集自网络,不代表立场。如涉及侵权请点击维权联系管理员删除如需转载请注明出处: