php,求出5张牌中,最优的一组,怎么破,求大神,给源码。感谢。 源码php梭哈 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 基础算法$hua = array('♦', '♣', '♥', '♠');$num = array(2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A');foreach($hua as $i=>$v1) foreach($num as $j=>$v2) $pai[] = array($i, $j, $v1.$v2);shuffle($pai);$d = array(1 => '', '对子', '三条', '四条');foreach(array_chunk($pai, 5) as $a) { if(count($a) < 5) continue; $msg = current(array_count_values(array_map('reset', $a))) == 5 ? '同花' : ''; $t = array_map('next', $a); sort($t); for($i=1; $i<5; $i++) if($t[$i] != $t[$i-1]+1) goto next; $msg .= '顺子'; next: if($i == 4 && $t[0] == 0) $msg .= '顺子'; foreach(array_count_values($t) as $c) $msg .= $d[$c]; $msg = str_replace('对子对子', '二对', $msg); echo join(' ', array_map('end', $a)) . " : $msg <br>";}可能的结果♥9 ♠4 ♠9 ♦2 ♥Q : 对子 ♦A ♦9 ♠J ♣2 ♠Q : ♥8 ♥3 ♣7 ♣4 ♥6 : ♦6 ♣Q ♣5 ♦7 ♦10 : ♥K ♠2 ♦5 ♠5 ♦8 : 对子 ♣J ♦Q ♠K ♥7 ♣3 : ♥4 ♦4 ♣8 ♠3 ♦K : 对子 ♠10 ♦3 ♣K ♣A ♥2 : ♠8 ♠A ♣6 ♥A ♣9 : 对子 ♦J ♥5 ♥10 ♣10 ♥J : 二对 本帖最后由 xuzuning 于 2014-12-02 14:50:41 编辑 要完整代码去发威客吧,斑竹写的是让你学习 看语法和思路分析手牌的话,我觉得可以用100进制的加分机制:同花顺>四条>富尔豪斯>同花>顺子>三条>二对>单对>散牌散牌=0分,单对=100分,二对=200分,以此类推然后将参与计分的牌最大的一张作为分数加进去例如,手牌1,2,2,3,3 那么这套牌的分数就是200 + 2 + 3顺子12345,分数就是405,如果A算最大,就记为414得到5张牌就能计算分数了 <?phpheader("Content-type: text/html; charset=utf-8");$cards_color = array('♦', '♣', '♥', '♠');$cards_dot = array('2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A');function build_one_cards($cards_color, $cards_dot, $is_shuffle = false, $is_sitiao = false) { $cards = array(); $index = 0; foreach($cards_color as $color) { foreach($cards_dot as $dot) { $cards[$index]['color'] = $color; $cards[$index]['dot'] = $dot; $index ++; } } if ($is_shuffle == true) shuffle($cards); if ($is_sitiao == true) { unset($cards); $index = 0; foreach($cards_dot as $dot) { foreach($cards_color as $color) { $cards[$index]['color'] = $color; $cards[$index]['dot'] = $dot; $index ++; } } } return $cards;}function is_tonghuashun($cards) { $j = 0; $cards_dot = array('2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'); for ($i = 0; $i < count($cards); $i++) { if (isset($cards[$i + 1]['color']) && $cards[$i]['color'] == $cards[$i+1]['color']) { $j ++; } } if ($j < (count($cards) - 1)) return false; $j = 0; for ($i = 0; $i < count($cards); $i++) { if (isset($cards[$i + 1]['dot'])) { $current_key = array_keys($cards_dot, $cards[$i]['dot']); $next_key = array_keys($cards_dot, $cards[$i + 1]['dot']); if (($next_key[0] - $current_key[0] == 1) || ($next_key[0] - $current_key[0] == -1)) $j ++; } } if ($j < (count($cards) - 1)) return false; return true;}function is_sitiao($cards) { $cards_dot = array('2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'); $j = 0; $k = 0; for ($i = 0; $i < count($cards); $i++) { if (isset($cards[$i + 1]['dot'])) { $current_key = array_keys($cards_dot, $cards[$i]['dot']); $next_key = array_keys($cards_dot, $cards[$i + 1]['dot']); if ($next_key[0] - $current_key[0] == 0) $j ++; else $k++; } } if (($j == 3 && $k == 1) || ($j == 2 && $k == 2)) return true; return false;}$cards = build_one_cards($cards_color, $cards_dot, false, true);$cards = build_one_cards($cards_color, $cards_dot);$ths_cards = array_slice($cards, 8, 5);$sitiao_cards = array ( 0 => array ('color' => '♦', 'dot' => 4), 1 => array ('color' => '♣', 'dot' => 4), 2 => array ('color' => '♥', 'dot' => 6), 3 => array ('color' => '♥', 'dot' => 4), 4 => array ('color' => '♠', 'dot' => 4));if (is_sitiao($ths_cards)) { echo "是四条"; print_r($ths_cards);} else { echo "不是四条"; print_r($ths_cards);} if (is_tonghuashun($ths_cards)) { echo "是同花顺"; print_r($ths_cards);} else { echo "不是同花顺"; print_r($ths_cards);} 发几个,完整的就不发了有道理 斑竹,如何比较里面谁最大,干脆写出来吧,我没看到。小弟刚入php才9个月多点。 斑竹 给你5张牌,里面可能有大小王,怎么推荐出一副最强的3张牌。牌组大小:同花顺 > 三条 > 顺子 > 同花 > 一对> 三单张 大小王可以随便代替任意牌。如果系统推荐,就整成最大的一副3张牌,记住,只出3张牌。坐等你指导。 我私信你了。我QQ 511810285。如果你方便的话,就加下我。你写的是对的,现在稍微有点复杂,就是5张牌中,可能是包含两个癞子,即大小王。如果里面有大王或小王,或者都有,则直接来个同花顺是最大的。规则:(牌组大小:同花顺 > 三条 > 顺子 > 同花 > 一对> 三单张 foreach(发牌(10) as $p) { echo join(' ', array_map('end', $p)) . ' ==> ' . join(' ', array_map('end', 强三($p))) . PHP_EOL;}function 强三($a) { for($i=0; $i<5-2; $i++) for($j=$i+1; $j<5-1; $j++) for($k=$j+1; $k<5; $k++) $res[] = 求权($a[$i], $a[$j], $a[$k]); $q = array_map('current', $res); array_multisort($q, $res); return array_pop($res)[1];// foreach($res as $r) echo "$r[0]: ". join(' ', array_map('end', $r[1])) . '<br>';}function 发牌($n=2) { $hua = array('方', '草', '红', '黑'); $num = array(2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A'); foreach($hua as $i=>$v1) foreach($num as $j=>$v2) $pai[] = array($i, $j, $v1.$v2); shuffle($pai); if($n == 1) return array_slice($pai, 0, 5); return array_slice(array_chunk($pai, 5), 0, $n);}function 求权($a, $b, $c) { $d = array('同花顺子' => 5, '三条' => 4, '顺子' => 3, '同花' => 2, '一对' => 1, '三单' => 0, '' => 0); $m = ''; if($a[0] == $b[0] && $b[0] == $c[0]) $m .= '同花'; $t = array_map('next', array($a, $b, $c)); sort($t); if($t[0] == $t[1] && $t[1] == $t[2]) $m = '三条'; elseif($t[0] == $t[1] || $t[1] == $t[2]) $m = '一对'; elseif($t[0]+2 == $t[2] || ("$a[1] $b[1] $c[1]" == '0 1 12')) $m .= '顺子'; return array($d[$m], array($a, $b, $c));}可能的结果方9 黑7 黑8 红3 方4 ==> 方9 黑7 黑8草7 草8 方5 黑K 草10 ==> 草7 草8 草10红4 黑3 红10 黑J 红6 ==> 红4 红10 红6红2 草6 黑6 草A 方A ==> 黑6 草A 方A方3 黑4 草Q 方6 红5 ==> 黑4 方6 红5黑2 方2 草J 黑9 方J ==> 黑2 草J 方J草4 黑A 方10 方K 草K ==> 黑A 方K 草K黑Q 红7 草3 方8 方Q ==> 黑Q 红7 方Q红8 红Q 红A 红J 红K ==> 红Q 红A 红K黑10 草9 红9 草2 草5 ==> 草9 草2 草5 版主在顺子那里有个小漏洞, if($i == 4 && $t[0] == 0 && $t[4] == 12 ) { $msg .= '顺子'; } 版主在顺子那里有个小漏洞, if($i == 4 && $t[0] == 0 && $t[4] == 12 ) { $msg .= '顺子'; } 你也不看看楼主的说明,就乱说2 3 4 5 A 即 A 2 3 4 5 是顺子对应的 $t 为 array( 0, 1, 2, 3. 12) 不知道你做个测试没有for($n=0; $n<10; $n++) { //先做10次 $msg = ''; $t = array(0, 1, 2, 3, rand(4, 12)); //产生一个5个数的数组 for($i=1; $i<5; $i++) if($t[$i] != $t[$i-1]+1) goto next; $msg .= '顺子'; next: if($i == 4 && $t[0] == 0 && $t[4] == 12 ) $msg .= '顺子'; echo join(',', $t) . $msg . PHP_EOL;}可能的结果(因为有随机数)0,1,2,3,12顺子0,1,2,3,90,1,2,3,70,1,2,3,60,1,2,3,4顺子0,1,2,3,80,1,2,3,100,1,2,3,12顺子0,1,2,3,4顺子0,1,2,3,11版主 我说的是真的, 你这个判断会把 2,3,4,5 ,加剩下的任意一张牌牌都会判断为顺子,你不行你自己试一下你这个判断会把 2,3,4,5 ,加剩下的任意一张牌(除了数字是,2,3,4,5)都会判断为顺子 PHP语言 网页上如何获取图片 要具体点的 怎样在关闭脚本的同时,关闭数据库连接? 求个flash播放器 jpgraph error 报错信息 我是PHP新手,请教大哥们提供个n级联动下拉框,与2级联动多选项下拉框 WEB跟目录下有个PHP目录,为什么PHP目录里面的文件就访问不到?? 有关登录保存密码 谁有中国站长资源下载网10个金币的会员账号(30分求之) 学php有那些好的书啊? php中怎样得到sql server存储过程返回的值呀?高分相送 php 统计当前在线人数 xml模板文件
$num = array(2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A');
foreach($hua as $i=>$v1)
foreach($num as $j=>$v2) $pai[] = array($i, $j, $v1.$v2);
shuffle($pai);$d = array(1 => '', '对子', '三条', '四条');
foreach(array_chunk($pai, 5) as $a) {
if(count($a) < 5) continue;
$msg = current(array_count_values(array_map('reset', $a))) == 5 ? '同花' : '';
$t = array_map('next', $a);
sort($t);
for($i=1; $i<5; $i++) if($t[$i] != $t[$i-1]+1) goto next;
$msg .= '顺子';
next:
if($i == 4 && $t[0] == 0) $msg .= '顺子';
foreach(array_count_values($t) as $c) $msg .= $d[$c];
$msg = str_replace('对子对子', '二对', $msg);
echo join(' ', array_map('end', $a)) . " : $msg <br>";
}
可能的结果
♥9 ♠4 ♠9 ♦2 ♥Q : 对子
♦A ♦9 ♠J ♣2 ♠Q :
♥8 ♥3 ♣7 ♣4 ♥6 :
♦6 ♣Q ♣5 ♦7 ♦10 :
♥K ♠2 ♦5 ♠5 ♦8 : 对子
♣J ♦Q ♠K ♥7 ♣3 :
♥4 ♦4 ♣8 ♠3 ♦K : 对子
♠10 ♦3 ♣K ♣A ♥2 :
♠8 ♠A ♣6 ♥A ♣9 : 对子
♦J ♥5 ♥10 ♣10 ♥J : 二对
分析手牌的话,我觉得可以用100进制的加分机制:
同花顺>四条>富尔豪斯>同花>顺子>三条>二对>单对>散牌
散牌=0分,单对=100分,二对=200分,以此类推
然后将参与计分的牌最大的一张作为分数加进去
例如,手牌1,2,2,3,3 那么这套牌的分数就是200 + 2 + 3
顺子12345,分数就是405,如果A算最大,就记为414
得到5张牌就能计算分数了
<?php
header("Content-type: text/html; charset=utf-8");
$cards_color = array('♦', '♣', '♥', '♠');
$cards_dot = array('2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A');function build_one_cards($cards_color, $cards_dot, $is_shuffle = false, $is_sitiao = false) {
$cards = array();
$index = 0;
foreach($cards_color as $color) {
foreach($cards_dot as $dot) {
$cards[$index]['color'] = $color;
$cards[$index]['dot'] = $dot;
$index ++;
}
}
if ($is_shuffle == true)
shuffle($cards);
if ($is_sitiao == true) {
unset($cards);
$index = 0;
foreach($cards_dot as $dot) {
foreach($cards_color as $color) {
$cards[$index]['color'] = $color;
$cards[$index]['dot'] = $dot;
$index ++;
}
}
}
return $cards;
}function is_tonghuashun($cards) {
$j = 0;
$cards_dot = array('2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A');
for ($i = 0; $i < count($cards); $i++) {
if (isset($cards[$i + 1]['color']) && $cards[$i]['color'] == $cards[$i+1]['color']) {
$j ++;
}
}
if ($j < (count($cards) - 1))
return false;
$j = 0;
for ($i = 0; $i < count($cards); $i++) {
if (isset($cards[$i + 1]['dot'])) {
$current_key = array_keys($cards_dot, $cards[$i]['dot']);
$next_key = array_keys($cards_dot, $cards[$i + 1]['dot']);
if (($next_key[0] - $current_key[0] == 1) || ($next_key[0] - $current_key[0] == -1))
$j ++;
}
}
if ($j < (count($cards) - 1))
return false;
return true;
}function is_sitiao($cards) {
$cards_dot = array('2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A');
$j = 0; $k = 0;
for ($i = 0; $i < count($cards); $i++) {
if (isset($cards[$i + 1]['dot'])) {
$current_key = array_keys($cards_dot, $cards[$i]['dot']);
$next_key = array_keys($cards_dot, $cards[$i + 1]['dot']);
if ($next_key[0] - $current_key[0] == 0)
$j ++;
else
$k++;
}
}
if (($j == 3 && $k == 1) || ($j == 2 && $k == 2))
return true;
return false;
}
$cards = build_one_cards($cards_color, $cards_dot, false, true);
$cards = build_one_cards($cards_color, $cards_dot);
$ths_cards = array_slice($cards, 8, 5);$sitiao_cards = array (
0 => array ('color' => '♦', 'dot' => 4),
1 => array ('color' => '♣', 'dot' => 4),
2 => array ('color' => '♥', 'dot' => 6),
3 => array ('color' => '♥', 'dot' => 4),
4 => array ('color' => '♠', 'dot' => 4)
);
if (is_sitiao($ths_cards)) {
echo "是四条";
print_r($ths_cards);
} else {
echo "不是四条";
print_r($ths_cards);
}
if (is_tonghuashun($ths_cards)) {
echo "是同花顺";
print_r($ths_cards);
} else {
echo "不是同花顺";
print_r($ths_cards);
} 发几个,完整的就不发了
有道理
大小王可以随便代替任意牌。如果系统推荐,就整成最大的一副3张牌,记住,只出3张牌。坐等你指导。
我私信你了。我QQ 511810285。如果你方便的话,就加下我。你写的是对的,现在稍微有点复杂,就是5张牌中,可能是包含两个癞子,即大小王。如果里面有大王或小王,或者都有,则直接来个同花顺是最大的。
规则:(牌组大小:同花顺 > 三条 > 顺子 > 同花 > 一对> 三单张
echo join(' ', array_map('end', $p)) . ' ==> ' . join(' ', array_map('end', 强三($p))) . PHP_EOL;
}function 强三($a) {
for($i=0; $i<5-2; $i++)
for($j=$i+1; $j<5-1; $j++)
for($k=$j+1; $k<5; $k++)
$res[] = 求权($a[$i], $a[$j], $a[$k]);
$q = array_map('current', $res);
array_multisort($q, $res);
return array_pop($res)[1];
// foreach($res as $r) echo "$r[0]: ". join(' ', array_map('end', $r[1])) . '<br>';
}function 发牌($n=2) {
$hua = array('方', '草', '红', '黑');
$num = array(2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A');
foreach($hua as $i=>$v1)
foreach($num as $j=>$v2) $pai[] = array($i, $j, $v1.$v2);
shuffle($pai);
if($n == 1) return array_slice($pai, 0, 5);
return array_slice(array_chunk($pai, 5), 0, $n);
}function 求权($a, $b, $c) {
$d = array('同花顺子' => 5, '三条' => 4, '顺子' => 3, '同花' => 2, '一对' => 1, '三单' => 0, '' => 0);
$m = '';
if($a[0] == $b[0] && $b[0] == $c[0]) $m .= '同花';
$t = array_map('next', array($a, $b, $c));
sort($t);
if($t[0] == $t[1] && $t[1] == $t[2]) $m = '三条';
elseif($t[0] == $t[1] || $t[1] == $t[2]) $m = '一对';
elseif($t[0]+2 == $t[2] || ("$a[1] $b[1] $c[1]" == '0 1 12')) $m .= '顺子';
return array($d[$m], array($a, $b, $c));
}
可能的结果
方9 黑7 黑8 红3 方4 ==> 方9 黑7 黑8
草7 草8 方5 黑K 草10 ==> 草7 草8 草10
红4 黑3 红10 黑J 红6 ==> 红4 红10 红6
红2 草6 黑6 草A 方A ==> 黑6 草A 方A
方3 黑4 草Q 方6 红5 ==> 黑4 方6 红5
黑2 方2 草J 黑9 方J ==> 黑2 草J 方J
草4 黑A 方10 方K 草K ==> 黑A 方K 草K
黑Q 红7 草3 方8 方Q ==> 黑Q 红7 方Q
红8 红Q 红A 红J 红K ==> 红Q 红A 红K
黑10 草9 红9 草2 草5 ==> 草9 草2 草5
if($i == 4 && $t[0] == 0 && $t[4] == 12 )
{
$msg .= '顺子';
}
if($i == 4 && $t[0] == 0 && $t[4] == 12 )
{
$msg .= '顺子';
}
2 3 4 5 A 即 A 2 3 4 5 是顺子
对应的 $t 为 array( 0, 1, 2, 3. 12)
for($n=0; $n<10; $n++) { //先做10次
$msg = '';
$t = array(0, 1, 2, 3, rand(4, 12)); //产生一个5个数的数组
for($i=1; $i<5; $i++) if($t[$i] != $t[$i-1]+1) goto next;
$msg .= '顺子';
next:
if($i == 4 && $t[0] == 0 && $t[4] == 12 ) $msg .= '顺子';
echo join(',', $t) . $msg . PHP_EOL;
}
可能的结果(因为有随机数)0,1,2,3,12顺子
0,1,2,3,9
0,1,2,3,7
0,1,2,3,6
0,1,2,3,4顺子
0,1,2,3,8
0,1,2,3,10
0,1,2,3,12顺子
0,1,2,3,4顺子
0,1,2,3,11版主 我说的是真的, 你这个判断会把 2,3,4,5 ,加剩下的任意一张牌牌都会判断为顺子,你不行你自己试一下你这个判断会把 2,3,4,5 ,加剩下的任意一张牌(除了数字是,2,3,4,5)都会判断为顺子