<?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>

200行代码搞定炸金花游戏(PHP版)的更多相关文章

  1. 30行代码搞定WCF并发性能测试

    [以下只是个人观点,欢迎交流] 30行代码搞定WCF并发性能 轻量级测试. 1. 调用并发测试接口 static void Main()         {               List< ...

  2. 10行代码搞定移动web端自定义tap事件

    发发牢骚 移动web端里摸爬滚打这么久踩了不少坑,有一定移动web端经验的同学一定被click困扰过.我也不列外.一路走来被虐的不行,fastclick.touchend.iscroll什么的都用过, ...

  3. [Unity Editor]10行代码搞定Hierarchy排序

    在日常的工作和研究中,当给我们的场景摆放过多的物件的时候,Hierarchy面板就会变得杂乱不堪.比如这样:    过多的层次结构充斥在里面,根层的物件毫无序列可言,整个层次面板显示非常的杂乱不堪,如 ...

  4. Tensorflow快餐教程(1) - 30行代码搞定手写识别

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/lusing/article/details ...

  5. 如何用Python统计《论语》中每个字的出现次数?10行代码搞定--用计算机学国学

    编者按: 上学时听过山师王志民先生一场讲座,说每个人不论干什么,都应该学习国学(原谅我学了计算机专业)!王先生讲得很是吸引我这个工科男,可能比我的后来的那些同学听课还要认真些,当然一方面是兴趣.一方面 ...

  6. python爬煎蛋妹子图--20多行代码搞定煎蛋妹子图库

    如果说一个人够无聊的话... 就会做一些十分美(wei)丽(suo)的事情啦哈哈哈... 好的,话不多说,进入正题. 正如标题所示,我们今天的目标很简单: 代码要少,妹子要好. 步骤如下: 1. 首先 ...

  7. BaseHttpListActivity,几行代码搞定Android Http列表请求、加载和缓存

    Android开发中,向服务器请求一个列表并显示是非常常见的需求,但实现起来比较麻烦,代码繁杂. 随着应用的更新迭代,这种需求越来越多,我渐渐发现了实现这种需求的代码的共同点. 于是我将Activit ...

  8. 100行代码搞定抖音短视频App,终于可以和美女合唱了。

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由视频咖 发表于云+社区专栏 本文作者,shengcui,腾讯云高级开发工程师,负责移动客户端开发 最近抖音最近又带了一波合唱的节奏,老 ...

  9. python入门机器学习,3行代码搞定线性回归

    本文着重是重新梳理一下线性回归的概念,至于几行代码实现,那个不重要,概念明确了,代码自然水到渠成. “机器学习”对于普通大众来说可能会比较陌生,但是“人工智能”这个词简直是太火了,即便是风云变化的股市 ...

随机推荐

  1. addview的使用

    之前,使用addview(控件1)的时候 之前是需要给控件1添加一个位置设定,比如是设定在右侧 使用了addrule 但是我想到的是,如果是给一个view 的 后面延长,把该控件放在上面呢?

  2. easyui tree loadFilter的使用

      实例化.这里增加了三个属性,可以指定idFiled,textFiled和parentField.所以这里的simpleData可以不严格转换成tree的数据格式. $(function(){ $( ...

  3. Python中的list和tuple

      list使用方括号[ ]表示: >>> classmates = ['Michael', 'Bob', 'Tracy'] >>> classmates ['Mi ...

  4. 谈谈.Net技术面试

    1.引子 最近一直在负责.net(B/S方向)技术面试相关的工作,前前后后面试了不少人,但是通过率较低,大概只有20%左右:有颇多感慨. 最近也一直比较困惑,原因究竟是什么? 是我们要求太高,应聘者本 ...

  5. (转)我看PhD by 王珢

    我看PhD by 王垠 前段时间看了一下这些关于 PhD 的负面信息: 一个专门反对读 PhD 的 BLOG 叫“100 Reasons NOT to Go to Graduate School”(下 ...

  6. Javascript学习之无缝滚动

    无缝滚动Javascript: <!DOCTYPE html> <html> <head> <meta charset="utf-8"&g ...

  7. 一些稍微复杂点的sql语句

    UPDATE test SET content = REPLACE(content,'国家级',''),content = REPLACE(content,'世界级',''),content = RE ...

  8. linux nginx 启动脚本

    linux nginx 启动脚本 [root@webtest76 ~]# vi /etc/init.d/nginx #!/bin/bash # nginx Startup script for the ...

  9. SQL INSERT INTO 语句

    SQL Order By SQL update INSERT INTO 语句 INSERT INTO 语句用于向表格中插入新的行. 语法 INSERT INTO 表名称 VALUES (值1, 值2, ...

  10. sql server2008登录出错怎么整

    我在登录的时候老是报同一个错误,如下图: 更正方法: 这样改了之后就可以了!