扑克牌随便冼都凭意念知道扑克牌是发什么牌

上传时间:
扑克牌洗牌发牌技术__扑克牌发底牌绝技视频
56官方微信
扫一扫发现精彩下载作业帮安装包
扫二维码下载作业帮
1.75亿学生的选择
扑克牌找牌魔术有一种扑克牌魔术,应该是利用数学排列组合原理变的.好像是从牌堆里随便选一张牌,给观众看后放进牌堆(自己不看),随意洗牌后把牌分成三堆,让观众帮忙看那张牌在哪堆里,把那张牌所在的那落牌放在最上面(这里我忘了是把这落牌放在最上面还是中间或者最下面)落好继续随意洗牌,再分成三堆重复上面的步骤,在重复上面步骤N次(这里我忘了是几次了)后从牌堆最上方开始数牌,第M(这里我忘了是第几张了)张就是一开始的那张牌.大概步骤就是这样,
拿21张牌,请观众记一张牌,然后,从左至右分成三堆(左一张,中一张,右一张,左一张,中一张,右一张如此循环)然后问观众他记得那张牌在哪一堆,就把有那张牌的一堆放在中间,其他两堆任意放,这样连续3次,最后那张牌一定在第11张
为您推荐:
其他类似问题
扫描下载二维码#include&&stdio.h&
#include&&stdlib.h&
#include&&time.h&
int&i,n,a,b,t;
void&main()&{
&&&&srand(time(NULL));
&&&&printf(&shuffle&0..n-1&demo\n&);
&&&&for&(n=1;n&=5;n++)&{
&&&&&&&&printf(&_____n=%d_____\n&,n);
&&&&&&&&j=1;
&&&&&&&&for&(c=1;c&=n;c++)&j=j*c;
&&&&&&&&j*=n*2;
&&&&&&&&for&(c=1;c&=j;c++)&{
&&&&&&&&&&&&for&(i=0;i&n;i++)&d[i]=i;
&&&&&&&&&&&&for&(i=n;i&0;i--)&{
&&&&&&&&&&&&&&&&a=i-1;b=rand()%i;
&&&&&&&&&&&&&&&&if&(a!=b)&{t=d[a];d[a]=d[b];d[b]=t;}
&&&&&&&&&&&&}
&&&&&&&&&&&&printf(&%04d:&,c);
&&&&&&&&&&&&for&(i=0;i&n;i++)&printf(&%d&,d[i]);
&&&&&&&&&&&&printf(&\n&);
&&&&printf(&shuffle&1..n&demo\n&);
&&&&for&(n=1;n&=5;n++)&{
&&&&&&&&printf(&_____n=%d_____\n&,n);
&&&&&&&&j=1;
&&&&&&&&for&(c=1;c&=n;c++)&j=j*c;
&&&&&&&&j*=n*2;
&&&&&&&&for&(c=1;c&=j;c++)&{
&&&&&&&&&&&&for&(i=1;i&=n;i++)&d[i]=i;
&&&&&&&&&&&&for&(i=n;i&1;i--)&{
&&&&&&&&&&&&&&&&a=i;b=rand()%i+1;
&&&&&&&&&&&&&&&&if&(a!=b)&{t=d[a];d[a]=d[b];d[b]=t;}
&&&&&&&&&&&&}
&&&&&&&&&&&&printf(&%04d:&,c);
&&&&&&&&&&&&for&(i=1;i&=n;i++)&printf(&%d&,d[i]);
&&&&&&&&&&&&printf(&\n&);
&洗牌的算法有很多,这里主要介绍下几种主要的算法。
& 方法一:每次找一个随机的位置,然后将这54个数放到找的位置中。
&& 步骤:1.用一个整型数组记录各个位置是否已经放置了数,如果放置了则不为0,否则为0。所以在算法开始的时候,初始化此数组每个元素的值都为0.
&&&&&&&&&& 2.每次产生一个0-53之间的数,看这个位置是否放置了数,如果已经放置了,则继续采用同样的方法找一个随机的位置进行判断,如果这个位置还未放置,则设置此位置。
&&&&&&&&&& 3.反复执行步骤2,直到所有的位置都放好了数。
&& 代码实现如下:
1 void shuffle(int *dest,int N)
for (card=<span style="color:#;card&=N;card&#43;&#43;)
pos=rand()%(N-<span style="color:#);
} while (dest[pos]!=<span style="color:#);
<span style="color:#
<span style="color:#
dest[pos]=
<span style="color:#
<span style="color:# }
<span style="color:#
<span style="color:# void main()
<span style="color:# {
<span style="color:#
int dest[<span style="color:#]={<span style="color:#};
<span style="color:#
shuffle(dest,<span style="color:#);
<span style="color:#
for (int i=<span style="color:#;i&<span style="color:#;i&#43;&#43;)
<span style="color:#
<span style="color:#
cout&&dest[i]&&& &;
<span style="color:#
<span style="color:# }
&&& 此方法有个缺点就是很耗时间,因为随着空位置越来越少,寻找会越来越困难。
&& 方法二:就是先对数组进行初始化,然后随机交换数组中任意两个元素。交换的次数越多就越随机。此方法也很简单,而且时间复杂度也比较低,计算量也不大。
&&&&& 代码实现如下:
&&&&&&&&&&&&&&&&&
1 void shuffle ( int a[], int n )
int tmp = <span style="color:#, p1, p2;
int cnt = rand() % <span style="color:#23;
while (cnt--)
p1 = rand() %
p2 = rand() %
tmp = a[p1];
<span style="color:#
a[p1] = a[p2];
<span style="color:#
<span style="color:#
<span style="color:# }
&&&& 方法三:它的基本思想是初始化一个vector,顺序加入所有牌,即1-54个数,然后从这个vector中随机抽取一个到另一个vector中,将这个过程执行54次即可完成。
&&&&&& 代码的实现如下:
&&&&&&&&&&&&&&&&
1 void vectorShuffle(vector&int& &unshuffle,vector&int& &shuffled)
unsigned int temp,len=unshuffle.size();
while(len)
temp=rand()%(len--);
shuffled.push_back(unshuffle[temp]);
unshuffle.erase(unshuffle.begin()&#43;temp);
<span style="color:# }
<span style="color:#
<span style="color:#
<span style="color:# void main()
<span style="color:# {
<span style="color:#
vector&int& uncard,
<span style="color:#
for (int i=<span style="color:#;i&<span style="color:#;i&#43;&#43;)
<span style="color:#
<span style="color:#
uncard.push_back(i&#43;<span style="color:#);
<span style="color:#
<span style="color:#
vectorShuffle(uncard,carded);
<span style="color:#
for (int j=<span style="color:#;j&<span style="color:#;j&#43;&#43;)
<span style="color:#
<span style="color:#
cout&&carded[j]&&& &;
<span style="color:#
<span style="color:# }
&&& PS:STL中也有一个封装好了的洗牌算法-random_shuffle。使用方法:如果定义有 vector&int& datas,那么直接调用该函数。例如:random_shuffle(datas.begin(),datas.end()); 还可以定义起始迭代器和末尾迭代器来对序列中的某一部分进行洗牌,并且所耗费的时间也较少。
[code=html]
本程序实现了一般扑克牌游戏的洗牌、发牌和理牌过程,程序模拟了对四个玩家的发牌,且能让各自玩家按大小顺序整理自己的手牌。牌的大小顺序按斗地主的规则(但无大小王)。
&&&本程序定义了一个牌的结构体,其成员变量是两个字符指针。一个指向点数的字符数组,另一个指向花色的字符数组。考虑到牌的整理需要比较两张牌的大小,而字符不太好比较,从而构造了一个辅助函数Value来实现将字符转换为整数。程序得最后还对桌牌和手牌进行了检测,看是否有重复的牌。
算法说明:
Void&Deal(CARD&*Deck,CARD&(*player)[13]){
&&&&&for&(i&=&0;i&&&4;&i&#43;&#43;){
&&&&&&&&//&遍历四个玩家
for&(j&=&0;j&&&13;&j&#43;&#43;){
//&洗牌第i个玩家的第j张牌是手牌中的第4*j&#43;i张(轮流发牌)
&&&player[i][j]&=&Deck[4*j&#43;i];
&& 排序算法
void &InsertSort&(&CARD&*R)&{&//&对某一玩家R作直接插入排序,有13张牌
&& for &(&i=1;&i&n;&&#43;&#43;i&)&{
&&temp&=&R[i];&//&复制为监视哨
&&for &(&j=i-1;&j&=0;&--j&)
if(Value(R[j].face)&Value(temp.face))// 如果R[j]的牌比temp的小则调出循环,找到比temp小的牌&&&&&&&&&&else&if&(Value(R[j].face)&==&Value(temp.face)&&//&若face&相同&则比较suit
?&Value(R[j].suit)&&&Value(temp.suit)&?&1&:&0&:&0)&
for &(k&=&j-1;&k&&&j;k--)
&&&&&&&R[j&#43;1]&=&R[j];&//&记录后移
&&&&&&&&R[k&#43;1]&=&&//&插入到正确位置
&&}&//&InsertSort
&&&&&&&& 测试算法
测试桌牌和手牌是否有重复的牌。其思想是从第一张开始与后面的牌一次比较,直到找到一张与待比较的牌相同的或者倒数第二张与最后一张牌比较后终止。
算法描述:
&&&&&&&For(I&=&0;&I&&&13;&I&#43;&#43;&){
&&&&&&&&&&&Temp&=&R[I];&//&将待检测的牌放入temp中
&&&&&&&&&&&If(&Locat(Temp,R)){
&&&&&&&&&&&&Print&:ERROR!&
&//&如果Temp在R[I&#43;1…13]中则返回1&
//&若没有重复的牌不提示任何信息
&&&&&&&& 变量说明:
一.& 张牌(Card)都用一个&strcut&card&结构体类型来表示具体定义如下&struct&card{
char&*&&//&指针&face&指向不同纸牌的点数
&&&&char&*&&//&指针&suit&指向不同纸牌的花色
再定义两个字符数组分别存储牌的点数和花色:
char&*face[]&=&{&3&,&&4&,&&5&,&&6&,&&7&,&&8&,&&9&,&&10&,&&J&,&&Q&,&&K&,&A&,&&2&};
char&*suit[]&=&{&/004&,&&/005&,&&/003&,&&/006&};
定义两个CARD型数组&deck[52],player[4][13],deck用与存储桌牌,player用于存储玩家手牌。
&&&&&&&&&#include&&stdio.h& &&#include&&stdlib.h&
&&#include&&time.h& &&#include&&iostream&
&&typedef&struct&card{&&&&&&&&&&&&char&*&&&&&&&&char&*&&&&}&CARD;&&&CARD&deck[52],&player[4][13];&&&&&&&&&char&*face[]&=&{&3&,&&4&,&&5&,&&6&,&&8&,&&8&,&&9&,&&10&,&&J&,&&Q&,&&K&,&A&,&&2&};&&&&&&&char&*suit[]&=&{&/004&,&&/005&,&&/003&,&&/006&};&&&&&void&InitDeck&(CARD&*&,&char&*[]&,&char&*[]);&&void&Shuffle&(CARD&*);&&void&Deal&(CARD&*&,&CARD&(*)[13]);&&void&Sort&(CARD&(*)[13]);&&int&&Value&(char&*);&&void&Disply(void&);&&int&Locat(CARD&*,&int&,&CARD&,&int&(*)(CARD,&CARD));&&int&Equl(CARD,&CARD);&&void&Testcard(CARD&*,&CARD&(*)[13]);&&int&main(){&&&&&&srand(time(NULL));&&&&&&&&InitDeck&(deck,&face,&suit);&&
&&&&&&Shuffle&(deck);&&
&&&&&&Deal&(deck,&player);&&&&&&&Sort&(player);&&&&&&&&Disply();&&&&&&Testcard(deck,&player);&&&&&&return&0;&&}&&void&InitDeck&(CARD&*pDeck,&char&*pface[],&char&*psuit[]){&&&&&&&&&&&&&&&&int&i;&&&&&&for&(i&=&0;&i&&=&51;&i&#43;&#43;){&&&&&&&&&&pDeck[i].face&=&pface[i%13];&&&&&&&&&&&&pDeck[i].suit&=&psuit[i/13];&&&&&&&&}&&}&&void&Shuffle&(CARD&*pDeck){&&&&&&
&&&&&&int&i,&j;&&&&&&CARD&&&&&&&for&(i&=&0;&i&&=&51;&i&#43;&#43;){&&&&&&&&&&&&&&&&&&&&j&=&rand()%52;&&
&&&&&&&&&&temp&=&pDeck[i];&&&&&&&&&&&&pDeck[i]&=&pDeck[j];&&&&&&&&&&pDeck[j]&=&&&&&&&}&&}&&void&Deal&(CARD&*pDeck&,&CARD&(*pplayer)[13])&{&&&&&&int&i,&j;&&&&&&&&for&(i&=&0;i&&&4;&i&#43;&#43;){&&&&&&&&&&&&&&&&&&&&for&(j&=&0;j&&&13;&j&#43;&#43;){&&&&&&&&&&&&&&&&&&&&pplayer[i][j]&=&pDeck[4*j&#43;i];&&&&&&&&&&}&&&&&&}&&}&&void&Sort&(CARD&(*pplayer)[13]){&&&&&&
&&&&&&int&i,&j,&p,&q;&&&&&&&&CARD&&&&&&&for&(i&=&0;i&&&4;&i&#43;&#43;){&&&&&&&&&&
&&&&&&&&&&for&(j&=&1;j&&&13;&j&#43;&#43;){&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&temp&=&pplayer[i][j];&&&&&&&&&&&&&&&&for&(p&=&j-1;&p&&=&0;&p--){&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(Value(pplayer[i][p].face)&&&Value(temp.face))&&&&&&&&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&&&else&if&(Value(pplayer[i][p].face)&==&Value(temp.face)&&&&&&&&&&&&&&&&&&&&?&Value(pplayer[i][p].suit)&&&Value(temp.suit)&?&1&:&0&:&0)&break;&&&&&&&&&&&&&&}&&&&&&&&&&&&&&for&(q&=&j-1;&q&&&p;&q--){&&&&&&&&&&&&&&&&&&&&pplayer[i][q&#43;1]&=&pplayer[i][q];&&&&&&&&&&&&&&}&&&&&&&&&&&&&&pplayer[i][q&#43;1]&=&&&&&&&&&&&}&&&&&&}&&}&&int&Value(char&*str){&&&&&&&&&&&&int&i&=&0;&&&&&&&&&&&&while(i&&&4&&&&*str&-&*suit[i&#43;&#43;])&;&&&&&&if&(i&==&4)&{&&&&&&i&=&0;&&&&&&while(i&&&13&&&&*str&-&*face[i&#43;&#43;])&;&&&&&&}&&&&&&return&i;&&}&&void&Disply(){&&&&&&using&namespace&&&&&&&int&i,&j;&&&&&&&&&&&&cout&&&&&player1&&&&&&player2&&&&&&player3&&&&&&player4&&&&&&&&&&&for&(j&=&0;&j&&&13;&j&#43;&#43;){&&&&&&&&&&&&&&&&&&&&for&(i&=&0;&i&&&4;&i&#43;&#43;){&&&&&&&&&&&&&&
&&&&&&&&&&&&&&cout&&&&player[i][j].suit&&&&player[i][j].face&&&&&/t&;&&&&&&&&&&&&&&if&(i&==&3)&cout&&&&&&&&&&&&&&}&&&&&&}&&}&&void&Testcard(CARD&*pdeck,&CARD&(*pplayer)[13]){&&&&&&using&namespace&&&&&&&int&i,&j;&&&&&&CARD&&&&&&&&&&for&(i&=&0;&i&&&51;&i&#43;&#43;){&&&&&&&&&&temp&=&pdeck[i];&&&&&&&&&&if&(Locat(&deck[i&#43;1],52,temp,Equl)){&&&&&&&&&&&&&&cout&&&&&error!&the&deckcard&are&same&&&&&&&&&&&&&&&&&&break;&&&&&&&&&&}&&&&&&}&&&&&&&&for&(i&=&0;&i&&&4;&i&#43;&#43;){&&&&&&&&&&for&(j&=&0;&j&&&13;&j&#43;&#43;){&&&&&&&&&&&&&&temp&=&pplayer[i][j];&&&&&&&&&&&&&&if(Locat(&pplayer[i][j&#43;1],13,temp,Equl)){&&&&&&&&&&&&&&&&&&cout&&&&&error!&the&player's&card&are&same&&&&&&&&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&&&}&&&&&&&&&&}&&&&&&&&}&&}&&int&Locat(CARD&*pdecks,&int&len,&CARD&deck,&int&(*compare)(CARD&,&CARD&)){&&&&&&
&&&&&&CARD&*p;&&&&&&int&i&=&0;&&&&&&&&p&=&&&&&&&&&while&(i&&&len&&&&compare(*p&#43;&#43;&,&deck))&&&&&&&&&&&&#43;&#43;i;&&&&&&if(i&==&len)&&&&&&&&&&return&0;&&&&&&else&&&&&&&&&&return&1;&&}&&int&Equl(CARD&card1,&CARD&card2){&&&&&&&&&&&&&&&&&&int&fval,&&&&&&&&&&&&&fval&=&*card1.face&-&*card2.&&&&&&sval&=&*card1.suit&-&*card2.&&&&&&if(fval&||&sval)&&&&&&&&&&return&1;&&&&&&&&else&&&&&&&&&&&return&0;&&}&&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:35948次
排名:千里之外
转载:74篇
(1)(5)(39)(12)(12)(15)}

我要回帖

更多关于 扑克牌怎么知道大小 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信