扎金花游戏 PHP 实现代码之大小比赛

程序离不开算法,在前面的博客当中,其实我们已经讨论过寻路的算法。不过,当时的示例图中,可选的路径是唯一的。我们挑选一个算法,就是说要把这个唯一的路径选出来,怎么选呢?

还记得上初中的时候经常下午放学就躲在路边扎金花来赌*钱,貌似还上瘾了,现在过年的时候还经常一起扎金花赌*钱,但运气不啥好,每次都是输啊。

今天阳光明媚,由于清明节才出去玩了,所以今天没有去哪。闲着没事就想了下怎么用程序实现金花中两幅牌的大小比较,现在把它实现了,有些方法还是蛮重要的,因此就记下来。

好了,不废话了。

扎金花两副牌的比较规则就不说了,注明一下是顺子的时候 : JQK < A23 < QKA

思路:扎金花(http://www.a8u.net/)

1" 随机生成两幅牌,每副牌结构为

[php] view plaincopyprint?
  1. array(
  2. array('Spade','K'),
  3. array('Club','6'),
  4. array('Spade','J'),
  5. )
array(array('Spade','K'),array('Club','6'),array('Spade','J'),
)

2” 计算每副牌的分值:每副牌有个原始大小(即排除对子,顺子,金花,顺金,筒子的大小),再

每张牌的分值为一个2位数,不足2位的补前导0,例如'A':14,‘10’:10,’2‘:’02‘,’k‘:13,’7‘:07

将3张牌按点数大小排序(从大到小),凑成一个6位数。例如’A27':140702,‘829’:090802,‘JK8’:131108,‘2A10’:141002

例外,对于对子要将对子的位数放在前两位(后面会看到为什么这么做)。例如‘779’:070709,‘7A7’:070714,‘A33’:030314

现在的分值是一个6位数,将对子设为一个原始值加上10*100000的值,现在为一个7位数。例如‘779’:1070709,‘7A7’:1070714,‘A33’:1030314

对于顺子,将结果加上20*100000.。例如‘345’:2050403,‘QKA’:2141312,‘23A’:2140302

对于金花,将结果加上30*100000。例如‘Spade K,Spade 6,Spade J':3131106

因为顺金的时候其实是金花和顺子的和,所以顺金应该是50*10000。 例如‘Spade 7,Spade 6,Spade 8':5080706

对于筒子,将结果加上60*100000。例如’666‘:6060606,’JJJ‘:6111111

3“ 比较两幅牌的大小(用所计算的分值来比较)

就这么简单!!

代码如下(PHP)

[php] view plaincopyprint?
  1. <?php
  2. class PlayCards
  3. {
  4. public $suits = array('Spade', 'Heart', 'Diamond', 'Club');
  5. public $figures = array('2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A');
  6. public $cards = array();
  7. public function __construct()
  8. {
  9. $cards = array();
  10. foreach($this->suits as $suit){
  11. foreach($this->figures as $figure){
  12. $cards[] = array($suit,$figure);
  13. }
  14. }
  15. $this->cards = $cards;
  16. }
  17. public function getCard()
  18. {
  19. shuffle($this->cards);
  20. //生成3张牌
  21. return array(array_pop($this->cards), array_pop($this->cards), array_pop($this->cards));
  22. }
  23. public function compareCards($card1,$card2)
  24. {
  25. $score1 = $this->ownScore($card1);
  26. $score2 = $this->ownScore($card2);
  27. if($score1 > $score2) return 1;
  28. elseif($score1 < $score2) return -1;
  29. return 0;
  30. }
  31. private function ownScore($card)
  32. {
  33. $suit = $figure = array();
  34. foreach($card as $v){
  35. $suit[] = $v[0];
  36. $figure[] = array_search($v[1],$this->figures)+2;
  37. }
  38. //补齐前导0
  39. for($i = 0; $i < 3; $i++){
  40. $figure[$i] = str_pad($figure[$i],2,'0',STR_PAD_LEFT);
  41. }
  42. rsort($figure);
  43. //对于对子做特殊处理
  44. if($figure[1] == $figure[2]){
  45. $temp = $figure[0];
  46. $figure[0] = $figure[2];
  47. $figure[2] = $temp;
  48. }
  49. $score = $figure[0].$figure[1].$figure[2];
  50. //筒子 60*100000
  51. if($figure[0] == $figure[1] && $figure[0] == $figure[2]){
  52. $score += 60*100000;
  53. }
  54. //金花 30*100000
  55. if($suit[0] == $suit[1] && $suit[0] == $suit[2]){
  56. $score += 30*100000;
  57. }
  58. //顺子 20*100000
  59. if($figure[0] == $figure[1]+1 && $figure[1] == $figure[2]+1 || implode($figure) =='140302'){
  60. $score += 20*100000;
  61. }
  62. //对子 10*100000
  63. if($figure[0] == $figure[1] && $figure[1] != $figure[2]){
  64. $score += 10*100000;
  65. }
  66. return $score;
  67. }
  68. }
  69. //test
  70. $playCard = new PlayCards();
  71. $card1 = $playCard->getCard();
  72. $card2 = $playCard->getCard();
  73. $result = $playCard->compareCards($card1,$card2);
  74. echo 'card1 is ',printCard($card1),'<br/>';
  75. echo 'card2 is ',printCard($card2),'<br/>';
  76. $str = 'card1 equit card2';
  77. if($result == 1) $str =  'card1 is larger than card2';
  78. elseif($result == -1) $str = 'card1 is smaller than card2';
  79. echo $str;
  80. function printCard($card)
  81. {
  82. $str = '(';
  83. foreach($card as $v){
  84. $str .= $v[0].$v[1].',';
  85. }
  86. return trim($str,',').')';
  87. }
<?php
class PlayCards
{public $suits = array('Spade', 'Heart', 'Diamond', 'Club');public $figures = array('2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A');public $cards = array();public function __construct(){$cards = array();foreach($this->suits as $suit){foreach($this->figures as $figure){$cards[] = array($suit,$figure);}}$this->cards = $cards;}public function getCard(){shuffle($this->cards);//生成3张牌return array(array_pop($this->cards), array_pop($this->cards), array_pop($this->cards));    }public function compareCards($card1,$card2){$score1 = $this->ownScore($card1);$score2 = $this->ownScore($card2);if($score1 > $score2) return 1;elseif($score1 < $score2) return -1;return 0;     }private function ownScore($card){$suit = $figure = array();foreach($card as $v){$suit[] = $v[0];$figure[] = array_search($v[1],$this->figures)+2;}//补齐前导0for($i = 0; $i < 3; $i++){$figure[$i] = str_pad($figure[$i],2,'0',STR_PAD_LEFT);}rsort($figure);//对于对子做特殊处理if($figure[1] == $figure[2]){$temp = $figure[0];$figure[0] = $figure[2];$figure[2] = $temp;}$score = $figure[0].$figure[1].$figure[2];//筒子 60*100000if($figure[0] == $figure[1] && $figure[0] == $figure[2]){$score += 60*100000;}//金花 30*100000if($suit[0] == $suit[1] && $suit[0] == $suit[2]){$score += 30*100000;}//顺子 20*100000if($figure[0] == $figure[1]+1 && $figure[1] == $figure[2]+1 || implode($figure) =='140302'){$score += 20*100000;}//对子 10*100000if($figure[0] == $figure[1] && $figure[1] != $figure[2]){$score += 10*100000;}return $score;}
}//test
$playCard = new PlayCards();
$card1 = $playCard->getCard();
$card2 = $playCard->getCard();
$result = $playCard->compareCards($card1,$card2);echo 'card1 is ',printCard($card1),'<br/>';
echo 'card2 is ',printCard($card2),'<br/>';
$str = 'card1 equit card2';
if($result == 1) $str =  'card1 is larger than card2';
elseif($result == -1) $str = 'card1 is smaller than card2';
echo $str;function printCard($card)
{$str = '(';foreach($card as $v){$str .= $v[0].$v[1].',';}return trim($str,',').')';
}

扎金花游戏 PHP 实现代码之大小比赛相关推荐

  1. 扎金花 游戏开发细节与部分代码

    扎金花 游戏开发细节与部分代码,斗地主游戏中的牌型很多,算法也各有不同,但我总觉得网上一些通用的算法有点铺天盖地,所以,我决定自己来重新想一下算法,总的来说,无论你出什么处于,三带二,炸,4带一等,你 ...

  2. Python实现炸金花游戏的示例代码

    本文主要介绍了Python实现炸金花游戏的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下.编程学习资料点击领取. 今天的第二个作品,哈哈哈哈,搞起来感觉还挺 ...

  3. python基础练习(猜拳游戏、扎金花游戏、购物小程序)

    猜拳游戏 需求分析: * 使用面向对象和python的基础语法,运用简单的逻辑处理实现猜拳游戏 * 要求游戏可以多次玩耍 * 要求统计分数 * 要求可以选择角色 # 玩家自己的类, class Own ...

  4. JAVA学习练习(扎金花与21点)

    目前转行学习JAVA.记得N年学过C++,接触JAVA后感觉上手比较容易.学习半月熟练使用循环.判断,自行看书了解JAVA类的使用,并尝试用类完成编程.大概完成了老师题目,类和方法用得很混乱,但是总归 ...

  5. XMPP 扎金花各种网络传送之音频发送

     XMPP各种网络传送开发,一个好的扎金花游戏需要高强度的网络传输支持,音频的发送,与之前图片的发送,有一定的相似,也有一些不同.音频发送的核心思想,是按下按钮开始录音,松开手结束录音并且保存录音 ...

  6. 纸牌游戏扎金花的牌大小比较(PHP)

    还记得上初中的时候经常下午放学就躲在路边扎金花来赌钱,貌似还上瘾了,现在过年的时候还经常一起扎金花赌钱,但运气不啥好,每次都是输啊. 今天阳光明媚,由于清明节才出去玩了,所以今天没有去哪.闲着没事就想 ...

  7. 详细的Python炸金花游戏代码

    ** 详细的Python炸金花游戏代码 ** 觉得有用请点个赞吧 #!/usr/bin/env python # -*- coding: utf-8 -*- ''' # @Time: 2022/07/ ...

  8. 扎金花大小比较算法(Java版)

    注:以下算法说明仅限一副牌(不包含大小王)的情况 1.扎金花规则说明(大家都懂的,这里做简单描述): 1)玩家每人3张牌: 2)牌面大小2.3.4.5.6.7.8.9.10(用T表示),J.Q.K.A ...

  9. 闲来无事,写一款扎金花小游戏,先练练手,打的时候好赢钱

    大年三十我坐庄,大年初一就背井离乡 众所 周知扑克牌可谓是居家旅行.桌面交友的必备道具,今天我们用 Python 来实现一个类似炸金花 的扑克牌小游戏,先来看一下基本的游戏规则. 炸(诈)金花又叫三 ...

