PHP中扎金花比大小如何实现

在棋牌游戏中,不管是现实的还是线上的,扎金花无疑是最热门棋牌游戏之一,鄙人从小就酷爱扎金花,机缘巧合后面从事了IT行业,话不多说,直接进去正题吧。

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

下面是个人一点建议,供大家参考!(有哪里不对的欢迎指教 棋牌平台开发: www.yasewl.com)

思路:扎金花

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

复制代码 代码如下:
array(
array('Spade','K'),
array('Club','6'),
array('Spade','J'),
)

复制代码 代码如下:
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
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;
}
//补齐前导0
for($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*100000
if($figure[0] == $figure[1] && $figure[0] == $figure[2]){
$score += 60*100000;
}
//金花 30*100000
if($suit[0] == $suit[1] && $suit[0] == $suit[2]){
$score += 30*100000;
}
//顺子 20*100000
if($figure[0] == $figure[1]+1 && $figure[1] == $figure[2]+1 || implode($figure) =='140302'){
$score += 20*100000;
}
//对子 10*100000
if($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
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;
}
//补齐前导0
for($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*100000
if($figure[0] == $figure[1] && $figure[0] == $figure[2]){
$score += 60*100000;
}
//金花 30*100000
if($suit[0] == $suit[1] && $suit[0] == $suit[2]){
$score += 30*100000;
}
//顺子 20*100000
if($figure[0] == $figure[1]+1 && $figure[1] == $figure[2]+1 || implode($figure) =='140302'){
$score += 20*100000;
}
//对子 10*100000
if($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. Senparc.Weixin.MP SDK 微信公众平台开发教程(二十一):在小程序中使用 WebSocket (.NET Core)

    本文将介绍如何在 .NET Core 环境下,借助 SignalR 在小程序内使用 WebSocket.关于 WebSocket 和 SignalR 的基础理论知识不在这里展开,已经有足够的参考资料, ...

  2. Senparc.Weixin.MP SDK 微信公众平台开发教程(十八):Web代理功能

    在Senparc.Weixin.dll v4.5.7版本开始,我们提供了Web代理功能,以方便在受限制的局域网内的应用可以顺利调用接口. 有关的修改都在Senparc.Weixin/Utilities ...

  3. Senparc.Weixin.MP SDK 微信公众平台开发教程(十七):个性化菜单接口说明

    前不久微信上线了个性化菜单接口,Senparc.Weixin SDK也已经同步更新. 本次更新升级Senparc.Weixin.MP版本到v13.5.2,依赖Senparc.Weixin版本4.5.4 ...

  4. Senparc.Weixin.MP SDK 微信公众平台开发教程(三):微信公众平台开发验证

    要对接微信公众平台的"开发模式",即对接到自己的网站程序,必须在注册成功之后(见Senparc.Weixin.MP SDK 微信公众平台开发教程(一):微信公众平台注册),等待官方 ...

  5. Senparc.Weixin.MP SDK 微信公众平台开发教程(五):使用Senparc.Weixin.MP SDK

    Senparc.Weixin.MP SDK已经涵盖了微信6.x的所有公共API. 整个项目的源代码以及已经编译好的程序集可以在这个项目中获取到:https://github.com/JeffreySu ...

  6. Senparc.Weixin.MP SDK 微信公众平台开发教程(六):了解MessageHandler

    上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(五):使用Senparc.Weixin.MP SDK>我们讲述了如何使用Senparc.Weixin.MP SDK ...

  7. Senparc.Weixin.MP SDK 微信公众平台开发教程(七):解决用户上下文(Session)问题

    从这篇文章中我们已经了解了微信公众平台消息传递的方式,这种方式有一个先天的缺陷:不同用户的请求都来自同一个微信服务器,这使得常规的Session无法使用(始终面对同一个请求对象,况且还有对方服务器Co ...

  8. Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明

    一.基础说明 这里说的“通用接口(CommonAPIs)”是使用微信公众账号一系列高级功能的必备验证功能(应用于开发模式). 我们通过微信后台唯一的凭证,向通用接口发出请求,得到访问令牌(Access ...

  9. Senparc.Weixin.MP SDK 微信公众平台开发教程(九):自定义菜单接口说明

    上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明>介绍了如何通过通用接口获取AccessToken,有了AccessToken,我们就可以来操作 ...

随机推荐

  1. django自定义simple_tag和filter

    1.自定义simple_tag: 1).在app目录名下创建templatetags目录,并新建__init__.py文件. 2).在templatetags目录下创建任意名字的py文件,例如rema ...

  2. UML类图新手入门级介绍(转)

    首先,看动物矩形框,它代表一个类(Class).类图分三层,第一层显示类的名称,如果是抽象类,则就用斜体显示.第二层是类的特性,通常就是字段和属性.第三层是类的操作,通常是方法或行为.前面的符号,+ ...

  3. 常用sql语句总结(一)(查询)

    常用sql语句总结(一)(查询) 数据操作语句:DML 数据定义语句:DDL 数据控制语句:DCL (执行顺序------序号) 一.基本查询: 1. SELECT * ----- 2 FROM 数据 ...

  4. Maven打war包命令

    https://jingyan.baidu.com/article/295430f1e7c4b30c7e005095.html clean compile package

  5. Bigger-Mai 养成计划,Python基础巩固三

    1.集合的基本操作(set)集合是一个无序的,不重复的元素集合,他的主要作用是去重:把一个列表变为集合就自动去重了.关系测试:测试两组数据之间的交集,差集,并集等关系 list_1 = [1,4,6, ...

  6. zabbix历史数据相关表研究

    zabbix历史数据相关表研究 history和trends相关表 history和trends都是存储历史数据的地方.一般是通过监控项(item)配置里.匹配更新监控项(item)和设置HouseK ...

  7. 从事三年java开发后, 我打算转人工智能

    作为一个2015年参加java培训,2016年计算机科学与技术本科毕业后一直从事java开发的程序员来说, 做出这一步真的不容易, 可是我没赶上java最火的时候,反而渐渐感受到了java的没落, 目 ...

  8. lambda 委托 匿名方法

    委托: delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate类能够拥有一个签名(signature),并且它只能持有与它的签名相匹配的方法的 ...

  9. C#操作Control异步工具类

    /// <summary> /// 异步工具类 /// </summary> public class TaskTools { /// <summary> /// ...

  10. Ansible 脚本运行一次后,再次运行时出现报错情况,原因:ansible script 的格式不对,应改成Unix编码

    Ansible 脚本运行一次后,再次运行时出现报错情况,原因:ansible  script 的格式不对,应改成Unix编码 find . -name "*" | xargs do ...