PHP扑克牌随机发放算法
扑克牌算法
/** * 随机花色及点数:这种算法能够保证抽几张牌时不会把抽过的排又抽一遍 * * 牌数:共有52张牌,编号从0到51 * 花色:分为四种牌【黑桃 / 红桃 / 方块 / 梅花】,每种牌有13张 * 关系:4种牌分别对应 1-12, 13-25, 26-38, 39-51 的数字和花色 * 打乱:将上述对应的数组打乱排序,抽出打乱后的数组中的前4个数字 * 取色:除以13就是这张牌的花色(最开始已经规定好了他们的一一对应关系) * 取牌:对13取余,余数就是这张牌的点数 **/ date_default_timezone_set('Asia/Shanghai'); set_time_limit(0); header("Content-Type:text/html;charset=UTF-8"); $num = 52; //一副牌54张 $deck = array(); //扑克牌比牌大小 //suits 数组存放花色, 数组下标分别是: 0,1,2,3 $suits = ["黑桃","红桃","梅花","方块"]; //array() //$suits = ["Spades","Hearts","Clubs","Diamonds"]; //英文对应 //ranks 数组存放点数, 数组下标分别是: 0,1,...11,12 $ranks = ["A","2","3","4","5","6","7","8","9","10","J","Q","K"]; //$ranks = ["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"]; //英文对应 //初始化: 数组deck初始化为1到51 for( $i = 0; $i < $num; $i++ ){ $deck[$i] = $i; } //将牌随机打散: 有两个方案 /* //方案1: 将数组deck打乱,循环一遍,循环的每个元素deck[i]和任意产生的随机数下标j将deck[i],deck[j]互换。 for( $i=0; $i<$num; $i++ ){ $index = (int)rand(0, $num - 1); $temp = $deck[$i]; $deck[$i] = $deck[$index]; $deck[$index] = $temp; } */ //方案2: shuffle()函数像洗扑克牌一样把这个数组里面的元素打乱位置 shuffle($deck); //发牌 5 张 for($i=0; $i<5; $i++){ //花色 0,1,2,3 $suit = $suits[$deck[$i] / 13]; //除以13 //点数 A,2,...11,12 $rank = $ranks[$deck[$i] % 13]; echo "当前您抽到的是第" . $deck[$i] . "张牌:" . $suit . $rank . " <br/>\r\n"; }
打印结果
当前您抽到的是第20张牌:梅花8 当前您抽到的是第40张牌:红桃2 当前您抽到的是第4张牌:黑桃5 当前您抽到的是第5张牌:黑桃6 当前您抽到的是第21张牌:梅花9
拓展用法
将某一数组打散,并随机不重复的抽取其中指定个数的元素。
//先从 1~100 中随机读取10个数字生成一个示例数组 $ids = array(); while( count($ids) < 10 ){ $ids[] = mt_rand(1, 100); $ids = array_unique($ids); } //$ids = implode(',', $ids); //shuffle()函数像洗扑克牌一样把这个数组里面的元素打乱位置 shuffle($ids); //随机抽取其中5个 for($i=0; $i<5; $i++){ echo $ids[$i] . "\n"; }