<?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. Hibernate Open Session In View模式【转】

    来源:http://www.yybean.com/opensessioninviewfilter-role-and-configuration 一.作用 Spring为我们解决Hibernate的Se ...

  2. C# 退出程序

    1.this.Close();   只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出: 2.Application.Exit();  强制所有消息中 ...

  3. A star 寻路

    大白话说一下几个点: 通俗的来说,其实就是以一个规则来 从A点走到B点. 怎么来判断我们走的格子是一个合适的格子? 就是靠一个规则来计算,这个规则就是估价函数. 估价函数: 常用:曼哈顿算法 F = ...

  4. IOS_ios逆向工程-静态分析

    返回博客列表 原 ios逆向工程-静态分析 余成海 发布时间: 2014/11/03 19:17 阅读: 11201 收藏: 17 点赞: 5 评论: 6 最近在学习IOS逆向工程,查看网络上的资料也 ...

  5. java并发编程(十一)线程间的通信notify通知的遗漏

    notify通知的遗漏很容易理解,即threadA还没开始wait的时候,threadB已经notify了,这样,threadB通知是没有任何响应的,当threadB退出synchronized代码块 ...

  6. python的编码规范【摘】

    模块名:小写字母,单词之间用_分割ad_stats.py 包名:和模块名一样 类名:单词首字母大写AdStatsConfigUtil 全局变量名(类变量,在java中相当于static变量):大写字母 ...

  7. php 截取中文字符串 - ord()函数 0xa0...

    在ASCII中,0xa0表示汉字的开始 其中php中的一个函数ord()函数 此函数功能返回一个字符的askii码值: 如ord('A')=65; <?php function GBsubstr ...

  8. Public DNS (公共域名解析服务)

    114DNS 服务IP:114.114.114.114, 114.114.115.115 拦截 钓鱼病毒木马网站:114.114.114.119, 114.114.115.119 拦截 色情网站:11 ...

  9. 查找Maven JAR坐标

    http://mvnrepository.com/ http://search.maven.org/

  10. CentOS下通过yum安装svn及配置

    CentOS下通过yum安装svn及配置 1.环境centos5.5 2.安装svnyum -y install subversion 3.配置 建立版本库目录mkdir /www/svndata s ...