[問題] 撲克牌程式

看板C_and_CPP作者 (Charlie)時間14年前 (2010/06/03 00:15), 編輯推噓4(4038)
留言42則, 4人參與, 最新討論串1/1
於LINUX平台C語言 我要撰寫一支發撲克牌的程式 要將五十二張撲克牌發給"四"個人 #include<stdio.h> #include<stdlib.h> #include<time.h> int a,b; int p[52]; void pm(int a){ if(a%13==0) printf("K"); else if(a%13==12) printf("Q"); else if(a%13==11) printf("J"); else if(a%13==10) printf("0"); else if(a%13==1) printf("A"); else printf("%d",a%13); } void pc(int b){ if(b<14) printf("@"); else if(13<b&&b<27) printf("$"); else if(26<b&&b<40) printf("#"); else printf("%%"); } void wish(){ int c,s,x; for(c=51;c>=1;c--){ s=rand()%c; x=p[s]; p[s]=p[c]; p[c]=x; }} void put(){ int i; for(i=0;i<52;i++){ if(i%4==0) printf("\n第%d位玩家",i/4+1); if(i%13==0) printf("\n"); pc(p[i]); pm(p[i]); printf(" "); }} main() { int p[52]={0}; int i,a; srand(time(0)); for(i=1;i<=52;i++) { p[i]=i; } wish(); put(); } wish是洗牌的函數 put是發牌的函數 不知道是哪裡出了錯 無法顯是想要的結果 我在想是不是我PUT函數寫錯了 麻煩各位幫我看一下 #$%@這四個符號表是花色 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.130.208.141

06/03 00:34, , 1F
應該改為for(i=0;i<52;i++){
06/03 00:34, 1F

06/03 00:36, , 2F
請問你想要怎樣改?我把你的程式抓下來跑,滿怪的。
06/03 00:36, 2F

06/03 00:38, , 3F
宣告p[52] 只有p[0]~p[51]這52個嗎@_@
06/03 00:38, 3F

06/03 00:38, , 4F
我需要發給四個人 但我不知道為什麼會跑出13個人
06/03 00:38, 4F

06/03 00:39, , 5F
然後都只發@K這張牌 是因為洗牌中的亂數用錯嗎??
06/03 00:39, 5F

06/03 00:40, , 6F
我有想過排好之後用亂數去跑 但是會重複說..
06/03 00:40, 6F

06/03 00:42, , 7F
會重複可以試著加上每張排的上限,去判斷
06/03 00:42, 7F

06/03 00:46, , 8F
答案很簡單 你的 main 的 p 和 wish / put 裡的 p 是不同的
06/03 00:46, 8F

06/03 00:46, , 9F
真玄= =怎麼都會是13人
06/03 00:46, 9F

06/03 00:47, , 10F
所以你在 main 裡對 p 的初始化是對 main 裡的 p 初始化
06/03 00:47, 10F

06/03 00:47, , 11F
那個全域的 p 就會沒有初始化 才會全部都是 @K
06/03 00:47, 11F

06/03 00:47, , 12F
所以要改MAIN裡頭的字串名稱嗎??
06/03 00:47, 12F

06/03 00:48, , 13F
你在MAIN裡面不用再宣告P
06/03 00:48, 13F

06/03 00:49, , 14F
讀取的時候會先抓區域的,如果沒有才去抓全域
06/03 00:49, 14F

06/03 00:50, , 15F
恩 那為什麼會是13個人呀..好奇妙
06/03 00:50, 15F

06/03 00:52, , 16F
我還在研究,真玄...
06/03 00:52, 16F

06/03 00:53, , 17F
你那些IF的判斷,可以改成用SWITCH會比較好
06/03 00:53, 17F

06/03 00:53, , 18F
應該是發牌函數那出錯..可是我找不出哪裡寫錯了
06/03 00:53, 18F

06/03 00:56, , 19F
你if(i%4==0) printf("\n第%d位玩家",(i%4+1));
06/03 00:56, 19F

06/03 00:56, , 20F
這裡的邏輯有錯,他一定會是4的倍數
06/03 00:56, 20F

06/03 00:56, , 21F
那你又把他除以4...那不就會是有問題。
06/03 00:56, 21F

06/03 00:59, , 22F
if(i%13==0) printf("\n第%d位玩家",(i/13)+1);
06/03 00:59, 22F

06/03 00:59, , 23F
這樣好像可以說
06/03 00:59, 23F

06/03 01:00, , 24F
有做出來就好啦。
06/03 01:00, 24F

06/03 01:01, , 25F
謝謝唷~
06/03 01:01, 25F

06/03 01:04, , 26F
想請教一個問題 就是你說每張牌的上限 那要怎麼去做呀?
06/03 01:04, 26F

06/03 01:06, , 27F
我個人發牌的方式,我是會陣列初始固定的
06/03 01:06, 27F

06/03 01:07, , 28F
就黑陶1~13之後紅心1~13接好順序
06/03 01:07, 28F

06/03 01:08, , 29F
然後要出那張排就用RANDOM隨便抽一張。
06/03 01:08, 29F

06/03 01:08, , 30F
設定一個陣列52個依序擺進去嗎?
06/03 01:08, 30F

06/03 01:08, , 31F
但是要記得判斷那張牌友沒有抽過了。
06/03 01:08, 31F

06/03 01:09, , 32F
就宣告的int cards[3][12]
06/03 01:09, 32F

06/03 01:10, , 33F
我是想到前面是花色,後面是號碼。
06/03 01:10, 33F

06/03 01:10, , 34F
如果抽過就把內容歸0。這樣就之道友抽過。
06/03 01:10, 34F

06/03 01:11, , 35F
恩 我之前是過類似的方法 但不知怎麼判斷哪張抽過說
06/03 01:11, 35F

06/03 01:13, , 36F
我是想到用歸0的,if(cards[i][j] != 0)發給別人。
06/03 01:13, 36F

06/03 01:15, , 37F
不太懂說 可以麻煩解釋一下嘛
06/03 01:15, 37F

06/03 01:18, , 38F
是已經取出所以裡面會等於0嗎??
06/03 01:18, 38F

06/03 01:22, , 39F
你把他發出去的時候,同時加上cards[i][j] =0
06/03 01:22, 39F

06/03 01:23, , 40F
之後如果判斷那格是0就知道已經發過,要在重新選一次
06/03 01:23, 40F

06/03 01:23, , 41F
這樣就不會重複發牌了。
06/03 01:23, 41F

06/03 01:25, , 42F
恩恩~謝謝唷~
06/03 01:25, 42F
文章代碼(AID): #1C1eEmqy (C_and_CPP)