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行代码搞定线性回归
本文着重是重新梳理一下线性回归的概念,至于几行代码实现,那个不重要,概念明确了,代码自然水到渠成. “机器学习”对于普通大众来说可能会比较陌生,但是“人工智能”这个词简直是太火了,即便是风云变化的股市 ...
随机推荐
- 解决Spring的Component-scan和packagesToScan不支持Eclipse RCP问题
http://www.360doc.com/content/13/0401/13/10825198_275274565.shtml
- VR寒冬AR暖春,以色列AR公司再获3000万美元融资
据统计,2015年国内至少有近70家VR公司获得天使或者A轮投资,不过狂欢并没有持续太久.2016年即将结束,资本寒冬和VR头盔的出货远不如预期,让投资者放慢了步伐,不过AR领域的热度依然不减.近日, ...
- 实现倒计时功能js
<p>系统将会在<strong id="endtime"></strong>秒后跳转到登录页!</p> [原生js实现] <s ...
- 通过Gulp使用Browsersync实现浏览器实时响应文件更改
Gulp是什么鬼 Browsersync又是什么鬼 如何安装使用Browsersync 安装 使用 效果图 参考 Gulp是什么鬼 Gulp是一种基于node.js的构建工具,有关构建工具的概念请移步 ...
- HUAS_ACM 个人训练#2 C
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=117538#problem/C 题目大意:给出一个字符串,然后给出一系列的x,y ...
- UI设计中的48dp定律【转】
有朋友建议我偶尔写写技术类的文章,所以我打算开始穿插性的写一些偏技术方面的科普文章,尽量往小白能看懂的方向写,今天我来讲讲UI设计中的48dp定律. 那么先说说什么是dp ?其实对于一个非技术人员要把 ...
- blktrace
统计块设备层io信息. ● 安装 http://blog.csdn.net/hs794502825/article/details/8545133 出现问题,安装新立得软件包管理器:apt-get i ...
- 安装oracle 11g时出现启动服务出现错误,找不到OracleMTSRecoveryService
运行注册表(cmd-输入regedit),到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下,找到OracleMTSRecoveryServ ...
- 然并卵,腾讯QQ认证空间又再次关闭申请
昨天发布的腾讯QQ认证空间又开放申请的消息,此消息一放出,大家都去关注认证的事情,而马浩周发现在4月27日下午4-5点,腾讯QQ空间认证又再次关闭页面开放申请的通知,变成了以前停止审核的通知了. 可能 ...
- Centos防火墙禁止ping和开启ping
1.允许PING设置 iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A OUTPUT -p icmp - ...