最新文章

  1. ARM-Linux与嵌入式开发
  2. oracle 清理定期备份文件,RAC RMAN定期备份及删除脚本
  3. APP模拟手势高级操作
  4. 通往奥格瑞玛的道路(洛谷 1462)
  5. 上大学了,但学校一般,该怎么办?
  6. WebBenchmark动态测试Webapi
  7. WINCE 加入驱动DLL步骤
  8. 常微分方程第三版_常微分方程:(第六章)非线性微分方程:5节
  9. Java21天打卡Day6-switch
  10. python版本差异_npm install报错,不知道是系统差异还是node版本差异,跟python有关系?...
  11. 允许远程访问MySQL的设置
  12. Solr进阶之Solr综合文本相似度的多因素权重排序实现
  13. linux 7.4ip配置,新手进阶 Ubuntu7.10中配置IP地址
  14. 高性能MYSQL(查询优化)
  15. qq空间不能访问解决方法
  16. Xshell7的下载和安装
  17. 虫子满屏爬_三bug多线程示例程序浅析
  18. Jenkins简介与应用
  19. MATLAB仿真斜坡信号的校正,控制系统仿真matlab第六章习题答案.doc
  20. 钩陈/ 为什么会忍不住复训蟒营™

热门文章

  1. 怎么运行java虚拟机_Java代码如何运行在Java虚拟机中
  2. linux wifi pro6818,GEC6818连接Ubuntu,下载程序至开发板
  3. oracle 分页_80分页查询,不止写法
  4. python函数模块_06.Python函数和模块
  5. 2022年中国酒店业数字化转型趋势报告
  6. 分支和循环结构的应用(习题)
  7. ec200t 拨号_移远EC20 R2.0 AT指令拨号流程
  8. springmvc的主要功能_Spring MVC入门
  9. 专题:区块链与数据共享(上)
  10. 【Java】Date类和Calendar类必知必会