對洗髮撲克牌程序的個人理解
洗撲克牌的過程就想當於對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>
運行如下: