討論區快速選單
知識庫快速選單
程式設計俱樂部Facebook粉絲團 最新Microsoft免費研討會行事曆
[ 回上頁 ] [ 討論區發言規則 ]
用c語言.亂數發牌.(需特殊排版)
更改我的閱讀文章字型大小
作者 : h789512346(又又)
[ 貼文 9 | 人氣 1 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
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("\n\n");
}



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) Visual Basic卓越專家C#優秀好手貼文超過1000則
[ 貼文 1493 | 人氣 2524 | 評價 8940 | 評價/貼文 5.99 | 送出評價 90 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
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(又又)
[ 貼文 9 | 人氣 1 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/5/24 下午 08:47:17
謝謝大大

不過~

如果改這樣牌會重複耶>"<
作者 : qazujm(joe) Visual Basic卓越專家C#優秀好手貼文超過1000則
[ 貼文 1493 | 人氣 2524 | 評價 8940 | 評價/貼文 5.99 | 送出評價 90 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
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(又又)
[ 貼文 9 | 人氣 1 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/5/24 下午 11:59:12
謝謝您的幫助

關於ch那裡

其實是同學教我的

我還不大懂

正在琢磨當中

不過程式是能跑的

謝謝您~我再努力看看囉~^^~
作者 : jonay(jonay) VC++優秀好手C++ Builder優秀好手C++優秀好手貼文超過500則
[ 貼文 887 | 人氣 8025 | 評價 5030 | 評價/貼文 5.67 | 送出評價 30 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/5/25 下午 05:07:18
我只說我看到的問題
int num [52];//0~51
for ( i=0 ; i<52 ;i++) //創造撲克牌
     num[i]=i+1; //1~52

for(j=0 ; j<13 ; j++)
{ // 洗牌
     k = num[rand()%52];//rand()%52 值為0~51,但k為1~52
     temp = num[j];
     num[j] = num[k];//你的num[52]不會爆掉嗎?
     num[k] = temp;
}

洗牌法很多種,如果要取二張互換,可以這樣用
for(int n=0;n<5000;n++)
{ //隨便取二個互換
    int nIndex1=rand()%52;//0~51
     int nIndex2=rand()%52;//0~51
     int nTemp= num[nIndex1];
     num[nIndex1]=num[nIndex2];
     num[nIndex2]=nTemp;
}
作者 : h789512346(又又)
[ 貼文 9 | 人氣 1 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/5/27 下午 06:34:11
後來我老師有說

因為dev c++

有些錯誤會抓不出來

--------------------

謝謝幫忙的大大

我這題已經寫ok嚕~^^~

希望有一天也能和各位一樣厲害~
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++曠世奇才新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4755 | 人氣 9172 | 評價 31210 | 評價/貼文 6.56 | 送出評價 138 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/5/27 下午 08:58:42
>後來我老師有說
>因為dev c++
>有些錯誤會抓不出來

Dev C++ 的編譯器是 MinGW, 它是 GCC 的視窗移植. 在目前版本的 default 設定下, 它用的是 GNU C 或 C++ 語言的延伸, 這些延伸並不符合語言標準, 比方說在你原貼程式裡面的 char ch() 函式定義. Nested functions 在 C 語言是不允許的, 但 GNU 的語言延伸卻支援.

如果你要編譯符合語言標準的程式, 你必須把 gcc 的延伸「關掉」. 用以下的編譯器設定:
  -ansi -pedantic -Wall
就可以抓出不符合標準之處.

 板主 : Daniel
 > 資訊類作業 - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - 資訊類作業 - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
資訊類作業
1 Raymond 4340 
2 Ben 2880 
3 青衫 2260 
4 ozzy 1260 
5 HKLN.net 1010 
6 Daniel 780 
7 joe 740 
8 小朱 570 
9 Benson 440 
10 鬼翼@娃娃魚 400 
資訊類作業
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2014 程式設計俱樂部 http://www.programmer-club.com.tw/
0.0625