今天同事发来了一个炸金花的PHP程序,这个代码实现了两个人通过各自的三张牌进行权重计算,得到分数进行比较得到谁的牌大,我觉得里面还有一些问题,代码如下:

  1. <?php
  2. /**
  3. 每张牌的分值为一个2位数,不足2位的补前导0,例如'A':14,‘10':10,'2‘:'02‘,'k‘:13,'7‘:07
  4. 将3张牌按点数大小排序(从大到小),凑成一个6位数。例如'A27':140702,‘829':090802,‘JK8':131108,‘2A10':141002
  5. 例外,对于对子要将对子的位数放在前两位(后面会看到为什么这么做)。例如‘779':070709,‘7A7':070714,‘A33':030314
  6. 现在的分值是一个6位数,将对子设为一个原始值加上10*100000的值,现在为一个7位数。例如‘779':1070709,‘7A7':1070714,‘A33':030314
  7. 对于顺子,将结果加上20*100000.。例如‘345':2050403,‘QKA':2141312,‘23A':2140302
  8. 对于金花,将结果加上30*100000。例如‘Spade K,Spade 6,Spade J':3131106
  9. 因为顺金的时候其实是金花和顺子的和,所以顺金应该是50*10000。 例如‘Spade 7,Spade 6,Spade 8':5080706
  10. 对于筒子,将结果加上60*100000。例如'666‘:6060606,'JJJ‘:6111111
  11. */
  12. class PlayCards{
  13. public $suits = ['Spade','Heart','Diamond','Club'];// spades 黑桃 hearts 红桃 clubs 草花/梅花 diamonds 方片
  14. public $figures = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'];
  15. public $cards = [];
  16.  
  17. public function __construct(){
  18. $cards = [];
  19. foreach($this->suits as $suit){
  20. foreach($this->figures as $figure){
  21. $cards[] = [$suit,$figure];
  22. }
  23. }
  24. $this->cards = $cards; //初始化一副扑克
  25. }
  26.  
  27. public function getCard(){
  28. shuffle($this->cards); //洗牌
  29. return [
  30. array_pop($this->cards),
  31. array_pop($this->cards),
  32. array_pop($this->cards),
  33. ];//取出三张牌
  34. }
  35.  
  36. /**
  37. * @param $card1
  38. * @param $card2
  39. * 比较两个人的牌
  40. */
  41. public function compareCards($card1,$card2){
  42. $score1 = $this->ownScore($card1);
  43. $score2 = $this->ownScore($card2);
  44. if($score1>$score2){
  45. return 1;
  46. }elseif($score1<$score2){
  47. return -1;
  48. }else{
  49. return 0;
  50. }
  51. }
  52.  
  53. /**
  54. * @param $card
  55. * @return int|string
  56. * 处理牌型
  57. */
  58. public function ownScore($card){
  59. $suit = [];$figure = [];
  60. foreach($card as $v){
  61. $suit[] = $v[0];
  62. $figure[] = array_search($v[1],$this->figures)+2;//从$this->figures中搜索出值为$v[1]的键,并将结果+2
  63. }
  64.  
  65. //补齐前导0
  66. for($i = 0; $i < 3; $i++){
  67. $figure[$i] = str_pad($figure[$i],2,'0',STR_PAD_LEFT);
  68. }
  69.  
  70. rsort($figure); //将元素降序排序
  71.  
  72. //对于对子做特殊处理
  73. if($figure[1] == $figure[2]){
  74. $temp = $figure[0];
  75. $figure[0] = $figure[2];
  76. $figure[2] = $temp;
  77. }
  78. $score = $figure[0].$figure[1].$figure[2];
  79. //豹子 60*100000
  80. if($figure[0] == $figure[1] && $figure[0] == $figure[2]){
  81. $score += 60*100000;
  82. }
  83. //金花 30*100000
  84. if($suit[0] == $suit[1] && $suit[0] == $suit[2]){
  85. $score += 30*100000;
  86. }
  87. //顺子 20*100000
  88. if($figure[0] == $figure[1]+1 && $figure[1] == $figure[2]+1 || implode($figure) =='140302'){
  89. $score += 20*100000;
  90. }
  91. //对子 10*100000
  92. if($figure[0] == $figure[1] && $figure[1] != $figure[2]){
  93. $score += 10*100000;
  94. }
  95. return $score;
  96. }
  97. }
  98. $playCard = new PlayCards();
  99. $card1 = $playCard->getCard();
  100. $card2 = $playCard->getCard();
  101. var_dump($card1);
  102. var_dump($card2);
  103. $result = $playCard->compareCards($card1,$card2);
  104. echo $result;

品鉴同事发来的炸金花的PHP程序代码的更多相关文章

  1. 200行代码搞定炸金花游戏(PHP版)

    <?php/* * 游戏名称:炸金花(又名三张牌.扎金花) * 开发时间:2009.1.14 * 编 程:多菜鸟 * 来 源:http://blog.csdn.net/kingerq/archi ...

  2. XidianOJ 1044 炸金花

    题目描述 炸金花是一个风靡全球的扑克游戏,不少人因为这个游戏发了家,而更多的人则输得倾家荡产.为了帮助赌徒们戒掉它,现在决定派你去写一个程序,帮助赌徒们更好的认识这个游戏. 炸金花在这里被简化成这样一 ...

  3. 炸金花的JS实现从0开始之 -------现在什么都不会(1)

    新年结束了.回想起来唯一留下乐趣的就是在家和朋友玩玩炸金花. 遂有此文. 对不起,我这时候还没有思路. 让我捋一捋. ... ... 捋一捋啊... ... 好了.今天先这样吧: (1)先整理出所有的 ...

  4. 炸金花游戏(4)--炸金花AI基准测试评估

    前言: 本文将谈谈如何评估测试炸金花的AI, 其实这个也代表一类的问题, 德州扑克也是类似的解法. 本文将谈谈两种思路, 一种是基于基准AI对抗评估, 另一种是基于测试集(人工选定牌谱). 由于炸金花 ...

  5. 炸金花游戏(3)--基于EV(期望收益)的简单AI模型

    前言: 炸金花这款游戏, 从技术的角度来说, 比德州差了很多. 所以他的AI模型也相对简单一些. 本文从EV(期望收益)的角度, 来尝试构建一个简单的炸金花AI. 相关文章: 德州扑克AI--Prog ...

  6. 自己写的微信小程序炸金花简单版

    app.json: { "pages":[ "pages/index/index" ], "window":{ "navigati ...

  7. akoj-1222-炸金花

    炸金花 Time Limit:1000MS  Memory Limit:65536K Total Submit:40 Accepted:19 Description 炸金花是一个风靡全球的扑克游戏,喜 ...

  8. IOS本地化。

    1,项目名本地化 点击项目,蓝色图标->info 最下面+号,添加chinese本地化. Supporting Files->infoPlist.strings 下会有两个文件,有一个是设 ...

  9. 【Android病毒分析报告】 - ZxtdPay 吸费恶魔

    本文章由Jack_Jia编写,转载请注明出处.  文章链接:http://blog.csdn.net/jiazhijun/article/details/11581543 作者:Jack_Jia    ...

随机推荐

  1. mybatis动态sql中的两个内置参数(_parameter和_databaseId)

    mybatis动态sql中的两个内置参数(_parameter和_databaseId)   <!-- mybatis动态sql的两个内置参数           不只是方法传递过来的参数可以被 ...

  2. mongoimport 导入数据

    最后 利用mongodb自带的mongoimport工具可以上传csv文件 命令如下 mongoimport -h localhost --port 27017 -d test222 -c c21 - ...

  3. 微信小程序文字水平垂直居中对齐问题

    我们知道常用的居中对齐方式有很多种例如: text-align:center; align-items:center; justify-content: center; margin: auto; # ...

  4. js在IE与firefox的差别。。。

    1.firefox不能对innerText支持.firefox支持innerHTML但却不支持innerText,它支持textContent来实现innerText,不过默认把多余的空格也保留了.如 ...

  5. 【转】25个非常实用的jQuery/CSS3应用组件

    今天分享25款功能十分强大的jQuery/CSS3应用插件,欢迎收藏. 1.jQuery水晶样式下拉导航 这是一款非常不错的jQuery多功能下拉菜单插件,菜单外观呈水晶样式,晶莹剔透,功能丰富,包含 ...

  6. 7款开源ERP系统比较

    [网络转载] 现在有许多企业将ERP项目,在企 业中没有实施好,都归咎于软件产品不好.其实,这只是你们的借口.若想要将ERP软件真正与企业融合一体,首先得考虑企业的自身情况,再去选择适合的 ERP软件 ...

  7. "android.uid.systemandroid.view.InflateException: Binary XML file line #7: Error inflating class android.webkit.WebView

    在android源码中编译app通过,运行时出现错误: "android.uid.systemandroid.view.InflateException: Binary XML file l ...

  8. 第三百五十三节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy的暂停与重启

    第三百五十三节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy的暂停与重启 scrapy的每一个爬虫,暂停时可以记录暂停状态以及爬取了哪些url,重启时可以从暂停状态开始爬取过的UR ...

  9. Java如何显示不同格式的日期?

    在Java中,如何以不同的格式来显示日期? 此示例使用DateFormatSymbols().DateFormatSymbols类的getWeekdays()方法来显示时间的格式. package c ...

  10. sqlite学习笔记1:编译数据库

    首先说下我使用的是Linux环境 一 下载源代码 官网下载:点这里 二 编译 1 解压 下载完毕之后通常会在当前用户的"下载"文件夹中,首先cd到下载文件夹,然后创建一个文件件.用 ...