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

2015年11月1日 星期日

Arithmetic Challenge Open2015開發紀錄

今天我把以前開發給學校學生使用的算術大挑戰(Arithmetic Challenge)改版開放給校外,主要是把消息Share在溫老師的備課Party,比較起來,這兒重視小朋友學習的老師或家長還是多一點吧!
程式網站的位置→http://163.26.23.3/app/math_game_ex/
這是一個主從式的程式,意思是程式在使用者的電腦上執行,背後卻可以和伺服器連動,很多電玩不都是這樣嗎?以這個程式來說,小朋友挑戰的成績可以上傳到伺服器配合的網站程式接收,這樣可以讓小朋友們比拼一下誰厲害。
原本結合在學校兒童學習網的後端
在這次的改版中,保留原本程式中算術項目功能,「個位數加法」、「二位數加法」]、[九九乘法]、[二位乘一位]、[100以內的減法],我覺得這些項目是小學生最需要的話題,簡單是簡單,就算是一位加一位的題目,如果趕你時間,就可能會出錯囉!
我趁這個機會,就把最近用的「憤怒鳥」加到畫面裡。
程式執行起來的畫面
當挑戰者(學生)按下開始後,程式會自動出題,共20題,題目在上方,答案會隨機出現在下面的八鈕之中,學生做完一題,程式會立刻出下一題,直到20題結束。
分數的核算方法:本程式計算成績的方法依據二個部份→答對的題數及所耗用的時間,而且連績答對還會有動態加分,如此設計的原因是希望學生能同時兼顧作答的正確性及速度。
進入測驗的畫面
我覺得我之前構思的計算分數的方法是蠻不錯的想法→想得高分,得兼顧速度和正確還有連續正確…,只是過去在學校實施,有很多學生的成績會很接近,使用的秒數有一樣的情形,那是因為之前的程式,我讓它每一秒核算一次所謂的「時間加分」,當許多認真的學生出現時,他們的成績會很接近,甚至一樣。
所以這一次,我修改程式這個部份,改為每0.1秒核算一次,我想這樣子,想同分的機會就不多了。

再來就是成績上傳這件事,原來的版本,小朋友測驗完後,想要上傳成績,會跳出一個視窗要求輸入帳號密碼,會送出到兒童學習網認証並取得學生的資料,再寫入成績表,所以可以上傳成績的都是本校的學生。
想讓程式改成讓學校之外的人上傳成績,以學習的角度來說,這絕對是很棒的事,但如何在上傳成績時進行「認証」變成一件很值得思考的事,我不可能要求凡是要上傳成績的人都來系統申請帳號,因為這樣會讓事情變複雜了,而且我也不想找自己的麻煩。
最後,我想了一個辦法,伺服器上不需要保有使用者的帳密,但大家都能以自己的名稱來上傳成績,且人不會有重疊的問題,就是某部電腦上執行這支程式而想上傳成績的,請家長或老師幫學生編輯一個我提供的文字檔,自行建立想要上傳的所有人資料(不違個資隱私的),然後mail給我(tnmongo@tn.edu.tw),而我只是打開來看看有沒有使用「不雅文字」的(我們教育單位總要注意一下)

我也不用費什麼工,只要寄來的檔,沒什麼問題,我就原樣地把這個檔放上網站上的某個程式知道的位置,而我會回信給寄信者一個「特殊號碼」,如果有某個老師為30個學生建了資料,他只要跟這些學生講這個「特殊號碼」,就算在家中的電腦,學生第一次想上傳成績時就可以利用這個號碼,取得這30個學生的帳號,可選擇自己,然後上傳成績。
用特殊號碼取得帳號資料

取得後,帳號那一欄就有人可以選了

※其實「特殊號碼」就是引導程式到成績網站上載回老師建的文字檔回放在C:\cw_arithmetic中,一個叫user.enc的檔,您是不是想說:「想搞怪的,這時再去改這個檔,不是一樣」,可沒這樣簡單,因為我已讓程式將它「編碼」,改不了的!
如果,有老師日後想增減或改變帳號資料,只要重寄文字檔給我(tnmongo@tn.edu.tw),我就會再回一個不同的「特殊號碼」,使用者只要將C:\cw_arithmetic\user.enc給刪了,程式就會讓它重從取得資料檔了!
※老實說,對於想出這個方法,我自己都覺得蠻得意的。

在網站端接收程式的部份,其實就蠻簡單的,不管是ASP或PHP…都可以寫的,只要能接受傳送來的數據,寫進DataBase就行了,也不會有什麼資訊安全問題,以想上傳成績的使用者來說,也不會有什麼隱私問題,可以不要寫自己的真名,只要能識別自己就行了,成績上傳的用意是讓小朋友知道「人上有人、天外有天」也許就會更認真…