zoukankan      html  css  js  c++  java
  • 棋牌平台开发教程之扎金花大小比较算法在php中的实现

    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,',').')';
    }

     
    来源:https://www.cnblogs.com/bobpop/p/7238633.html
  • 相关阅读:
    关于celery踩坑
    关于git的分批提交pull requests流程
    SymGAN—Exploiting Images for Video Recognition: Heterogeneous Feature Augmentation via Symmetric Adversarial Learning学习笔记
    AFN—Larger Norm More Transferable: An Adaptive Feature Norm Approach for Unsupervised Domain Adaptation学习笔记
    Learning to Transfer Examples for Partial Domain Adaptation学习笔记
    Partial Adversarial Domain Adaptation学习笔记
    Partial Transfer Learning with Selective Adversarial Networks学习笔记
    Importance Weighted Adversarial Nets for Partial Domain Adaptation学习笔记
    Exploiting Images for Video Recognition with Hierarchical Generative Adversarial Networks学习笔记
    improved open set domain adaptation with backpropagation 学习笔记
  • 原文地址:https://www.cnblogs.com/gao88/p/11371602.html
Copyright © 2011-2022 走看看