發牌程式

同樣都是隨機數的應用,如果是骰子的話,只要很單純地使用隨機取數即可模擬目前的出現的值(1~6),而不用擔心是否會有重覆的點數出現的情形,但是撲克牌卻不一樣,因為同一副牌中每一張牌只有一張唯一的,在發牌的時候不能重覆出現,不然遊戲就進行不下去囉。

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

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

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

準備52張牌

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

開始洗牌

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

進行發牌

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

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

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

分辨出不同的花色

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

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

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

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

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

執行的過程影片如下:

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