一、洗扑克牌算法
此游戏算法的关键是:随机数的产生、扑克牌随机交换 和 数组的控制;
连同大王小王,一共有54张扑克牌,第一步先按顺序初始化所有花色的扑克牌;然后通过每个位置的扑克牌与随机产生的一个位置的另一张扑克牌交换位置,达到随机排序的目的,由于随机数种子使用系统时间,所以这个地方还有不随机漏洞的问题待解决(此处暂且认为是真正的随机)。
二、C/C++实现方法:
/* ************************************************ */
/* name: shuffle algo */
/* auth: tianmt */
/* introduce: shuffle cards, include 52 + 2 pieces */
/* ************************************************ */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct card{
int Order; // 顺序
char Suit; // 花色
char Number; // 大小
}Card;
// card arr
Card OneCard[54] = {};
// 打印所有
void showCard(){
int i;
for(i=0; i<54; i++){
//printf(" %02d,%c,%c", OneCard[i].Order, OneCard[i].Suit, OneCard[i].Number);
printf(" %c,%c", OneCard[i].Suit, OneCard[i].Number);
if(12 == i%13){
printf("\n");
}
}
printf("\n");
}
// 随机乱序
void shuffle(){
int i;
Card tmpCard;
srand(time(NULL));
for(i=0; i<54; i++){
int tmp = rand()%54;
tmpCard = OneCard[tmp];
OneCard[tmp] = OneCard[i];
OneCard[i] = tmpCard;
}
showCard();
return;
}
// 初始化,顺序
void initCard(){
int i;
for(i=0; i<54; i++){
OneCard[i].Order = i;
if(i>=52){
if(52 == i){
OneCard[i].Suit = 'g';
OneCard[i].Number = 'g';
}else{
OneCard[i].Suit = 'G';
OneCard[i].Number = 'G';
}
}else{
if(i<=12){
OneCard[i].Suit = 'H'; // heart
}else if(i<=25){
OneCard[i].Suit = 'S'; // space
}else if(i<=38){
OneCard[i].Suit = 'D'; // diamond
}else{
OneCard[i].Suit = 'C'; // club
}
switch(i%13){
case 0:
OneCard[i].Number = 'A';
break;
case 9:
OneCard[i].Number = '@';
break;
case 10:
OneCard[i].Number = 'J';
break;
case 11:
OneCard[i].Number = 'Q';
break;
case 12:
OneCard[i].Number = 'K';
break;
default:
OneCard[i].Number = (i%13)+'1';
}
}
}
showCard();
return;
}
int main(void){
printf("init card:\n");
initCard();
printf("\nafter shuffle1 cards: \n");
shuffle();
printf("\nafter shuffle2 cards: \n");
shuffle();
return 0;
}
结果展示:
三、JavaScript实现效果图:
1、初始页面 和 clear 后:
2、初始化扑克牌:
3、洗扑克牌后:
四、JS代码和54张扑克牌下载地址:
—— 2018-11-29 ——