【游戏中的算法】洗扑克牌算法

原创 2016年05月30日 23:10:59


一、洗扑克牌游戏:

此游戏算法的关键是:随机数的产生、扑克牌随机交换 和 数组的控制;

连同大王小王,一共有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张扑克牌下载地址:

http://download.csdn.net/detail/tmt123421/9535703         →     点击打开链接



版权声明:本文为博主原创文章,未经博主允许不得转载。

给定N张扑克牌和一个随机函数,设计一个洗牌算法

假定N=54,首先,我们有一个随机函数发生器,能够产生1-54之间的随机数,如何保证抽第一张牌是54中可能,抽第二张牌是53中可能,…… 可以这样做,假设扑克牌是一个54维的数组card, 我们要做...

你必须知道的html5的基本特征和用法--基础必会

前端的发展如此之迅猛,一不留神,大侠你可能就会被远远地甩在后面了。如果你不想被HTML5的改变/更新搅得不知所措的话,可以把本文的内容作为必须了解的热身课程。 一、新的Doctype //...

棋牌游戏判断牌型算法---适合所有的棋牌游戏

斗地主牌型基本算法升级版本                              好久没更新博客了,前段时间和朋友一起开了一个公司 做APP,最后失败了。现在又开始做棋牌游戏了,最近在看网狐的源码...

【算法】C语言实现简易的扑克牌游戏

【算法】C语言实现简易的扑克牌游戏

判断四张扑克牌能否凑成24点游戏算法

昨天参加了某公司的一个笔试题,其中有一道编程题大概意思是:有一副扑克牌,去掉大小王,还剩52张牌,J Q K代表11,12,13。现在随机抽取四张牌,每张牌必须得用到并且每张牌只能用一次,用+ - ...

24点扑克牌游戏编程算法详解

24点扑克牌游戏,简单点来说就是:一副扑克牌去掉大小王,任意发四张牌给玩家,玩家要将这四张牌做加减乘除运算,规则是四张牌的顺序不定但不可以重复,计算结果如果是24则玩家赢。本程序实现让计算机自动派牌,...

程序模拟洗扑克牌(算法)

洗扑克牌的四种算法,这四种算法是我随着时间的积累而想出来的一个比一个更好。...

洗扑克牌算法

一副扑克共有52张,4中花色 如果我们随机的生成一个数字和花色的话,可能会产生和前面一样的数据。这里我们采用随机换牌的方法洗牌 (1)先按顺序生成一副扑克 (2)产生一个0~51的随机数,将此随机数作...

C#模拟扑克牌发牌算法

  • 2012年03月19日 11:50
  • 3KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【游戏中的算法】洗扑克牌算法
举报原因:
原因补充:

(最多只允许输入30个字)