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>
200行代码搞定炸金花游戏(PHP版)的更多相关文章
- 30行代码搞定WCF并发性能测试
[以下只是个人观点,欢迎交流] 30行代码搞定WCF并发性能 轻量级测试. 1. 调用并发测试接口 static void Main() { List< ...
- 10行代码搞定移动web端自定义tap事件
发发牢骚 移动web端里摸爬滚打这么久踩了不少坑,有一定移动web端经验的同学一定被click困扰过.我也不列外.一路走来被虐的不行,fastclick.touchend.iscroll什么的都用过, ...
- [Unity Editor]10行代码搞定Hierarchy排序
在日常的工作和研究中,当给我们的场景摆放过多的物件的时候,Hierarchy面板就会变得杂乱不堪.比如这样: 过多的层次结构充斥在里面,根层的物件毫无序列可言,整个层次面板显示非常的杂乱不堪,如 ...
- Tensorflow快餐教程(1) - 30行代码搞定手写识别
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/lusing/article/details ...
- 如何用Python统计《论语》中每个字的出现次数?10行代码搞定--用计算机学国学
编者按: 上学时听过山师王志民先生一场讲座,说每个人不论干什么,都应该学习国学(原谅我学了计算机专业)!王先生讲得很是吸引我这个工科男,可能比我的后来的那些同学听课还要认真些,当然一方面是兴趣.一方面 ...
- python爬煎蛋妹子图--20多行代码搞定煎蛋妹子图库
如果说一个人够无聊的话... 就会做一些十分美(wei)丽(suo)的事情啦哈哈哈... 好的,话不多说,进入正题. 正如标题所示,我们今天的目标很简单: 代码要少,妹子要好. 步骤如下: 1. 首先 ...
- BaseHttpListActivity,几行代码搞定Android Http列表请求、加载和缓存
Android开发中,向服务器请求一个列表并显示是非常常见的需求,但实现起来比较麻烦,代码繁杂. 随着应用的更新迭代,这种需求越来越多,我渐渐发现了实现这种需求的代码的共同点. 于是我将Activit ...
- 100行代码搞定抖音短视频App,终于可以和美女合唱了。
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由视频咖 发表于云+社区专栏 本文作者,shengcui,腾讯云高级开发工程师,负责移动客户端开发 最近抖音最近又带了一波合唱的节奏,老 ...
- python入门机器学习,3行代码搞定线性回归
本文着重是重新梳理一下线性回归的概念,至于几行代码实现,那个不重要,概念明确了,代码自然水到渠成. “机器学习”对于普通大众来说可能会比较陌生,但是“人工智能”这个词简直是太火了,即便是风云变化的股市 ...
随机推荐
- addview的使用
之前,使用addview(控件1)的时候 之前是需要给控件1添加一个位置设定,比如是设定在右侧 使用了addrule 但是我想到的是,如果是给一个view 的 后面延长,把该控件放在上面呢?
- easyui tree loadFilter的使用
实例化.这里增加了三个属性,可以指定idFiled,textFiled和parentField.所以这里的simpleData可以不严格转换成tree的数据格式. $(function(){ $( ...
- Python中的list和tuple
list使用方括号[ ]表示: >>> classmates = ['Michael', 'Bob', 'Tracy'] >>> classmates ['Mi ...
- 谈谈.Net技术面试
1.引子 最近一直在负责.net(B/S方向)技术面试相关的工作,前前后后面试了不少人,但是通过率较低,大概只有20%左右:有颇多感慨. 最近也一直比较困惑,原因究竟是什么? 是我们要求太高,应聘者本 ...
- (转)我看PhD by 王珢
我看PhD by 王垠 前段时间看了一下这些关于 PhD 的负面信息: 一个专门反对读 PhD 的 BLOG 叫“100 Reasons NOT to Go to Graduate School”(下 ...
- Javascript学习之无缝滚动
无缝滚动Javascript: <!DOCTYPE html> <html> <head> <meta charset="utf-8"&g ...
- 一些稍微复杂点的sql语句
UPDATE test SET content = REPLACE(content,'国家级',''),content = REPLACE(content,'世界级',''),content = RE ...
- linux nginx 启动脚本
linux nginx 启动脚本 [root@webtest76 ~]# vi /etc/init.d/nginx #!/bin/bash # nginx Startup script for the ...
- SQL INSERT INTO 语句
SQL Order By SQL update INSERT INTO 语句 INSERT INTO 语句用于向表格中插入新的行. 语法 INSERT INTO 表名称 VALUES (值1, 值2, ...
- sql server2008登录出错怎么整
我在登录的时候老是报同一个错误,如下图: 更正方法: 这样改了之后就可以了!