用php做一个给出一副扑克,出去大小鬼,随机发给四个人一张牌,每一次发的牌都不一样,讲下思路,谢谢!
答案:3 悬赏:0 手机版
解决时间 2021-04-08 00:26
- 提问者网友:活着好累
- 2021-04-07 10:20
用php做一个给出一副扑克,出去大小鬼,随机发给四个人一张牌,每一次发的牌都不一样,讲下思路,谢谢!
最佳答案
- 五星知识达人网友:一叶十三刺
- 2021-04-07 11:50
rand(1,52) 一到52代表不同的52张牌, 如产生随机数1,这对应牌的图片,1.jpg
4个人,4个数组,产生的随机数,看看是否已经保存在四个数组中,已经存在则重新产生随机数
这个是理论完全随机数的情况
其实我想应该可以这样,52/4=13张牌 可以rand(1,13) ,产生的随机数就是1到13,比对此随机数是否已经产生四次,四个数组中,这样,应该执行效率会高点,在rand(1,4)产生随机的四个花色,
在执行上一步判断是否重复值,在产生,此为穷举法,结构简单点
function getpoke($start=1,$end=52,$pokes=array())
{
//去除重复的牌
$pokes=array_unique($pokes);
//还差几张牌
$cai=$end-count($pokes);
if (count($pokes)<$end)
{
for($i=count($pokes);$i<=$cai;$i++)
{
$pokes[$i]=rand($start,$end);
}
$pokes=array_unique($pokes);
getpoke($start,$end,$pokes);
}
return $pokes;
}
生成了1-52的不重复的数组,在把这个数组分成四个小数组就可以了,实际上牌就是一次洗牌生成一个数组。
搞定,还是递归搞定,应该会有更好的方法,没测试,楼主完成了,发个最终版的
--------------------------------------------测试可用,生成无重复四个数组-------------------------------------------------------
$pokes=range(1,52);
shuffle($pokes);
$player1=$player2=$player3=$player4=array();
for($i=0;$i<13;$i++)
{
$player1[$i]=$pokes[$i] ;
}
for($i=13;$i<26;$i++)
{
$player2[$i-13]=$pokes[$i] ;
}
for($i=26;$i<39;$i++)
{
$player3[$i-26]=$pokes[$i] ;
}
for($i=39;$i<52;$i++)
{
$player4[$i-39]=$pokes[$i] ;
}
echo "
player1:
";
print_r($player1);
echo "
player2:
";
print_r($player2);
echo "
player3:
";
print_r($player3);
echo "
player4:
";
print_r($player4);
每个数组的数字在对应相应的牌的图片就行,出牌,比较大小,就是比较数字的大小
4个人,4个数组,产生的随机数,看看是否已经保存在四个数组中,已经存在则重新产生随机数
这个是理论完全随机数的情况
其实我想应该可以这样,52/4=13张牌 可以rand(1,13) ,产生的随机数就是1到13,比对此随机数是否已经产生四次,四个数组中,这样,应该执行效率会高点,在rand(1,4)产生随机的四个花色,
在执行上一步判断是否重复值,在产生,此为穷举法,结构简单点
function getpoke($start=1,$end=52,$pokes=array())
{
//去除重复的牌
$pokes=array_unique($pokes);
//还差几张牌
$cai=$end-count($pokes);
if (count($pokes)<$end)
{
for($i=count($pokes);$i<=$cai;$i++)
{
$pokes[$i]=rand($start,$end);
}
$pokes=array_unique($pokes);
getpoke($start,$end,$pokes);
}
return $pokes;
}
生成了1-52的不重复的数组,在把这个数组分成四个小数组就可以了,实际上牌就是一次洗牌生成一个数组。
搞定,还是递归搞定,应该会有更好的方法,没测试,楼主完成了,发个最终版的
--------------------------------------------测试可用,生成无重复四个数组-------------------------------------------------------
$pokes=range(1,52);
shuffle($pokes);
$player1=$player2=$player3=$player4=array();
for($i=0;$i<13;$i++)
{
$player1[$i]=$pokes[$i] ;
}
for($i=13;$i<26;$i++)
{
$player2[$i-13]=$pokes[$i] ;
}
for($i=26;$i<39;$i++)
{
$player3[$i-26]=$pokes[$i] ;
}
for($i=39;$i<52;$i++)
{
$player4[$i-39]=$pokes[$i] ;
}
echo "
player1:
";
print_r($player1);
echo "
player2:
";
print_r($player2);
echo "
player3:
";
print_r($player3);
echo "
player4:
";
print_r($player4);
每个数组的数字在对应相应的牌的图片就行,出牌,比较大小,就是比较数字的大小
全部回答
- 1楼网友:天凉才是好个秋
- 2021-04-07 14:05
牌就52张。可以直接写到一个数组中,array(1->"梅花1",2->"梅花2"1->"梅花1"1->"梅花1"1->"梅花1")这样在用rand取 把重复的去掉 四个人 循环四次 每次在array中取13张牌,放到一个数组中,然后在两个数组的差集 类推。
- 2楼网友:妄饮晩冬酒
- 2021-04-07 12:54
//用一个数组a储存52张牌
for($i=0;$i<52;$i++){
$x=rand(0,52);
$arr[$i]=$a[$x]; //以下四行用于验证这张牌是否发过
for($j=0;$j<52;$j++){
if($arr[$j]==$a[$x]){
$i--;
}
}
//对4取余发给不同玩家
if($i%4==0)$arr1[$i]=$a[$x];
if($i%4==1)$arr2[$i]=$a[$x];
if($i%4==2)$arr3[$i]=$a[$x];
if($i%4==3)$arr4[$i]=$a[$x];
}
//大概思路就是这样,代码随手写的细节自己改吧
for($i=0;$i<52;$i++){
$x=rand(0,52);
$arr[$i]=$a[$x]; //以下四行用于验证这张牌是否发过
for($j=0;$j<52;$j++){
if($arr[$j]==$a[$x]){
$i--;
}
}
//对4取余发给不同玩家
if($i%4==0)$arr1[$i]=$a[$x];
if($i%4==1)$arr2[$i]=$a[$x];
if($i%4==2)$arr3[$i]=$a[$x];
if($i%4==3)$arr4[$i]=$a[$x];
}
//大概思路就是这样,代码随手写的细节自己改吧
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