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就行了,也不會有什麼資訊安全問題,以想上傳成績的使用者來說,也不會有什麼隱私問題,可以不要寫自己的真名,只要能識別自己就行了,成績上傳的用意是讓小朋友知道「人上有人、天外有天」也許就會更認真…

2015年10月19日 星期一

Multiplication Chessboard的更新紀錄





在10月上旬將這個程式Share出去之後,有許多老師同好對「九九乘法遊戲板」感到興趣,所以我儘可能地快速Update它到我認為較完整的版本,主要就是加入對戰紀錄分析,我個人認為這可比遊戲本身更重要,也加入了一點音效…
加入可以逐手討論的區塊
若有大人或老師,在某場遊戲結束之後,引導小朋友(對戰者或其他人)一起來「回顧」每一手紀錄,這可以讓小朋友長智慧,因為不僅是單純的背熟九九乘法這麼陽春,它還包含觀察對方的局勢做出是要「進攻」或是「阻止」的決定!
以程式的角度來說,就是要在遊戲進行中,不斷地留下紀錄,所以我讓程式在啟始時,在使用者的電腦裡檢查並建一個目錄,就在C:\cw_cheesboard,遊戲進行時,程式會截取盤勢畫面及寫下使用者動作的log,最後在程式中增加一個區塊→「對戰分析區」
每一次的對戰會被以時間為標記留下來
選了對戰紀錄後,就可以進入那一場的檢討畫面。
在這一次的Update中,有鑑於目前螢幕或是單槍都是16:10的比例,且解析度也都不錯,便加出一版使用1200X800的版面,並用KIOSK模式(全螢幕遮蔽),結果老師們也大都認為不錯。
KIOSK模式執行的程式
不久之後(才釋出程式一二天),有位新市國小的大紅帽老師來商談,希望能改一版適合他的「全黑板投影」,還很認真地提出了他的需求,想說如果不要太費時,就舉手之勞一下…

原來現在有一些老師認為原本的教室投影模式(單槍投在布幕上)太不清楚,所以就投在黑板上,這樣還可以用粉筆加上去,算是一種巧思,也有書商的數位教材光碟也提供了所謂的「黑板投影模式」,其實很多年前,我去台北開會或研所上課時,就有教授把畫面直接投在白板上,加上白板筆說明課程,用黑板的話,在目前的教室應是不錯的啦,因為教室配的投影幕都是4:3的居多,早就跟不上時代了,只不過認真的老師,仍免不了要吃些「粉筆灰」…

投影在黑板上有二個重點:1.黑板是狹長型的。2.投影在黑板上對於內容的顏色是有限制的
還有,大紅帽老師希望利用鍵盤來控制程式…,嗯…這些要求對我來說也還算可以啦,不過我也沒太多時間就是了,而且看來他使用雙螢幕在玩(這麼有衝勁的老師現在也不多了),所以我也加了一個螢幕來試程式效果。
這時筆電是主螢幕,另一個就是副螢幕(二個解析度可設為不同)

發現程式一開始會執行於主螢幕,由於寬長於螢幕解析會被截斷,拖到副螢幕也不會自己恢復

加上二行程式就解決了

就下指令要求視窗重繪就是了
經過與大紅帽老師一番來來返返,整個程式也差不多了!他應該還能接受吧!畫面就像下面一樣,程式的版面是1580X426,在執行時,大紅帽老師打算把控制區留在主螢幕上,只有遊戲區拖到副螢幕上,而他的副螢幕就是他的單槍。
因應黑板投影所使用的顏色大概就幾種

我讓數字盤面隨著目前的玩家移動

整個程式應還算可行
※若您也此樂趣想要一試,可以在下面的連接下載到這個版本:
http://163.26.23.3/app/multiplication_chessboard/MultiplicationChessboard_v117.exe
附記:
◆大紅帽老師提供了幾種適合於黑板投影時使用的色彩,我想這應該是經驗法則,而且每個人的看法會有不同的。我把提供的16進位順便轉換成RGB模式表示在下面這個網站可以轉換
http://www.ifreesite.com/color/color-code-converter.htm
紫圓:#9600E1 RGB150,0,255
藍圓:#005AE1 RGB0,90,225
紅圓:#FF0066 RGB255,0,102
綠圓:#368700 RGB54,135,0
黃字:#FFFF00 RGB255,255,0
紅字:#E90080 RGB233,0,128
紫字:#6E00A5 RGB110,0,165

