# 發牌程式

使用隨機取數，我們可以輕易地列出許多的亂數數值，但是，如果要像是撲克牌發牌的情況，每次都會隨機出現一張牌，但是這張牌卻不能和之前的任何一張一樣，因此不能直接很單純地使用隨機取數就可以完成，還需要更多的程式設計的想法以及做法。

如同前面單元中所介紹的，我們要使用2個變數來隨機取數，拿到的索引值如果兩個不同的話，就交換彼此的內容，效換的次數愈多，數字的順序就會愈亂喔。

由於撲克牌共有52張，因此要表示完整的一幅牌就需要準備一個清單，裡面有52個項目，而其中的內容則分別是0\~51，其中0表示黑桃A，1表示黑桃2，12表示黑桃K，13表示紅心A，依此類推。在這裡，撲克牌的花色順序把它設定為黑桃優先，紅心其次，梅花再其次，最後是方塊。

## 準備52張牌

這次，我們放牌的清單命名為deck，然後先準備52張牌如下：

![](https://3758851535-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8PFR2UvTkWwSK8m0%2F-LSyb7H0MXNjXHh8U8U-%2F-LSybGfdOXj-_4fPGegS%2F2018-12-05_21-43-56.png?alt=media\&token=3fd4731d-d0d1-4247-b3f5-d75d0f0ff583)

## 開始洗牌

同和上一單元的方法做洗牌的操作，由於牌有52張，所以重覆次數把它設為50，這樣子牌才可以洗得比較均勻一些，程式積木如下：

![](https://3758851535-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8PFR2UvTkWwSK8m0%2F-LSyb7H0MXNjXHh8U8U-%2F-LSybhzalinVDGAi1YGs%2F2018-12-05_21-46-27.png?alt=media\&token=a527cc8e-e2ef-4577-b0d7-41901ea0b771)

## 進行發牌

洗牌完成之後，就可以叫貓咪發牌了。其實，前面的5張，就是我們要的，如下所示：

![](https://3758851535-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8PFR2UvTkWwSK8m0%2F-LSyb7H0MXNjXHh8U8U-%2F-LSyd_P0ijeluRA-Rreq%2F2018-12-05_21-54-32.png?alt=media\&token=ab9b4a9d-47d5-475e-92a2-923af0403763)

此種方式會讓貓咪逐一說出5張牌的內容，不過，這樣並不容易讓使用者記住，因此，我們再使用另外一個字串變數來把5張牌的內容都加進去，再一次說出來，如下：

![](https://3758851535-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8PFR2UvTkWwSK8m0%2F-LSyb7H0MXNjXHh8U8U-%2F-LSyeZLnYZqSLuKJSG-t%2F2018-12-05_21-58-53.png?alt=media\&token=704d0073-b1cf-44c3-ac25-1fde535abc61)

改成上面這樣子，在點擊貓咪之後，過一小段時間就可以看到貓咪說出5張牌的結果，如下：

![](https://3758851535-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8PFR2UvTkWwSK8m0%2F-LSyb7H0MXNjXHh8U8U-%2F-LSyerj8ad6UUqByySyG%2F2018-12-05_22-00-06.png?alt=media\&token=2cbee96c-0a50-4a42-a2eb-73dcb0696cda)

## 分辨出不同的花色&#x20;

前面這樣直接說出牌的號碼，大部份的人都是看不出來到底是哪張牌的。還記得之前有說過把牌分成4組嗎？有了這個概念，拿到任何一個號碼的牌，只要用簡單的除法就可以知道它是什麼花色了。為了方便程式設計，我們再建立一個清單，用來放4個花色，如下：

![](https://3758851535-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8PFR2UvTkWwSK8m0%2F-LT-VAM-RJZ85TDeK5lN%2F-LT-VTdInR2btw-_7Ot9%2F2018-12-06_06-34-02.png?alt=media\&token=a651dad6-d123-4f0e-b687-da9238ce557e)

由於牌的編號是從0到51，因此0到12都是黑桃，13到25是紅心，依此類推，我們只要使用除法就可以得知哪一個編號是哪一個花色了。因此，以下的積木就可以得到0到51號的四種花色：

![](https://3758851535-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8PFR2UvTkWwSK8m0%2F-LT-c-tLOglb2Y4EDyw4%2F-LT-cFuDKcXI0ZCckZkJ%2F2018-12-06_07-08-05.png?alt=media\&token=edc435fe-95dc-44b6-b314-f07bbc7c8631)

同理，想要知道每一個花色內的數值大小，使用的是取餘數的函數，程式積木如下：

![](https://3758851535-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8PFR2UvTkWwSK8m0%2F-LT-c-tLOglb2Y4EDyw4%2F-LT-cTeimRJn7U0iooqD%2F2018-12-06_07-09-00.png?alt=media\&token=108d5cb9-1f47-4df1-950d-272fa1c00758)

為了簡化程式的設計，在此程式中，我們在一開始建立撲克牌清單時，本來是使用編號的方式，現在改為直接找出其花色和大小，修改後的程式積木如下：

![](https://3758851535-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8PFR2UvTkWwSK8m0%2F-LT-c-tLOglb2Y4EDyw4%2F-LT-d04OvzvXOihhkrdQ%2F2018-12-06_07-11-23.png?alt=media\&token=f135202d-e701-44a5-848b-cad7e5fb1c5c)

使用了上述的程式積木之後，重新執行所有的程式積木，此時貓咪所說出來的牌，就不再只是數字而已，而是加上了花色以及大小的牌，讓玩家可以知道到底是拿到什麼牌了。執行的結果如下：

![](https://3758851535-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8PFR2UvTkWwSK8m0%2F-LT-c-tLOglb2Y4EDyw4%2F-LT-dUXvL2T0iyprZcOw%2F2018-12-06_07-13-22.png?alt=media\&token=82f9eab3-1c88-4643-ad66-0c9b39b82ef8)

執行的過程影片如下：

{% embed url="<https://youtu.be/kGfCYqUTCrE>" %}

另外，如果是A和J、Q、K，同學們是否知道如何修改程式讓它們可以正確地顯示嗎？
