java中使用几率_Java中使用蒙特卡洛算法计算德州扑克成牌概率(二)- 计算牌面分值...

德州扑克中比较重要的一个算法就是计算牌面的得分,不仅仅关乎概率计算的结果,同时也需要很高的性能。蒙特卡洛算法计算的次数越多结果越准确,因此算法的性能至关重要。下面是一个高性能的牌面java计算算法。

参数介绍:

1)cards 需要计算分值的牌

2) nCards 需要计算牌的张数public static int evaluate(long cards, int nCards) {

int retval = 0, four_mask, three_mask, two_mask;

//本函数支持1-7张牌的计算

//按照牌色分开

int sc = (int) ((cards >> (CLUB_OFFSET)) & 0x1fffL);

int sd = (int) ((cards >> (DIAMOND_OFFSET)) & 0x1fffL);

int sh = (int) ((cards >> (HEART_OFFSET)) & 0x1fffL);

int ss = (int) ((cards >> (SPADE_OFFSET)) & 0x1fffL);

int ranks = sc | sd | sh | ss;

int n_ranks = nBitsTable[ranks];

int n_dups = ((int) (nCards - n_ranks));

//检查顺子、同花、同花顺并返回最佳牌面得分

if (n_ranks >= 5) {

if (nBitsTable[ss] >= 5) {

if (straightTable[ss] != 0)

return HANDTYPE_VALUE_STRAIGHTFLUSH + (int) (straightTable[ss] <

else

retval = HANDTYPE_VALUE_FLUSH + topFiveCardsTable[ss];

} else if (nBitsTable[sc] >= 5) {

if (straightTable[sc] != 0)

return HANDTYPE_VALUE_STRAIGHTFLUSH + (int) (straightTable[sc] <

else

retval = HANDTYPE_VALUE_FLUSH + topFiveCardsTable[sc];

} else if (nBitsTable[sd] >= 5) {

if (straightTable[sd] != 0)

return HANDTYPE_VALUE_STRAIGHTFLUSH + (int) (straightTable[sd] <

else

retval = HANDTYPE_VALUE_FLUSH + topFiveCardsTable[sd];

} else if (nBitsTable[sh] >= 5) {

if (straightTable[sh] != 0)

return HANDTYPE_VALUE_STRAIGHTFLUSH + (int) (straightTable[sh] <

else

retval = HANDTYPE_VALUE_FLUSH + topFiveCardsTable[sh];

} else {

int st = straightTable[ranks];

if (st != 0)

retval = HANDTYPE_VALUE_STRAIGHT + (st <

}

//如果没有更好的牌(如:金刚、葫芦)直接返回得分

if (retval != 0 && n_dups 

return retval;

}

//继续检查其他牌型

switch (n_dups) { //相同牌的数量

case 0:

//高牌

return HANDTYPE_VALUE_HIGHCARD + topFiveCardsTable[ranks];

case 1: {

//一对

int t, kickers;

two_mask = ranks ^ (sc ^ sd ^ sh ^ ss);

retval = (int) (HANDTYPE_VALUE_PAIR + (topCardTable[two_mask] <

t = ranks ^ two_mask;

//计算对牌的分数

kickers = (topFiveCardsTable[t] >> CARD_WIDTH) & ~FIFTH_CARD_MASK;

retval += kickers;

return retval;

}

case 2:

// 2对或者三条

two_mask = ranks ^ (sc ^ sd ^ sh ^ ss);

if (two_mask != 0) { //2对

int t = ranks ^ two_mask;

retval = (int) (HANDTYPE_VALUE_TWOPAIR

+ (topFiveCardsTable[two_mask] & (TOP_CARD_MASK | SECOND_CARD_MASK)) + (topCardTable[t] <

return retval;

} else { //三条

int t, second;

three_mask = ((sc & sd) | (sh & ss)) & ((sc & sh) | (sd & ss));

retval = (int) (HANDTYPE_VALUE_TRIPS + (topCardTable[three_mask] <

t = ranks ^ three_mask; /** Only one bit set in three_mask */

second = topCardTable[t];

retval += (second <

t ^= (1 <

retval += (int) (topCardTable[t] <

return retval;

}

default: //可能是葫芦、金刚、顺子、同花、或者2对

four_mask = sh & sd & sc & ss;

if (four_mask != 0) { //金刚

int tc = topCardTable[four_mask];

retval = (int) (HANDTYPE_VALUE_FOUR_OF_A_KIND + (tc <

^ (1 <

return retval;

}

/**

* Technically, three_mask as defined below is really the set of bits which are set in three or four of the

* suits, but since we've already eliminated quads, this is OK

*/

/**

* Similarly, two_mask is really two_or_four_mask, but since we've already eliminated quads, we can use this

* shortcut

*/

two_mask = ranks ^ (sc ^ sd ^ sh ^ ss);

if (nBitsTable[two_mask] != n_dups) {

//葫芦

int tc, t;

three_mask = ((sc & sd) | (sh & ss)) & ((sc & sh) | (sd & ss));

retval = HANDTYPE_VALUE_FULLHOUSE;

tc = topCardTable[three_mask];

retval += (tc <

t = (two_mask | three_mask) ^ (1 <

retval += (int) (topCardTable[t] <

return retval;

}

if (retval != 0) // 顺子或同花

return retval;

else {

// 2对

int top, second;

retval = HANDTYPE_VALUE_TWOPAIR;

top = topCardTable[two_mask];

retval += (top <

second = topCardTable[two_mask ^ (1 <

retval += (second <

retval += (int) ((topCardTable[ranks ^ (1 <

return retval;

}

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429791.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu14.04 upgrade出现【Ubuntu is running in low-graphics mode】问题的一个解决办法

在ubuntu14.04上安装docker的时候&#xff0c;由于眼花没看清下图这句话&#xff1a; 直接执行了sudo apt-get upgrade命令。然后发生了一个悲剧&#xff01; 重启后出现下面这个错误&#xff01; 而且在点击OK进入下一步后&#xff0c;再也无法选中其他的配置选项……当时我就…

java 类及对象的课后作业_JAVA类和对象课后作业

1.使用类的静态字段和构造函数&#xff0c;我们可以跟踪某个类所创建对象的个数。请写一个类&#xff0c;在任何时候都可以向它查询“你已经创建了多少个对象&#xff1f;”代码&#xff1a;//显示类//YiMingLai 2016.10.19public class lei {/*** param args*/public static v…

正则表达式二探

什么是正则表达式。 简单说就是按照某种规则匹配符合条件的字符串。 通配符&#xff1a;* https://regexper.com/在线测试正则表达网址。 转载于:https://www.cnblogs.com/tuoxiong/p/6148037.html

java 怎么用 string method return数量_java教程之Map应该怎么用

java教程之Map应该怎么用在自学或者看java教程的时候&#xff0c;大家多多少少都存在着这样或者那样的疑惑&#xff0c;对于这些中软国际小编一直也在整理&#xff0c;今天为大家献上的是关于Map应该怎样去用的一些方法&#xff0c;还是跟过去一样&#xff0c;在这里&#xff0…

使用 ExecuteMultiple 提高批量数据加载的性能

您可以使用 ExecuteMultipleRequest 消息在 Microsoft Dynamics CRM Online 2016 Update 和 Microsoft Dynamics CRM 2016&#xff08;本地&#xff09; 中&#xff08;尤其在 Internet 延迟可能是最大限制因素的 Microsoft Dynamics CRM Online 中&#xff09;支持更高吞吐批量…

安装ODIS报错 java_(实用技术)大众奥迪ODIS常见问题处理方法

我们在平时使用ODIS过程中常常会遇到一下问题&#xff0c;导致我们不知道应该怎么处理。今天这篇文章中我们将陈列一些常见的问题解答&#xff0c;希望对大家有帮助。一、BCM(BFM)的引导型功能不能用解决方案如果桑塔纳&#xff0c;Rapid&#xff0c;新polo等车型遇到BCM(BFM)的…

gulp入坑系列(1)——安装gulp

前言 好吧&#xff0c;我承认我是为了搞定Sass编译CSS文件的问题&#xff0c;迷一样的着手入gulp的坑&#xff0c;sass和gulp的爬坑历程大概会一起更新。然后感觉这里windows和mac的流程差不多&#xff0c;不过mac的通常在指令前加sudo &#xff0c;本喵是windows的本本&#x…

java中的sql语句书写_Java中sql语句之通配符*

在java中执行SQL语句要特别注意通配符的问题&#xff0c;否则是不会成功的&#xff1a;在ACCESS中的通配符是*例&#xff1a;select * from student where name like 张*在标准的SQL语言中的通配符是%例&#xff1a;select * from student where name like 张%在java…

Oracle 数据库中对记录进行分页处理

学习到 oracle 的视图的时候&#xff0c;了解到对 Oracle 中数据的记录进行分页处理和 Mysql 提供的 limit 来进行分页处理大有不同&#xff0c;limit 是 mysql 中特有的关键字。 那么在 oracle 中如何实现对记录的分页处理呢&#xff1f; 解决办法&#xff1a;使用 ROWNUM 1.…

python中split啥意思_python中split的用法详解_后端开发

如何用python正则表达式匹配字符串&#xff1f;_后端开发用python正则表达式匹配字符串的方法&#xff1a;1、当匹配单个位置的字符串时&#xff0c;可以使用【(.?)】正则表达式来提取&#xff1b;2、当连续多个位置的字符串匹配时&#xff0c;可以使用【?P…】这个正则表达式…

sublimeText OmniMarkupPreviewer 404

这个错误也是出现的莫名奇妙。 "Error: 404 Not Found Sorry, the requested URL http://127.0.0.1:51004/view/29 caused an error:buffer_id(29) is not valid (closed or unsupported file format)NOTE: If you run multiple instances of Sublime Text, you may want …

python写的程序怎么打包成exe_python--- 如何将自己的程序打包成exe ?

最近用python Tkinter 写了一个看stock的小工具.. . 把它调节成半透明悬浮 你懂得但是每次总用pycharm 或者调python去加载使用多少有些不便&#xff0c;如何打包成exe成了问题。百度一下找了 pyinstaller 感觉使用起来还不错。步骤如下&#xff1a;1.官网下载对应的pyins…

spring定时器,定时器一次执行两次的问题

Spring 定时器 方法一&#xff1a;注解形式 配置文件头加上如下&#xff1a; xmlns:task"http://www.springframework.org/schema/task"http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd 需要 quartz 包 &l…

python处理实例_python处理xml实例

"""Author zyhFileName read_xml_1.pyTime 18-9-26 下午5:19"""from xml.etree import ElementTreeimport ospath (/home/zyh/Desktop/xml17)xml_file_list os.listdir(path)print(xml_file_list)read_list []with open(./riskCar_pic.txt…

SQLite For .Net 已经整合了32位和64位

以前引用SQLite.DLL的时候&#xff0c;如果是winform等桌面程序&#xff0c;还要分32位和64位不一样的DLL&#xff0c;但最近已经整合为一个包了 打开vs的程序包管理器控制器&#xff0c;输入&#xff1a; install-package system.data.sqlite 自动安装即可。 转载于:https:/…

21天通关python 磁力_python 磁力链接搜索器

标签&#xff1a;API作者的 原文 &#xff1a; http://blog.163.com/lixiangqiu_9202/blog/static/535750372014370156424/我看到这个API之后第一个想法就是用python写个小玩意儿1 importrequests2 importjson3 importos4 importcodecs5 importsys67 sys.setrecursionlimit(100…

Java名字的由来

Java语言的历程丰富多彩&#xff0c;被现在众多程序员和企业广泛使用&#xff0c;不用质疑这是Java的领先技术的结果。 Java是Sun公司开发的一种编程语言&#xff0c;Sun公司最初的方向是让Java来开发一些电器装置程序&#xff0c;如&#xff1a;机顶盒、公交卡&#xff0c;Sun…

java socket 重连复用_Java Socket编程基础及深入讲解(示例代码)

Socket是Java网络编程的基础&#xff0c;了解还是有好处的&#xff0c;这篇文章主要讲解Socket的基础编程。Socket用在哪呢&#xff0c;主要用在进程间&#xff0c;网络间通信。本篇比较长&#xff0c;特别做了个目录&#xff1a;一、Socket通信基本示例这种模式是基础&#xf…

Leetcode 279. Perfect Square

Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...) which sum to n. For example, given n 12, return 3 because 12 4 4 4; given n 13, return 2 because 13 4 9. 这道题首先想到的算法是DP。每个perfec…

php文件解锁,php文件锁怎么用

php文件锁怎么用PHP出现文件锁与mysql表锁有大概想的用法,就是同一时间只能让一个人操作,这样就避免了同时有多个人操作同一文件,这样导致数据丢失的情况了。以下是小编为大家搜索整理的PHP文件锁怎么用&#xff0c;希望能给大家带来帮助!更多精彩内容请及时关注我们应届毕业生…