用c語言.亂數發牌.(需特殊排版)

撲克牌,洗牌,發牌。
 
————————————————————————————————————————-
 
作者 : h789512346(又又)
2009/5/24 上午 03:07:23

各位大大好~

我的題目是

寫一發牌程式

隨機產生

要將四人的牌面顯示在螢幕上

需照花色排列

結束後,須詢問是否在洗牌重發

——————————

下面有付程式,但是怪怪的~

好像有些人得不到某些花色…

int print(int *tempArray) // 排版並印出來的方法
{
int a1,a2,a3,a4;
printf("%c",3);
for(a1=0;a1<13;a1++) //檢查有哪些愛心
{
if(1<=tempArray[a1]&&tempArray[a1]<=13)
printf("%2d ",tempArray[a1]%13+1);
}
printf("n");
printf("%c",4);
for(a2=0;a2<13;a2++) // 檢查有哪些方塊
{
if(14<=tempArray[a2]&&tempArray[a2]<=26)
printf("%2d ",tempArray[a2]%13+1);
}
printf("n");
printf("%c",5);
for(a3=0;a3<13;a3++) // 檢查有哪些梅花
{
if(27<=tempArray[a3]&&tempArray[a3]<=39)
printf("%2d ",tempArray[a3]%13+1);
}
printf("n");
printf("%c",6);
for(a4=0;a4<13;a4++) // 檢查有哪些黑桃
{
if(40<=tempArray[a4]&&tempArray[a4]<=52)
printf("%2d ",tempArray[a4]%13+1);
}
printf("nn");
}

int main(int argc, char *argv[])
{
 srand(time(NULL)); //以秒數作為隨機的種子起始值
 int num [52];
 int i,j,k,l,m,n,o,p,temp;
 int playerA[13],playerB[13],playerC[13],playerD[13];

char ch(){
 for ( i=0 ; i<52 ;i++) //創造撲克牌
     num[i]=i+1;
 for(j=0 ; j<13 ; j++){ // 洗牌
     k = num[rand()%52];
     temp = num[j];
     num[j] = num[k];
     num[k] = temp;
}
for(l=0;l<13;l++){
    playerA[l] = num[l];
    playerB[l] = num[l+13];
    playerC[l] = num[l+26];
    playerD[l] = num[l+39];
}

printf("PlayerA:n");
print(playerA); // 把牌丟過去印出來 (整個陣列丟過去)
printf("PlayerB:n");
print(playerB);
printf("PlayerC:n");
print(playerC);
printf("PlayerD:n");
print(playerD);
}
ch();
int b; //檢查是否繼續
char check;
do{
printf("是否重新發牌y/n: ");
scanf("%c" , &check);
fflush(stdin);
if((int)check==121||(int)check==89)
{
b=2;
printf("n");
ch();
}
else if((int)check==78||(int)check==110)
{
b=2;
return 0;
}
else{
fflush(stdin);
printf("輸入錯誤n");
b=1;
}
}while (b=1);
system("PAUSE");
}

————————-

第一次發問,請各位多多包涵

 
——————————————————————————————————————————
 
作者 : qazujm(joe)
2009/5/24 下午 01:33:31

>好像有些人得不到某些花色…

for(l=0;l<13;l++)
{
playerA[l] = num[l];
playerB[l] = num[l+1];
playerC[l] = num[l+2];
playerD[l] = num[l+3];
}

分給四個人的牌,改成以上,有好點嗎?懷疑您的程式跑得動嗎?char ch()應該是副程式吧!混在int main()裡…

 
——————————————————————————————————————————-
 
作者 : h789512346(又又)
2009/5/24 下午 08:47:17
謝謝大大

不過~

如果改這樣牌會重複耶>"<

 
——————————————————————————————————————————-
 
作者 : qazujm(joe)
2009/5/24 下午 09:46:41
>如果改這樣牌會重複耶>"<

在下弄錯了,問題是在洗牌,而不是發牌,請參考以下網址和程式,另外縮排空白會被吃掉,請善用空白行,程式碼比較好閱讀…

第二篇-知識+發牌程式
http://tw.myblog.yahoo.com/a9d92001/article?mid=2&prev=3&next=1

int n, m, o;
int max = 52;

for(int i=0; i <52;++i)
{
n = i%max;
m = rand()%max;

if(m!=n)
{
o=num[m];
num[m]=num[n];
num[n]=o;
} // 交換
}

for(l=0;l<13;l++)
{
playerA[l] = num[l];
playerB[l] = num[l+13];
playerC[l] = num[l+26];
playerD[l] = num[l+39];
}

 
——————————————————————————————————————————
 
作者 : h789512346(又又)
2009/5/24 下午 11:59:12

謝謝您的幫助

關於ch那裡

其實是同學教我的

我還不大懂

正在琢磨當中

不過程式是能跑的

謝謝您~我再努力看看囉~^^~

 
 
About these ads

About Joe Hung

Microsoft MVP Visual Basic
This entry was posted in VC++. Bookmark the permalink.

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s