系統公告
贊助商連結
行事曆
行事曆
Sep 2014
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
貼紙簿
阿穌共和國 開拓動漫祭 台灣同人誌販售會
輕旅行
個人檔案
個人圖檔
ID:marten
暱稱:
生日:1985/11/15
地區:桃園縣

公佈欄
有話想跟貂說
但是沒有yam帳號?
留言版或是
搜尋我的blog
搜尋:
人氣指數
當日人次:
累積人次:
我推薦誰
誰推薦我
誰來我家
好時光貼曆
文章分類
贊助商連結
RSS 訂閱
RSS2
ATOM
其它資訊
本部落所刊登之內容,皆由作者個人所提供,不代表 yam天空部落 本身立場。
POWERED BY
POWERED BY
會員登入免費註冊
December 12, 2008
雖然晚上九點就要考電子了
可是我真的沒動力唸書XDD
就po一下之前學弟問我的程式作業吧
不然『程式語言』這個分類根本沒更新過XD


這個程式的目的是:
        模擬真實情況下,將一副撲克牌隨機發13張牌,同一張牌不能出現兩次。
        然後簡單的排序一下。

不過做得不是很完善
可以改進的方向:
1.亂數發牌還不夠亂,還缺了兩三行程式碼。
2.『顯示目前發牌結果』的程式碼可以改寫成函式,可以讓程式碼比較簡潔一點。
3.排序時『兩張牌互換』應該也可以用函式表示。
4.其實『顯示發牌結果』時,不一定要用圖形啦...XD


#include<stdio.h>
#include<stdlib.h>

int main()
{
        int card[13][4];        //儲存牌是否被發過了,
    //第一維是點數,第二維是花色,
    //1代表發過了,0代表還沒發過

        int player[13][2];      //儲存拿到的牌

        int i, j;               //用來跑回圈
        int n;                  //牌的點數
        int c;                  //牌的花色
        int color;              //花色的圖案
        int temp;  //做排序時的暫存變數


        for(c=0;c<4;c++)        //先把所有牌設定成還沒被發過
                for(n=0;n<13;n++)
                        card[n][c]=0;

        for(i=0;i<13;i++)       //開始發牌
        {
                do{
                        n=rand()%13+1;
                        c=rand()%4;
        }while(card[n-1][c]);
        player[i][0]=n;
        player[i][1]=c;
        card[n-1][c]=1;
        }

        //顯示一次目前的發牌結果
        printf("玩家的牌為\n");
        for(i=0;i<13;i++)
        {
                n=player[i][0];
                c=player[i][1];

                switch(c)
                {
                        case 0:    //梅花
                        color=5;
                        break;

                        case 1:    //方塊
                        color=4;
                        break;

                        case 2:    //紅心
                        color=3;
                        break;

                        case 3:    //黑桃
                        color=6;
                        break;

                        default:
                        color='x';
                        break;
                }
                printf("第%d張%c\t%d\n",i,color,n);
        }

        //對牌的點數做由小到大的排序
        for(i=0; i<12; i++)
        {
                for(j=i+1; j<13; j++)
                {
                        if(player[i][0]>player[j][0])
                        {
                                temp = player[i][0];
                                player[i][0]=player[j][0];
                                player[j][0]=temp;
                                temp = player[i][1];
                                player[i][1]=player[j][1];
                                player[j][1]=temp;
                        }
                }
        }

        //顯示一次目前的發牌結果
        printf("對數字排序後玩家的牌為\n");
        for(i=0;i<13;i++)
        {
                n=player[i][0];
                c=player[i][1];

                switch(c)
                {
                        case 0:    //梅花
                        color=5;
                        break;

                        case 1:    //方塊
                        color=4;
                        break;

                        case 2:    //紅心
                        color=3;
                        break;

                        case 3:    //黑桃
                        color=6;
                        break;

                        default:
                        color='x';
                        break;
                };

                printf("第%d張%c\t%d\n",i,color,n);
        }

        //在數字相同時, 對花色做一次由小到大的排序
        for (i=0; i<12; i++)
        {
                if(player[i][0]==player[i+1][0])  //數字相同
                {
                        if(player[i][1]>player[i+1][1]) // 第i個的花色比第i+1個大
                        {
                                temp = player[i][0];
                                player[i][0]=player[i+1][0];
                                player[i+1][0]=temp;
                                temp = player[i][1];
                                player[i][1]=player[i+1][1];
                                player[i+1][1]=temp;
                        }
                }
        }

        //顯示一次目前的發牌結果
        printf("對花色排序後玩家的牌為\n");
        for(i=0;i<13;i++)
        {
                n=player[i][0];
                c=player[i][1];

                switch(c)
                {
                        case 0:    //梅花
                        color=5;
                        break;

                        case 1:    //方塊
                        color=4;
                        break;

                        case 2:    //紅心
                        color=3;
                        break;

                        case 3:    //黑桃
                        color=6;
                        break;

                        default:
                        color='x';
                        break;
                };

                printf("第%d張%c\t%d\n",i,color,n);
        }

        system("PAUSE");
}
 



好啦!
今天po過文章了
可以專心的唸書了吧XD



誰推薦這篇文章
引用 (你可以針對此文寫一篇屬於自己的blog/想法,並給作者一個通告)
引用
留言 (3筆)
3.
想問一下do...while那邊不是要是條件句
所以想請問一下while(card[n-1][c]) 括弧裡的意思
謝謝喔
 
板主回覆:
因為card矩陣記錄著4個花色各13張牌, 是否已經被發出在台面上
已經發過的牌, 會被標成 1
所以while(card[n-1][c]) 只是 while(card[n-1][c] == 1) 的省略寫法

那為什麼可以這樣省略呢?

條件句像 card[n-1][c] == 1 這樣的判斷
其實"判斷"也是一種function,
當判斷是true時, function會傳回 1
判斷不成立(false)則傳回0
你可以試試看直接把條件句印出來
printf("判斷成立的條件句 = %d", 2==2); // 輸出 1
printf("判斷不成立的條件句 = %d", 2!=2); // 輸出 0

再來講到C語言迴圈的特性
有試著寫過無窮迴圈嗎?
通常是 while( 1 ) 對吧?
那如果改成 while( 2 ) 呢? 其實也會進入迴圈
所以「迴圈只要括弧內"不是false", 就是true」
也就是說, 只要結果非0, 就會進入迴圈
因此對於while, for或 if , 不一定要寫條件句
也可以直接用變數內存的值去判斷

為了維持良好的寫作習慣, 避免他人不利閱讀你的程式碼
建議不要像我這麼懶惰啦XD
aaaaa8520 於 Mar 25, 2013 留言 |
2.
你的程式碼 哪裡隨機?
 
板主回覆:
都寫完的話, 你們作業要寫什麼呢?
這麼簡單的東西自己想辦法吧
好鳥 於 May 4, 2011 留言 |
1.
請問一下 如果是要發四家的牌這個要如何更改?
 
板主回覆:
呃...
下次我會加點註解
不過「int player[13][2]; 」這個陣列是來儲存「某一玩家的13張牌的花色和數字」
如果要發給多人
那就增加玩家吧...

(作業還是自己寫會比較好唷)
艾爾 於 Apr 12, 2010 留言 |
發表你的留言 (字數限制 最多 2000 個中文字)
私密留言:
Name:




內容:
檢視行動版網頁  |  檢視正常版網頁