从一副扑克中随机抽5张,并输出结果是不是顺子?(时间60分钟)


    刚看到这题目时我心理活动是,这太特么简单了好吗 这题拿来考人?
    结果后面做的乱七八糟的,有些问题也没考虑到。回家之后想了想,还是决定再写一遍。
    使用的方法是最土的,过程如下: 先把牌拼出来,随机生成5张,再让正序排列,
    使用字符串函数检查是否存在于2345678910JQKA,然后输出。

<?php


/*拼出52张牌*/
$pk = [
"红"=>[2,3,4,5,6,7,8,9,10,'J','Q','K','A'],
"黑"=>[2,3,4,5,6,7,8,9,10,'J','Q','K','A'],
"方"=>[2,3,4,5,6,7,8,9,10,'J','Q','K','A'],
"梅"=>[2,3,4,5,6,7,8,9,10,'J','Q','K','A'],
];

foreach ($pk as $key => $value) {
	foreach ($value as $k => $v) {
		$array[]= $key.'-'.$v;
	}
}

/*抽出五张*/
for($i=0;$i<5;$i++){
	$rand_number2[] = $array[array_rand($array)];
}

// $rand_number2=["黑-K","红-J","梅-9","红-10","方-Q"]; //顺子测试案例
foreach ($rand_number2 as $key => $value) {
	$string = explode('-', $value);
	$str_color[] =$string[0];
	$str_num[] = $string[1];
	$color_num .= $string[0].' '.$string[1].'  ,   '; 
}

/*判断扑克数量*/
if(count($str_num)!=5){
	echo '发牌数量错误';
	die;
}

/*检查是否顺子*/
sort($str_num);
$arr_to_str2 = intval(implode('', $str_num));
$sort_pk = ["J"=>"","Q"=>"","K"=>"","A"=>""];

foreach ($str_num as $value) {
	if($value=='J' || $value=='Q' || $value=='K' || $value=='A' ){
		$sort_pk[$value]=$value;
	}
}
foreach ($sort_pk as $value) {
	$arr_to_str2 .= $value;
}
print_r($arr_to_str2);

$pk = '2345678910JQKA';
$pos = strpos($pk,$arr_to_str2);

print_r($color_num);
echo "<br>";
if($pos===false && $arr_to_str2!='2345A'){
	echo "不是顺子";
}else{
	echo '是顺子';
}

输出结果:

红 6 , 红 Q , 梅 1 , 梅 J , 黑 5 ,

不是顺子


-------分割线-2018/11/20 添加-----

 

解法二: 使用Javascript

 

函数1输出N张扑克牌

<script type="text/javascript">


var playingcard = function(n) {
    var card=[
        2,3,4,5,6,7,8,9,10,'J','Q','K','A',
        2,3,4,5,6,7,8,9,10,'J','Q','K','A',
        2,3,4,5,6,7,8,9,10,'J','Q','K','A',
        2,3,4,5,6,7,8,9,10,'J','Q','K','A'
    ];
    var colors=['黑','红','梅','方'],rand_card={}
    for(var i=0;i<n;i++){
        var x=Math.floor(Math.random()*52)
        if(x<13){
            rand_card[colors[0]+card[x]]=card[x]
        }else if(x<26){
            rand_card[colors[1]+card[x]]=card[x]
        }else if(x<39){
            rand_card[colors[2]+card[x]]=card[x]
        }else{
            rand_card[colors[3]+card[x]]=card[x]
        }
        // 出牌数量是否准确
        if(i==n-1){
            var count=0
            for(var x in rand_card){
                count+=1
            }
            if(count<n) i-=1;
        }
    }
    return rand_card
};

 

函数2 输出是否顺子


var numcard = function(n){
    var cards=playingcard(n)
    // var cards={"方9": 9, "黑10": 10, "方8": 8, "红J": "J", "黑Q": 'Q'}
    // var cards={"方3": 3, "方A": 'A', "黑2": 2, "红4": 4, "黑5": 5}
    var arr=[],arr2=[],arr3=[],j=0
    var array = [1,2,3,4,5,6,7,8,9,10,'J','Q','K','A']
    var string = '12345678910111213,123413'

    // cards拆分成两个数组 arr,arr2
    for(var i in cards){
        arr[j]=cards[i]
        arr2[j]=i
        j++
    }
    if(arr.length!=n) return arr2+'<br>拆克牌数量不够';

    //arr3获取扑克在array数组中的索引
    for(var i=0;i<n;i++){
        arr3[i]=array.indexOf(arr[i])
    }
    //arr3 排序
    var length = arr3.length;
    for(var i=length-1;i>0;i--) { //缩小范围
      for(var j=0;j<i;j++) { //在范围内冒泡,最大的一个到最后面
        if(arr3[j]>arr3[j+1]) { 
          var temp=arr3[j];
          arr3[j]=arr3[j+1];
          arr3[j+1]=temp;
        }
      }
    }

    arr2=arr2.join(" , ")
    arr3=arr3.join("")

    // 检查是不是顺子 
    if(string.indexOf(arr3)>-1){
        return arr2+'<br>'+'顺子';
    }

    return arr2+'<br>'+'不是顺子';
}

var z= numcard(5)
document.write(z)

</script>

梅3 , 方9 , 方3 , 红10 , 梅5
不是顺子

方3 , 方A , 黑2 , 红4 , 黑5
顺子

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值