用PHP实现一个关于德州扑克算法的程序(三):顺子
2017-04-16 08:06
260 查看
用上一篇文章的算法已经可以解决大部分牌型的计算,但是还缺少另外一种牌型的计算,那就是顺子。
顺子的特点是至少有5张点数连续的牌面,而且输入的数据是字母与数字混合的数组,不利于排序。因此必须对这样的情况进行转换:
经过转换后再进行相应的排序计算,计算之后,又必须按照相反的途径把转换之后的数据再转换回来:
然后再开始写判断顺子的主要代码:
顺子的特点是至少有5张点数连续的牌面,而且输入的数据是字母与数字混合的数组,不利于排序。因此必须对这样的情况进行转换:
function pointToNum($arr){ $num=0; //统计在这副牌型中点数为数字的情况,从而判断A是做14合适还是作1合适 foreach($arr as $p){ if(!is_numeric($p)) $num++; } foreach($arr as $p){ switch($p){ case "A": if($num>=5){ $poi[]=14; }else{ $poi[]=1;//A还可以作为1使用 } break; case "K": $poi[]=13; break; case "Q": $poi[]=12; break; case "J": $poi[]=11; break; case "T": $poi[]=10; break; default: $poi[]=$p; break; } } return $poi; }
经过转换后再进行相应的排序计算,计算之后,又必须按照相反的途径把转换之后的数据再转换回来:
function numToPoint($arr){ foreach($arr as $p){ switch($p){ case "14": case "1": $poi[]="A"; break; case "13": $poi[]="K"; break; case "12": $poi[]="Q"; break; case "11": $poi[]="J"; break; case "10": $poi[]="T"; break; default : $poi[]=$p; } } return $poi; }
然后再开始写判断顺子的主要代码:
function isStraight($cards){ //只取出点数,不需要花色 foreach($cards as $c){ $point.=$c[1]; } //把由点数组成的字符串转换为数组,并且去掉其中重复的元素 $po=array_unique(str_split($point)); //经过去重的数组如果元素少于5个,那么就已经没有达到顺子至少5张不同牌组成的基本条件 if(count($po)<5){ return false; }else{ //把字母点数全部转换成容易排序的数字点数 $po=pointToNum($po); //倒序排序 arsort($po); //重新索引数组 $a1=array_values($po); //设置一个变量j。按照顺序计算两个相邻元素是否符合顺子的情况,即元素i与元素i+1是否相差为1。如果是则j+1,如果不是则j-1,但是j不小于0。当j累加到4时,说明顺子的情况满足了,则返回这个由顺子组成的数组 $j=0; for($i=1;$i<count($a1);$i++){ //判断相邻元素的差值是否为1 if($a1[$i]==$a1[$i-1]-1){ $j++; //如果两个元素相差为1,则同时取出两个元素放入一个新数组 $a2[]=array_search($a1[$i-1],$po); $a2[]=array_search($a1[$i],$po); //当j==4时,则说明已经符合了顺子的条件可以取出顺子数组,而且由于采用的是倒序排序,所以这个顺子必然是牌型中最大的顺子 if($j==4){ $a2=array_unique($a2);//去掉重复值 $a2=array_values($a2);//重建索引 $a2=array_slice($a2,0,5);//取出5个元素 for($i=0;$i<count($a2);$i++){ $result[]=$po[$a2[$i]]; } break; } }else{ //在判断过程中,一旦发现相邻元素差值为1的情况有变化,则j立即减1 $j=$j==0?0:--$j; } } //把数字点数再转换回字母点数 $arr=numToPoint($result); return $arr; } }
相关文章推荐
- 用PHP实现一个关于德州扑克算法的程序(二):排序
- 用PHP实现一个关于德州扑克算法的程序(一):发牌
- 用PHP实现一个关于德州扑克算法的程序(四):代码
- 关于怎么让多个程序搭建在一个服务器上,搭建一个适合与架构师使用的开发与实现环境
- 关于用栈链表来实现中序表达式的一个小程序 《数据结构》
- 关于实现Comparable接口的一个小程序
- 一个跟操作系统linux和windows差异有关的问题:通过soap的无wsdl实现php程序通信的程序(经典的吐血)
- 一个好玩的jq+php实现转盘抽奖程序
- 一个好玩的jq+php实现转盘抽奖程序
- 借助 数组 实现一个关于大整数乘法的 c 程序
- 关于统计的一个sql问题,使用动态sql语句实现。
- 采用C++的ACE库实现的一个通用的C/S架构通信程序(最终版)
- 发现一个很奇怪的现象--关于VB程序的内存占用
- PHP实现自动刷数/灌水程序
- 基于AjaxHelper0.41的相册范例程序演示及一个关于博客园的功能建议
- 今天我感冒了,但是却还要完成一个flash PHP+MYSQL整站程序
- 安全防范基础:关于电脑木马程序隐藏一个的新方法
- 第一次真正意义上的用VC++实现的一个完整的Win32程序-俄罗斯方块
- 基于AjaxHelper0.41的相册范例程序演示及一个关于博客园的功能建议
- 求助 用java写一个实现键盘功能按钮的小程序