老師在上課的時候總是有需要抽籤的情況,我們就來寫一個小小的APP來幫老師的忙喔。此次我們打算設計的APP之介面及功能如下圖所示,它具備有指定抽籤號碼的範圍,以及可以設定每一次要抽選的人數之功能:

每次要用程式抽籤的時候,第一個想到的就是直接使用隨機函數,只要選用該函數就會傳回一個指定範圍內的任一數字,而在清單中也有一個功能積木是用來傳回清單中的任一項目,此二積木如下所示:

但是直接使用此兩積木會有一個小小的問題要解決,就是它沒有辦法排除之前已經抽選過的號碼,所以為了要確保本次的抽籤過程中每一個人只能被抽選一次,還需要再加上一些程式碼來做到這樣的功能才行。先來看看我們這個APP中會使用到的元件:

在這個APP中主要有三個按鈕可以使用,其中一個是重置及建立籤桶,它也是要執行抽籤功能的第一個步驟。此外,使用者可以透過「譏更抽選人數」隨時候改每一次要抽選的人數,最後,當然「抽籤」按鈕就是用來進行抽籤的啟動鈕。所有被抽中的號碼,都會被放在ListView1這個元件中(清單顯示器)。

為了要做到不會重覆抽選到同樣的號碼,我們用了一個叫做「籤桶」的清單,方便每一次抽中號碼的時候就把該號碼從清單中移除。此外,為了要記錄每一次打算抽選多少人,還要建立一個叫做「抽選人數」的變數,以及,每次有人中籤了,就要把該號碼放「中籤人清單」中,三個全域變數如下所示:

當程式一開始執行的時候,一定要從重置籤桶開始,所以只有該按鈕可以被使用,其它的都要設定為不能使用,初始化的程式積木如下:

此時,當使用者按下「重置籤桶」時,要開始把所有的號碼從最小值到最大值,依序放入籤桶清單中,放完之後,別忘了要把另外兩個按鈕啟用,積木如下所示:

在上述的積木中呼叫了一個「變更訊息」的程序,它的目的在於顯示目前的抽選人數,以及目前籤桶中還有多少人沒有被抽選到,其內容如下所示:

因為籤桶中就是放置還沒有被移除的號碼,而其項目數目(也就是清單長度)當然就是還沒有被抽中的人數。此時,如果打算要變更每次抽選人數時,按下按鈕時只要呼叫Notifier1就好了,如下所示:

真正處理變數抽選人數的地方,是在完成輸入之後的事件,如下所示:

在上述的程式中不是單純只是依照回應設定描籤人數而已,最重要的是要比較目前還可以抽選的人數(也就是目前籤桶中的項目數),如果比設定的人數還少的話,是不能被設定的。最後,是開始抽籤的按鈕:

在上述的程式積木中,我們先把中籤人清單清空,接著依照要抽選的人數逐一到籤桶清單中以隨機的方式選出,選出之後別忘了除了把它增加到中籤人清單中之外,也要記得把它從籤桶中移除,以避免重覆抽選到相同的號碼。此外,由於在中籤之後要移除籤桶的內容,如果此時籤桶是空的會出現程式錯誤,因此在抽籤之前一定先要確定籤桶不是空的才行,如果是空的直接略過即可。在執行完所有的抽選動作之外,再檢查一下是否籤桶已經是空的了,如果是的話,就把抽籤和變更抽選人數的按鈕設定為不可用,強迫使用者要重置籤桶才行。

(2318)