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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值