炸金花 php算法,200行代码搞定炸金花游戏(PHP版)

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 '

'.(fmod(%24dian%5B%24peice%5D,%2014)).'.jpg'; $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 ''; $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 '

'; foreach( $cards as $value ){ echo '

'.(fmod(%24value,%2014)).'.jpg'; } echo cardName($cards); if( $max == $key ) echo ' Winner!'; echo ''; // print_r($cards); } //echo maxCard(array(array(30,44,15), array(2,16,1) )); ?>

0单张,1特殊,2对子,3顺子,4金花,5顺金,6豹子

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值