解决方案 »

  1.   

    基础算法$hua = array('♦', '♣', '♥', '♠');
    $num = array(2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A');
    foreach($hua as $i=>$v1)
      foreach($num as $j=>$v2) $pai[] = array($i, $j, $v1.$v2);
    shuffle($pai);$d = array(1 => '', '对子', '三条', '四条');
    foreach(array_chunk($pai, 5) as $a) {
      if(count($a) < 5) continue;
      $msg = current(array_count_values(array_map('reset', $a))) == 5 ? '同花' : '';
      $t = array_map('next', $a);
      sort($t);
      for($i=1; $i<5; $i++) if($t[$i] != $t[$i-1]+1) goto next;
      $msg .= '顺子';
      next:
      if($i == 4 && $t[0] == 0) $msg .= '顺子';
      foreach(array_count_values($t) as $c) $msg .= $d[$c];  
      $msg = str_replace('对子对子', '二对', $msg);
      echo join(' ', array_map('end', $a)) . " : $msg <br>";
    }
    可能的结果
    ♥9 ♠4 ♠9 ♦2 ♥Q : 对子 
    ♦A ♦9 ♠J ♣2 ♠Q : 
    ♥8 ♥3 ♣7 ♣4 ♥6 : 
    ♦6 ♣Q ♣5 ♦7 ♦10 : 
    ♥K ♠2 ♦5 ♠5 ♦8 : 对子 
    ♣J ♦Q ♠K ♥7 ♣3 : 
    ♥4 ♦4 ♣8 ♠3 ♦K : 对子 
    ♠10 ♦3 ♣K ♣A ♥2 : 
    ♠8 ♠A ♣6 ♥A ♣9 : 对子 
    ♦J ♥5 ♥10 ♣10 ♥J : 二对 
      

  2.   

    本帖最后由 xuzuning 于 2014-12-02 14:50:41 编辑
      

  3.   

    要完整代码去发威客吧,斑竹写的是让你学习 看语法和思路
    分析手牌的话,我觉得可以用100进制的加分机制:
    同花顺>四条>富尔豪斯>同花>顺子>三条>二对>单对>散牌
    散牌=0分,单对=100分,二对=200分,以此类推
    然后将参与计分的牌最大的一张作为分数加进去
    例如,手牌1,2,2,3,3 那么这套牌的分数就是200 + 2 + 3
    顺子12345,分数就是405,如果A算最大,就记为414
    得到5张牌就能计算分数了
      

  4.   


    <?php
    header("Content-type: text/html; charset=utf-8");
    $cards_color = array('♦', '♣', '♥', '♠');
    $cards_dot = array('2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A');function build_one_cards($cards_color, $cards_dot, $is_shuffle = false, $is_sitiao = false) {
        $cards = array();
        $index = 0;
        foreach($cards_color as $color) {
            foreach($cards_dot as $dot) {
                $cards[$index]['color'] = $color;
                $cards[$index]['dot'] = $dot;
                $index ++;
            }
        }
        if ($is_shuffle == true)
            shuffle($cards);
        if ($is_sitiao == true) {
            unset($cards);
            $index = 0;
            foreach($cards_dot as $dot) {
                foreach($cards_color as $color) {
                    $cards[$index]['color'] = $color;
                    $cards[$index]['dot'] = $dot;
                    $index ++;
                }
            }
        }
        return $cards;
    }function is_tonghuashun($cards) {
        $j = 0;
        $cards_dot = array('2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A');
        for ($i = 0; $i < count($cards); $i++) {
            if (isset($cards[$i + 1]['color']) && $cards[$i]['color'] == $cards[$i+1]['color']) {
               $j ++; 
            }        
        }
        if ($j < (count($cards) - 1))
            return false;
        $j = 0;
        for ($i = 0; $i < count($cards); $i++) {
            if (isset($cards[$i + 1]['dot'])) {
                $current_key = array_keys($cards_dot, $cards[$i]['dot']);
                $next_key = array_keys($cards_dot, $cards[$i + 1]['dot']);            
                if (($next_key[0] - $current_key[0] == 1) || ($next_key[0] - $current_key[0] == -1))
                    $j ++;
            }
        }
        if ($j < (count($cards) - 1))
            return false;
        return true;
    }function is_sitiao($cards) {
        $cards_dot = array('2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A');
        $j = 0; $k = 0;
        for ($i = 0; $i < count($cards); $i++) {
            if (isset($cards[$i + 1]['dot'])) {
                $current_key = array_keys($cards_dot, $cards[$i]['dot']);
                $next_key = array_keys($cards_dot, $cards[$i + 1]['dot']);            
                if ($next_key[0] - $current_key[0] == 0)
                    $j ++;
                else
                    $k++;
            }
        }
        if (($j == 3 && $k == 1) || ($j == 2 && $k == 2))
            return true;    
        return false;
    }
    $cards = build_one_cards($cards_color, $cards_dot, false, true);
    $cards = build_one_cards($cards_color, $cards_dot);
    $ths_cards = array_slice($cards, 8, 5);$sitiao_cards = array (
        0 => array ('color' => '♦', 'dot' => 4),
        1 => array ('color' => '♣', 'dot' => 4),
        2 => array ('color' => '♥', 'dot' => 6),
        3 => array ('color' => '♥', 'dot' => 4),
        4 => array ('color' => '♠', 'dot' => 4)
    );
    if (is_sitiao($ths_cards)) {
        echo "是四条";
        print_r($ths_cards);
    } else {
        echo "不是四条";
        print_r($ths_cards);
    }  
    if (is_tonghuashun($ths_cards)) {
        echo "是同花顺";
        print_r($ths_cards);
    } else {
        echo "不是同花顺";
        print_r($ths_cards);
    }    发几个,完整的就不发了
    有道理
      

  5.   

    斑竹,如何比较里面谁最大,干脆写出来吧,我没看到。小弟刚入php才9个月多点。
      

  6.   

    斑竹 给你5张牌,里面可能有大小王,怎么推荐出一副最强的3张牌。牌组大小:同花顺  > 三条 > 顺子 >  同花 > 一对> 三单张 

    大小王可以随便代替任意牌。如果系统推荐,就整成最大的一副3张牌,记住,只出3张牌。
    坐等你指导。
      

  7.   


    我私信你了。我QQ 511810285。如果你方便的话,就加下我。你写的是对的,现在稍微有点复杂,就是5张牌中,可能是包含两个癞子,即大小王。如果里面有大王或小王,或者都有,则直接来个同花顺是最大的。
    规则:(牌组大小:同花顺  > 三条 > 顺子 >  同花 > 一对> 三单张 
      

  8.   

    foreach(发牌(10) as $p) {
      echo join(' ', array_map('end', $p)) . ' ==> ' . join(' ', array_map('end', 强三($p))) . PHP_EOL;
    }function 强三($a) {
      for($i=0; $i<5-2; $i++)
        for($j=$i+1; $j<5-1; $j++)
          for($k=$j+1; $k<5; $k++)
            $res[] = 求权($a[$i], $a[$j], $a[$k]);
      $q = array_map('current', $res);
      array_multisort($q, $res);
      return array_pop($res)[1];
    //  foreach($res as $r) echo "$r[0]: ". join(' ', array_map('end', $r[1])) . '<br>';
    }function 发牌($n=2) {
      $hua = array('方', '草', '红', '黑');
      $num = array(2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A');
      foreach($hua as $i=>$v1)
        foreach($num as $j=>$v2) $pai[] = array($i, $j, $v1.$v2);
      shuffle($pai);
      if($n == 1) return array_slice($pai, 0, 5); 
      return array_slice(array_chunk($pai, 5), 0, $n);
    }function 求权($a, $b, $c) {
      $d = array('同花顺子' => 5, '三条' => 4, '顺子' => 3, '同花' => 2, '一对' => 1, '三单' => 0, '' => 0);
      $m = '';
      if($a[0] == $b[0] && $b[0] == $c[0]) $m .= '同花';
      $t = array_map('next', array($a, $b, $c));
      sort($t);
      if($t[0] == $t[1] && $t[1] == $t[2]) $m = '三条';
      elseif($t[0] == $t[1] || $t[1] == $t[2]) $m = '一对';
      elseif($t[0]+2 == $t[2] || ("$a[1] $b[1] $c[1]" == '0 1 12')) $m .= '顺子';
      return array($d[$m], array($a, $b, $c));
    }
    可能的结果
    方9 黑7 黑8 红3 方4 ==> 方9 黑7 黑8
    草7 草8 方5 黑K 草10 ==> 草7 草8 草10
    红4 黑3 红10 黑J 红6 ==> 红4 红10 红6
    红2 草6 黑6 草A 方A ==> 黑6 草A 方A
    方3 黑4 草Q 方6 红5 ==> 黑4 方6 红5
    黑2 方2 草J 黑9 方J ==> 黑2 草J 方J
    草4 黑A 方10 方K 草K ==> 黑A 方K 草K
    黑Q 红7 草3 方8 方Q ==> 黑Q 红7 方Q
    红8 红Q 红A 红J 红K ==> 红Q 红A 红K
    黑10 草9 红9 草2 草5 ==> 草9 草2 草5
      

  9.   

    版主在顺子那里有个小漏洞,
        
    if($i == 4 && $t[0] == 0 && $t[4] == 12 ) 
        {
            $msg .= '顺子';
        }
      

  10.   

    版主在顺子那里有个小漏洞,
        
    if($i == 4 && $t[0] == 0 && $t[4] == 12 ) 
        {
            $msg .= '顺子';
        }
      

  11.   

    你也不看看楼主的说明,就乱说
    2 3 4 5 A 即 A 2 3 4 5 是顺子
    对应的 $t 为 array( 0, 1, 2, 3. 12)
      

  12.   

    不知道你做个测试没有
    for($n=0; $n<10; $n++) { //先做10次
      $msg = '';
      $t = array(0, 1, 2, 3, rand(4, 12)); //产生一个5个数的数组
      for($i=1; $i<5; $i++) if($t[$i] != $t[$i-1]+1) goto next;
      $msg .= '顺子';
      next:
      if($i == 4 && $t[0] == 0 && $t[4] == 12 ) $msg .= '顺子';
      echo join(',', $t) . $msg . PHP_EOL;
    }
    可能的结果(因为有随机数)0,1,2,3,12顺子
    0,1,2,3,9
    0,1,2,3,7
    0,1,2,3,6
    0,1,2,3,4顺子
    0,1,2,3,8
    0,1,2,3,10
    0,1,2,3,12顺子
    0,1,2,3,4顺子
    0,1,2,3,11版主  我说的是真的, 你这个判断会把  2,3,4,5 ,加剩下的任意一张牌牌都会判断为顺子,你不行你自己试一下你这个判断会把  2,3,4,5 ,加剩下的任意一张牌(除了数字是,2,3,4,5)都会判断为顺子