藍字:#00F0B0 RGB0,240,176
◆關於留下玩家每一手的對單紀錄,我用方法是讓程式去截取程式數字盤的影像存成jpg檔,這個部份其實很有程式難度,不過很幸運地,以前在開發論譠有一位厲害的荷蘭工程師SSIDE釋出了涵式作法,這需要dotNet2.0以上的支援,以前我就曾用在我的論文所開發的系統中,現在win7以上都內建.net framework,所以這部份能順利解決。
◆大紅帽老師所需要的鍵盤控制功能,在程式的實作上並不難達成,主要是將程式碼寫在ON key這一個event中就行了,當然得判斷一下使用者是按了哪個鍵?而電腦鍵盤的每個按鍵原本就有特定的代碼能讓程式截取
Decimal
Hex
Character
8
8
Backspace
9
9
Tab
13
D
Enter
16
10
Shift (both)
17
11
Ctrl (both)
18
12
Alt (both)
19
13
Pause
20
14
Caps Lock
27
1B
Esc
32
20
Spacebar
33
21
Page Up
34
22
Page Down
35
23
End
36
24
Home
37
25
(left arrow)
38
26
(up arrow)
39
27
(right arrow)
40
28
(down arrow)
45
2D
Insert
46
2E
Delete
48
30
0
49
31
1
50
32
2
51
33
3
52
34
4
53
35
5
54
36
6
55
37
7
56
38
8
57
39
9
65
41
A or a
66
42
B or b
67
43
C or c
68
44
D or d
69
45
E or e
70
46
F or f
71
47
G or g
72
48
H or h
73
49
I or i
74
4A
J or j
75
4B
K or k
76
4C
L or l
77
4D
M or m
78
4E
N or n
79
4F
O or o
80
50
P or p
81
51
Q or q
82
52
R or r
83
53
S or s
84
54
T or t
85
55
U or u
86
56
V or v
87
57
W or w
88
58
X or x
89
59
Y or y
90
5A
Z or z
91
5B
(left Windows key)
92
5C
(right Windows key)
93
5D
(application key - located between
the right Windows and Ctrl keys
on most keyboards)
96
60
0 (numpad with Num Lock on)
97
61
1 (numpad with Num Lock on)
98
62
2 (numpad with Num Lock on)
99
63
3 (numpad with Num Lock on)
100
64
4 (numpad with Num Lock on)
101
65
5 (numpad with Num Lock on)
102
66
6 (numpad with Num Lock on)
103
67
7 (numpad with Num Lock on)
104
68
8 (numpad with Num Lock on)
105
69
9 (numpad with Num Lock on)
106
6A
* (numpad)
107
6B
+ (numpad)
109
6D
- (numpad)
110
6E
. (numpad)
111
6F
/ (numpad)
112
70
F1
113
71
F2
114
72
F3
115
73
F4
116
74
F5
117
75
F6
118
76
F7
119
77
F8
120
78
F9
121
79
F10
122
7A
F11
123
7B
F12
144
90
Num Lock
145
91
Scroll Lock
186
BA
;
187
BB
=
188
BC
,
189
BD
-
190
BE
.
191
BF
/
192
C0
`
219
DB
[
220
DC
\
221
DD
]
222
DE
'
※還有一點可以提醒自己的,程式若是用到onkey的,在開始執行後一定要記得給一個命令focus住畫面上某一個物件,如此鍵盤的截取才會開始運作,還有當鍵盤模式處於中文狀態,不管按哪個鍵,返回值都會是229

2015年10月10日 星期六

開發Multiplication Chessboard紀錄

中秋節連假前的星期五(2015.9.25),我們利用下午沒有課務的時段,在圖書館辦了一場校內的研習:「桌遊在教學上的運用」,參加的就是幾位平時對於桌遊很有興趣的老師,像是内人(Spring Wu)和女兒(Irene Zheng)就是桌遊長期以來的支持者。所以在這小小的研習中,老婆帶了許多之前買的桌遊和其他老師及小朋友分享,也分享了最近在溫老師備課party中看到的資訊:有位邱老師分享了九九乘法盤遊戲的作法,大人和小孩都覺得效果很好。
剛好本人會寫點小程式,心想可以把這「寓教於樂」的想法化成程式,或二人玩或投影,若有電子白板的教室,豈不美事一件,就立刻動手…
※寫程式對自己也是很有幫助的,它可以促進腦細胞快速運動,讓一個人即使夜深了也不會累…哈哈!是隔天才會累
第一件事就是看著人家這張設計,想一下人家建議的玩法
分析原本構思者的想法很重要,它將成為程式最基本的樣子,這方面我算是還可以啦!過去也累積了許多經驗。

一開始先把想像中的畫面做出來
既為「程式」,程式碼才是最重要的,接下來就是思考畫面上的各種功能要如何佈置及靠程式碼去實現,這過程中充滿了腦海中對於未來運作程序的順序模擬,事件及動作,如果怎樣就怎樣…英文就是event→function→if xxx then else xxx,我寫程式的速度算是蠻快的(如果慢下來放著,就會不想寫了),很快地我就完成了基本樣式(約莫一二天中的空餘時間),也不能全部時間都拿來做這事,還是要上課、打球、家務事、也得睡覺…
第一階段最費腦袋的應該就是如何判斷所有三連環的情形,一想之下,情形真多…如何把它化為公式判斷是很重要的,像下方這樣:
function chk_line(user,point)
  if user == "user_green" then
    if String.Find(txt_user_green, "|" .. n-6 .. "|", 1, false) ~= -1 and String.Find(txt_user_green, "|" .. n+6 .."|", 1, false) ~= -1 then
      victory = true;
    end
  elseif user == "user_red" then
    if String.Find(txt_user_red, "|" .. n-6 .. "|", 1, false) ~= -1 and String.Find(txt_user_red, "|" .. n+6 .."|", 1, false) ~= -1 then
      victory = true;
    end
end
這大概花了我最多的時間來思考吧!
還有我也希望程式能吸引小朋友,剛好我家女兒很喜歡「Angry Birds」,所以裡頭如果能用Angry Birds圖案就不錯,但會不會有版權問題呢?上網找了一下,Angry Birds Playing CardDeck and Vector Characters,很棒的外國作者的作品,以創用CC 3.0釋出,看來應該可以使用

在程式中我也用了女兒(Irene Zheng)的手繪作品,寫程式的人特權就是愛用什麼素材就用什麼素材,可以完全客製化
玟琳喜歡畫Angry Birds(其中一張)
這個夠活化腦細胞的
經過一番努力,我完成了所謂的Beta版,迫不及待地請老婆女兒當首席測試員,看看有沒有什麼問題,果然就有問題,竟然出現了該獲勝,程式卻沒反應的情形,當然就是有Bug啦!
這程式是耍呆嗎?
這其實很平常啦!「哪有人吃燒誁餅不掉芝麻的!」寫程式哪有沒bug的,但這可又要想一下了,快速地掃視一下程式碼,果然原本的想法裡有漏洞,通常我會做筆記把情形寫下
這東西應該只有我自己看得懂
很幸運地!很快看出問題出在哪兒,就可以快速修正它,所有的邏輯思考到此應算完成了,接下來我就想為程式加些原本沒有的想法,免得遊戲太陽春了,所以我加入了進階版亂數盤面的功能和限時的功能,以及讓玩家能選擇代表圖的功能。
跑起來的畫面
先這樣吧!就Release了,這程式我放在http://163.26.23.3/app/multiplication_chessboard/,讓有興趣的同好們一起玩玩看,過二天有空,我還會繼續Update它,最終我想讓它和「兒童學習網」連接,取得學生的資訊,並可以上傳對戰歷程。
以下是一些程式中用到的畫面:都是用女兒畫的圖來做的



這是我個人最喜歡的咖菲貓

2015年9月6日 星期日

被雨水泡濕的遙遠筆記

前陣子迪迪颱風來襲,風強雨大,想不到舊家漏水了,很多放在那兒的東西就被泡到了,由於平時有點忙,搬到新家後就比較少到舊家(雖然才50公尺之遙),都是老爸在那兒整理東西、照顧他栽種的植物…
這次泡水了,出太陽後拿出來曬,一看,有幾本我以前寫的筆記本,我從學生時代就蠻喜歡寫筆記的,透過作筆記的時候可以把所學到的東西再整理一次,也當作打發時間…
泡到水了,曬太陽就變成這樣…
其實,我覺得做筆記這件事,重點在於寫的時候,我很少回頭看自己的筆記,我是透過寫筆記時,把知識再做一次的整理然後就記在腦子裡了,所以筆記本成了觀賞的用品,我不知道別人是否也這樣,但我個人的情形是如此…,也許有人會反覆地查看自己的筆記。
都是音樂相關的筆記

雖然本人的字不好看,但筆記倒不差
這是我剛去月眉時寫的

回想起來,我也還算蠻認真的
現在我仍常做筆記,可能是因為老了,所以筆記不再做完不看,反而是常常得拿出來看,也可能是因為話題不同的關係,電腦類的知識過於繁雜,有時不得不看一下,否則步驟太多記不住,我常跟小朋友說做筆記對於學東西的好處,尤其是學電腦知識…
現在的工具很多,不僅是手寫筆記,還可以輔以像是心智繪圖的方法來做筆記,當然囉!雖我不斷地鼓吹,但未必每個學生都能聽進去…

2015年5月4日 星期一

經營線上的獎品網

我想,經營店面著實不是件簡單的事,當然我說的是「認真經營」的前提下。這二天要來整理一下獎品網的獎品,有些之前建置的,店家已經沒貨了,要刪掉,有些當季的新鮮貨,我和主任前些日子去拍了許多,還帶了玟琳一起去,相機由她掌鏡。在做這些事務的同時也會發現程式管理介面不順手的地方,當下就修改程式以符合自己想要的功能…
找了玟琳來當小志工負責拍獎品照~給她Canon 550D

說起兒童學習網的緣由,十來年前因著迷於學習寫網路程式,整天東想西想可以發展成為程式的有用話題,當時流行起一種「虛擬幣」的風潮,靈光一閃,這種概念可以拿來運用於學校學生的學習激勵制度。
最近必須整理起獎品網,準備讓小朋友可以換獎,獎品的汰舊換新也是件工程
對於學生的好表現,不論功課上或是行為上,一般學校的手段就是給予獎勵,期待好的表現能夠強化或發展,而這也是大家普遍能接受的一種概念。學校有時給獎狀,有時給獎品,有時口頭讚美一下,小朋友就覺得非常受用了,但是「船過水無痕~」,大到足以有獎狀的好表現之外,小朋友更常有的是很多很多的小的好表現,可以收集起來嗎?這成為我發展「兒童學習網」的起始想法。
再者,以前學校總要儲存許多的存貨當學生的網品,我心想:是不是可以來個「買空賣空」,於是就有了線上獎品網的想法,只要找到固定的商家,談好概念,獎品就不用買來備著了,取而代之的是「拍照」,而且在網路上,學生可以看到的選擇可以更多樣化,有什麼不好呢?若要說不好處,就是要有個老師去「經營」這個「獎品網」!(當獎品越來越多,清除舊的、增加新的、尋找小朋友喜歡的又有意義的…),我可以體會網路上經營商品買賣的的店家辛苦之處,但人家是在賺錢,我們可沒錢賺!(學生換獎所衍生出來的經費是由家長會全部吸收的,實在感謝家長會,要不然是玩不下去的)
隨著我寫程式能力的進步,我以零件模式發展這組程式,套句小朋友的話,就是主核心程式產生後,其他的子程式區都是「外掛」,這組程式越來越ok,也能實際運用。但最大的難處其實並不在於寫程式的焚膏繼晷,而是我自認用這種方式可以帶給學校及學生貢獻,但事實上卻可能成為某些教學者的惡夢,主要是這個吧→「為什麼得做這種多餘的事!」,我知道我在做的這件事是學校經營者、家長、學生、少數老師都會大表認同且按讚的,但顯然很難討好另一群人…,當然沒有人是錯的,因為沒有人「犯法」!
志工家長及退休老師花那麼多時間做來贊助獎品網

退休的淑妃老師每次都提供很多作品

志工老師的手工作品很精美

根據以前的經驗,小朋友很喜歡換這些手工好物

我常在想的一件事是:如果你自己有孩子,你希望他(她)在怎樣的學習環境學習;你希望他(她)遇到怎樣的老師來教他(她),我們自己就應該去成為那樣的老師,努力地去建置好的教學場域,不是嗎?
之前我做了個簡報想要說服大家~