?? 隨機數.txt
字號:
一副撲克有52張牌,打橋牌時應將牌分給四個人。請設計一個程序完成自動發牌的工作。要求:黑桃用S(Spaces)表示;紅桃用H(Hearts)表示;方塊用D(Diamonds)表示;梅花用C(Clubs)表示。
*問題分析與算法設計
按照打橋牌的規定,每人應當有13張牌。在人工發牌時,先進行洗牌,然后將洗好的牌按一定的順序發給每一個人。為了便于計算機模擬,可將人工方式的發牌過程加以修改:先確定好發牌順序:1、2、3、4;將52張牌順序編號:黑桃2對應數字0,紅桃2對應數字1,方塊2對應數字2,梅花2對應數字3,黑桃3對應數字4,紅桃3對應數字5,...然后從52 張牌中隨機的為每個人抽牌。
這里采用C語言庫函數的隨機函數,生成0到51之間的共52個隨機數,以產生洗牌后發牌的效果。
*程序與程序注釋
#include<stdlib.h>
#include<stdio.h>
int comp(const void *j,const void *i);
void p(int b[],char n[]);
void main()
{
static char n[]={'2','3','4','5','6','7','8','9','T','J','Q','K','A'};
int a[53],b1[13],b2[13],b3[13],b4[13];
int b11=0,b22=0,b33=0,b44=0,t=1,m,flag,i;
while(t<=52) /*控制發52張牌*/
{ m=random(52); /*產生0到51之間的隨機數*/
for(flag=1,i=1;i<=t&&flag;i++) /*查找新產生的隨機數是否已經存在*/
if(m==a[i]) flag=0; /*flag=1:產生的是新的隨機數
flag=0:新產生的隨機數已經存在*/
if(flag)
{
a[t++]=m; /*如果產生了新的隨機數,則存入數組*/
if(t%4==0) b1[b11++]=a[t-1]; /*根據t的模值,判斷當前*/
else if(t%4==1) b2[b22++]=a[t-1]; /*的牌應存入哪個數組中*/
else if(t%4==2) b3[b33++]=a[t-1];
else if(t%4==3) b4[b44++]=a[t-1];
}
}
qsort(b1,13,sizeof(int),comp); /*將每個人的牌進行排序*/
qsort(b2,13,sizeof(int),comp);
qsort(b3,13,sizeof(int),comp);
qsort(b4,13,sizeof(int),comp);
p(b1,n); p(b2,n); p(b3,n); p(b4,n); /*分別打印每個人的牌*/
}
void p(int b[],char n[])
{
int i;
printf("\n\006 "); /*打印黑桃標記*/
for(i=0;i<13;i++) /*將數組中的值轉換為相應的花色*/
if(b[i]/13==0) printf("%c ",n[b[i]%13]); /*該花色對應的牌*/
printf("\n\003 "); /*打印紅桃標記*/
for(i=0;i<13;i++)
if((b[i]/13)==1) printf("%c ",n[b[i]%13]);
printf("\n\004 "); /*打印方塊標記*/
for(i=0;i<13;i++)
if(b[i]/13==2) printf("%c ",n[b[i]%13]);
printf("\n\005 "); /*打印梅花標記*/
for(i=0;i<13;i++)
if(b[i]/13==3||b[i]/13==4) printf("%c ",n[b[i]%13]);
printf("\n");
}
int comp(const void *j,const void *i) /*qsort調用的排序函數*/
{
return(*(int*)i-*(int*)j);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -