对洗发扑克牌程序的个人理解

来源:互联网 发布:深圳大学网络与新媒体 编辑:程序博客网 时间:2024/05/17 07:15
对洗发扑克牌程序的个人理解
洗扑克牌的过程就想当于对52张牌进行重新排序,然后把牌放在一边,等待着发牌。
在主程序里我们先定义一副牌,牌有四种花色,每种花色有13张。
<span style="font-size:18px;">int main(){const char *suit[4]={"红桃","黑桃","草花","方片"};const char *face[13]={"Ace","Deuce","三","四","五","六","七","八","九","十","Jack","Queen","King"};int pai[4][13]={0};srand(time(NULL));xipai(pai);fapai(pai,suit,face);}</span>

在程序里我们可以考虑用4*13的2维数组pai[4][13]来存这52张牌。每一行代表一个花色的13张牌。然后把第一张牌随机的放入一个位置,再把第二张牌随机的放入一个位置,最后52张牌都放入了这个2维数组里了。这与实际的洗牌过程是反着的,实际中我们洗牌相当于把红桃3放在最上面,黑桃2放在红桃三下面等等,最后把最后一张牌放在最下面。而在程序里,我们相当于牌的位置固定了,即这个二维数组(它表示,第一行为红桃1~13,第二行为黑桃1~13,第三行为草花1~13,第四行为方片1~13),我们是在数组里存下牌放的顺序,假设pai[0][0]=32,即表示红桃1前面有31张牌,发牌的时候红桃1是发出的第32张牌。
如何把放牌的顺序存入数组里呢,我们要利用随机数来实现。把2维数组初始化为0。首先随机的产生一对数组的行ROW1和列COL1,然后把1存入pai[ROW1][COL1],再随机的产生一对行ROW2和列COL2,如果pai[ROW2][COL2]与上面的位置不冲突,即pai[ROW2][COL2]=0,就把2存入pai[ROW2][COL2];如此循环下去,直到把52存入最后一个数组元素。
<span style="font-size:18px;">void xipai(int fangpai[][13]){int row;int column;for (int card=1;card<=52;card++){do {row=rand()%4; column=rand()%13;}while(fangpai[row][column]!=0);fangpai[row][column]=card;}}</span>
发牌的时候,我们发的第一张牌为pai[ ROW_x][COL_x ]=1的牌,行号ROW_x代表花色,列号CLO_x代表牌面为1~13中的哪一个。用如下的循环的实现发牌,
<span style="font-size:18px;">void fapai(const int fangpai[][13],const char *fsuit[4],const char *fface[13]){for (int card=1;card<=52;card++){for (int row=0;row<=3;row++){for (int column=0;column<=12;column++){if(fangpai[row][column]==card){printf("%s %s %c",fsuit[row],fface[column],card%2==0 ? '\n': '\t');}}}}}</span>

整个程序为:
</pre><span style="font-size:18px;"></span><pre name="code" class="cpp"><span style="font-size:18px;">#include<stdio.h>#include<stdlib.h>#include<time.h>void xipai(int fangpai[][13]){int row;int column;for (int card=1;card<=52;card++){do {row=rand()%4; column=rand()%13;}while(fangpai[row][column]!=0);fangpai[row][column]=card;}}void fapai(const int fangpai[][13],const char *fsuit[4],const char *fface[13]){for (int card=1;card<=52;card++){for (int row=0;row<=3;row++){for (int column=0;column<=12;column++){if(fangpai[row][column]==card){printf("%s %s %c",fsuit[row],fface[column],card%2==0 ? '\n': '\t');}}}}}int main(){const char *suit[4]={"红桃","黑桃","草花","方片"};const char *face[13]={"Ace","Deuce","三","四","五","六","七","八","九","十","Jack","Queen","King"};int pai[4][13]={0};srand(time(NULL));xipai(pai);fapai(pai,suit,face);}</span>
运行如下:




0 0