2015年11月3日 星期二

寫一個電腦抽籤的程式

昨天,學校的教學組長提及有沒有辦法在校內語文競賽時,選手抽籤像全市比賽那樣,用電腦抽號!我直覺地回答:「這簡單呀!」(聽說主任本來要去找一下有沒有人在賣這種程式…)
其實,一切都是為了「比賽的公開與公平」,這個要從校內做起…,也是需要啦!
看了一下,全市比賽的抽籤程式用的是Excel巨集寫的,一來我不擅長那個,二來我想弄個漂亮點、功能好一點的,所以花了一下子來寫支「競賽抽籤程式」。
程式執行畫面

說來說去,就是電腦亂數啦!
程式裡的簡單說明
要用這支程式,首先就是建一個選手名單,要不然誰知道你要抽什麼?所以我很簡單地提供一個純文字的範本檔,使用者填好另存後,就可以當作給程式的Source了

為了呈現出公平中的公平,引入名單時還可以決定抽籤順序,免得有人連「誰先抽」也計較(※說實在的,有必要那麼計較小朋友的競賽得失嗎?學到了東西比較重要吧!)
接下來選手名單就會列表在左側的欄位裡了,這是主持人可以決定讓輪到的選手上來一個一個抽,或由電腦一次幫所有人抽好…
在這個部份,我就讓它呈現一點兒效果(正在抽及抽出號碼的畫面及音效)
正在抽號…

抽出來了…
我把這支程式放在網路上供有興趣的人→下載參考
※程式畫面我嵌死了忠義國小的校幑和學校名稱,不過那都是可以改掉的,如果有人有需要的話。
※寫這種程式,我想最重要的就是操摐亂數的技巧,以下面這個涵數(lua程式)來說,傳入一個數字 n 要求它在1~n之間取一個亂數,還要進行檢查這個數字在之間取過了沒
function num_set(n)
  g_no = Math.Random(n);
  g_tb_Count = Table.Count(g_tb);
  if g_b_Count == 0 then
Table.Insert(g_tb, 1, g_no);
  else
NumFind = false;
for i,j in pairs(g_tb) do
if g_no == j then NumFind = true; end
end
if not NumFind then
Table.Insert(g_tb, g_tb_Count+1, g_no);
end
  end
end
再來,我就會搭配一個迴圈來讓程式一直跑到我想要的所有亂數都產生為止,下面例子就是我想要電腦幫我跑出25個36以內的不重覆亂數來,呵呵…反正是電腦在忙!
   while g_tb_Count < 25 do
      num_set(36);
   end

1 則留言:

Unknown 提到...

請問一下這是什麼環境寫的?
如果要在抽籤的同時開啟設定好的webcam有辦法嗎? 謝謝您!