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


    <?php
    /*
    * 游戏名称:炸金花(又名三张牌、扎金花)
    * 开发时间:2009.1.14
    * 编 程:多菜鸟
    * 来 源:http://blog.csdn.net/kingerq/archive/2009/02/24/3932255.aspx
    * 说 明:
    * 利用1到55的随机数除以14后的余数产生牌面,
    * 所以牌面的图片的排列A-K分别用数字1-13表示,
    * 不同的花色存放于不同的目录,如1,2,3,4
    * 分别用除以14后得到的整数表示,详情参照代码注释。
    *
    * 扑克图片下载地址,需要对其中的图片名称稍加修改方可利用
    * http://d.download.csdn.net/down/962353/kingerq
    */

    //发牌函数
    function deal($player=1){
    if( intval($player) < 1 ) return;
    $number = 1;
    //人数起始变量
    $person = array();
    //玩家牌面数组
    $card = array();
    //已发出的牌数组

    while( $number <= $player ){
    //玩家数
    $peice = 1;
    $dian = array();
    //玩家牌面数组
    while( $peice <= 3 ){
    //发三张牌
    $value = rand(1, 55);
    while( in_array( $value, $card ) || fmod($value, 14) == 0 ) {
    //牌面不能有重复
    $value = rand(1, 55);
    }
    $card[] = $value;
    //记录已经发出的牌
    //$dian[$peice] = $value;
    if( count($dian) > 0 ) {
    //给出一个从小到大的顺序
    if( fmod($dian[0], 14 ) >= fmod($value, 14) || fmod($value, 14) == 1 ) {
    //得到的牌面比数组第一张牌小时,放到数组前面
    array_unshift( $dian, $value );
    }else if ( fmod($dian[count($dian)-1], 14 ) <= fmod($value, 14) ){
    //得到的牌面比数组最后一张牌大时,放到数组最后面
    $dian[] = $value;
    }else {
    //除了以上情况之外,就是中间值
    $dian[2] = $dian[1];
    $dian[1] = $value;
    }
    }else $dian[] = $value;
    //echo '<img src="'.ceil($dian[$peice]/14).'/'.(fmod($dian[$peice], 14)).'.jpg" mce_src="'.ceil($dian[$peice]/14).'/'.(fmod($dian[$peice], 14)).'.jpg" hspace="1">';
    $peice++;
    }
    $person[] = $dian;
    //将牌面存起来
    $number++;
    }
    return $person;
    //返回所有玩家牌面
    }

    //牌型,$card是一个含三张牌的数组
    function cardName($card){
    if( ! is_array( $card ) && count($card) == 3 ) return;
    $c[0] = fmod($card[0], 14);
    $c[1] = fmod($card[1], 14);
    $c[2] = fmod($card[2], 14);
    //三张版面
    $t0 = ceil($card[0]/14);
    $t1 = ceil($card[1]/14);
    $t2 = ceil($card[2]/14);
    //三张版面的花色
    if( $c[0] == $c[1] && $c[1] == $c[2] ) {
    return 6;//'豹子'
    }else if( $t0 == $t1 && $t1 == $t2 &&
    (
    ( $c[0]+1 == $c[1] && $c[1]+1 == $c[2] ) ||
    ( $c[0] == 1 && $c[1] == 12&& $c[2] == 13)
    )
    ){
    return 5;//'顺金';
    }else if( $t0 == $t1 && $t1 == $t2 ){
    return 4;//'金花';
    }else if( ( $c[0]+1 == $c[1] && $c[1]+1 == $c[2] ) ||
    ( $c[0] == 1 && $c[1] == 12&& $c[2] == 13)
    ){
    return 3;//'顺子';
    }else if( $c[0] == $c[1] || $c[1] == $c[2] || $c[0] == $c[2] ){
    return 2;//'对子';
    }else if( $c[0] == 2 && $c[1] == 3 && $c[2] == 5 && ( $t0 != $t1 || $t1 != $t2 )){
    return 1;//'特殊';
    }else{
    return 0;//'单张';
    }
    //返回牌型:0单张,1特殊,2对子,3顺子,4金花,5顺金,6豹子
    }

    //得到获胜牌
    function maxCard($cards){
    if( ! is_array( $cards ) && count( $cards ) == 2 ) return;

    $maxCardType = 0;
    $maxCardNumber = 1;
    $specialCard = false;
    $cardType = array();
    foreach( $cards as $key=>$value ){
    //得到当前最大牌型
    $cardType[$key] = cardName($value);
    //当前牌型数组

    if( $maxCardType == $cardType[$key] ) {
    //统计最大牌型个数
    $maxCardNumber++;
    }
    if( $maxCardType < $cardType[$key] ) {
    //出现更大的牌型时更新最大牌型
    $maxCardType = $cardType[$key];
    $maxCardNumber = 1;
    }
    if( $maxCardType == 1 ) {
    //是否有特殊牌
    $specialKey = $key;
    $specialCard = true;
    }
    }
    if($maxCardNumber == 1 && $maxCardType == 6 && $specialCard ) return $specialKey;
    //有一手豹子,且和特殊牌并存的时候,返回特殊牌的KEY
    if( $maxCardNumber == 1 && $maxCardType != 6 && !$specialCard ) return array_search( $maxCardType, $cardType );
    //最大牌型只有一手,且不是豹子,也没有特殊牌,就返回这手牌的在数组中的KEY
    if( $maxCardNumber == 1 && $maxCardType == 1 && $specialCard ) $maxCardType = 0;
    //最大牌型只有一手,且为特殊牌,返回0(o单牌)
    if( $maxCardNumber == 1 && $maxCardType != 1 ) return array_search( $maxCardType, $cardType );
    //除以上几种特殊情况之外的只有一手最大牌时,直接返回key

    $currentMaxCard = array();
    foreach( $cardType as $key=>$value ){
    if( $value != $maxCardType ) continue;
    //过滤牌型,只比较最大牌型
    if( ! $currentMaxCard ) {
    //得到第一手要比较的版面
    $currentMaxCard = $cards[$key];
    continue;
    }
    $card = $cards[$key];
    $c[0] = fmod($card[0], 14);
    $c[1] = fmod($card[1], 14);
    $c[2] = fmod($card[2], 14);
    $cardCMC = $currentMaxCard;
    $cCMC[0] = fmod($cardCMC[0], 14);
    $cCMC[1] = fmod($cardCMC[1], 14);
    $cCMC[2] = fmod($cardCMC[2], 14);
    switch($maxCardType){
    //0单张,1特殊,2对子,3顺子,4金花,5顺金,6豹子
    case 6:
    if( $c[0] == 1 || $cCMC[0] < $c[0] ) $currentMaxCard = $cards[$key];
    break;
    case 2:
    if( $c[0] == $c[1] ) {
    $pairs = $c[0];
    $single = $c[2];
    }else if ( $c[0] == $c[2] ) {
    $pairs = $c[0];
    $single = $c[1];
    }else{
    $pairs = $c[1];
    $single = $c[0];
    }
    if( $cCMC[0] == $cCMC[1] ) {
    $pairs2 = $cCMC[0];
    $single2 = $cCMC[2];
    }else if ( $cCMC[0] == $cCMC[2] ) {
    $pairs2 = $cCMC[0];
    $single2 = $cCMC[1];
    }else{
    $pairs2 = $cCMC[1];
    $single2 = $cCMC[0];
    }
    if( $pairs == 1 && $pairs2 == 1 && $single >= $single2 ) $currentMaxCard = $cards[$key];
    else if( $pairs == 1 && $pairs2 != 1) $currentMaxCard = $cards[$key];
    else if( $pairs != 1 && $pairs2 != 1) {
    if ( ( $pairs > $pairs2 ) ||
    ( $pairs == $pairs2 &&
    ( $single >= $single2 ||
    $single == 1
    )
    )
    ) $currentMaxCard = $cards[$key];
    }
    break;
    default:
    //0,3,4,5全部在默认中进行比较
    if( $c[0] == 1 && $cCMC[0] == 1 ) {
    if ( ( $c[2] > $cCMC[2] ) || ( $c[2] == $cCMC[2] && $c[1] > $cCMC[1] ) ) $currentMaxCard = $cards[$key];
    }else if( $c[0] == 1 && $cCMC[0] != 1 ) $currentMaxCard = $cards[$key];
    else if( $c[0] != 1 && $cCMC[0] != 1){
    if (
    ( $c[2] > $cCMC[2] ) ||
    ( $c[2] == $cCMC[2] && $c[1] > $cCMC[1] ) ||
    ( $c[1] == $cCMC[1] && $c[0] >= $cCMC[0] )
    ) $currentMaxCard = $cards[$key];
    }
    }
    }
    return array_search( $currentMaxCard, $cards );
    }
    //echo cardName(array(21,8,23));
    echo '<ol>';
    $player = deal(6);
    //$player = array(array(8,21,29), array(2,3,19), array(1,15,43) );
    $max = maxCard($player);
    foreach( $player as $key=>$cards){
    echo '<li>';
    foreach( $cards as $value ){
    echo '<img src="'.ceil($value/14).'/'.(fmod($value, 14)).'.jpg" mce_src="'.ceil($value/14).'/'.(fmod($value, 14)).'.jpg" hspace="1">';
    }
    echo cardName($cards);
    if( $max == $key ) echo ' Winner!';
    echo '</li>';
    // print_r($cards);
    }
    //echo maxCard(array(array(30,44,15), array(2,16,1) ));
    ?>
    <p>0单张,1特殊,2对子,3顺子,4金花,5顺金,6豹子</p>

  • 相关阅读:
    Centos 6.5 在 Dell 服务器安装的记录
    【转载】你真的了解补码吗
    【转载】我对补码的理解
    记录一下家里双路由实现wifi漫游功能
    中国大学MOOC | C语言程序设计入门 第8周编程练习 翁恺
    华为卡刷包线刷方法
    串口通信
    端口复用和端口重映射
    软件仿真和硬件仿真
    FPGA之四位LED灯
  • 原文地址:https://www.cnblogs.com/cosiray/p/4732501.html
Copyright © 2020-2023  润新知