CyberPi 考試機製作

小巧的CyberPi用來作為答題機其實滿好玩的,這篇文章就來教同學們如何利用Python的元組串列以及迴圈,在CyberPi上製作一個有趣的考試機。程式一開始執行的時候,CyberPi就會連續出10個問題讓你回答,在答題完畢之後再顯示你所獲得的分數。

先來看一下執行的結果:

既然要出題給使用者回答,最重要的事當然是題目囉。除了題目之外,我們還需要給個答案,因此題目資料是以如下的形式來呈現:

items = [
    ('1.請問高科大有幾個校區?\nA.5個 B.3個', 'A'),
    ('2.請問梓官區位於哪一個縣市?\nA.高雄市 B.屏東縣', 'A'),
    ('3.請問高科大不分系位於哪一個校區?\nA.第一 B.楠梓', 'B'),
    ('4.以下哪一種魚的體型較大?\nA.龍膽石斑 B.金目鱸魚', 'A'),
    ('5.請問蚵仔寮漁港位於哪一個行政區?\nA.永安區 B.梓官區', 'B'),
    ('6.梓官區的農業主要北部還是南部?\nA.南 B.北', 'B'),
    ('7.蚵仔寮漁港漁市只拍賣自己的漁貨?\nA.是 B.不是', 'B'),
    ('8.現階段台灣現撈漁獲之冠是哪一個漁港?\nA.蚵仔寮 B.永安', 'A'),
    ('9.距離蚵仔寮漁港最近的高科大校區是?\nA.旗津 B.楠梓', 'B'),
    ('10.出海口離蚵仔寮漁港最近的是哪一條溪?\nA.典寶溪 B.後勁溪', 'A'),
    ]

在這個例子中我們總共出了10題,配合CyberPi的按鈕,在此設計的題目選項只有2個,分別是A和B,如果使用者按下按鈕A就等於是回答了A,同理按鈕B也等於是回答B。那麼,該如何取得使用者的回答呢?我們使用以下的程式碼,為了方便使用起見,這段程式碼設計成自訂函式get_answer():

def get_answer(answer):
    ret = False
    cp.controller.reset_count("a")
    cp.controller.reset_count("b")
    while cp.controller.get_count("a") == 0 and cp.controller.get_count("b") == 0:
        pass
    if answer=="A" and cp.controller.get_count("a")>0:
        ret = True
    elif answer=="B" and cp.controller.get_count("b")>0:
        ret = True
    return ret

自訂函式get_answer(answer)會先傳入正確的答案是’A’還是’B’,一開始假設回答的結果是錯的(ret=False),然後為了避免上次的按鈕狀態影響到本次的判斷,先把按鈕A和按鈕B的按鍵次數重置。接著,利用一個while迴圈等待A或B其中一個按鈕被按下,在按下之後,就根據標準答案answer的內容來核對是否是一致的按鈕,如果是的話,就把ret改為True。最終,再把答案回傳。

有了以上的資料和工具之後,主程式就容易多了,如下所示:

score = 0
for item in items:
    cp.display.clear()
    cp.console.println(item[0])
    if get_answer(item[1]):
        cp.audio.play("wow")
        score = score + 10
    else:
        cp.audio.play("sad")
cp.display.clear()
cp.display.show_label("{}分".format(score), 24, "center", "center")

一開始先把score變數設為0,然後利用for迴圈把每一個題目都取出來,先清除顯示幕,然後顯示出題目,再把標準答案送去get_answer()函式以等待使用者的按鍵狀態,依照答對或答錯計算分數以及顯示回應的音效。

在迴圈執行完畢,也就是所有的題目問完之後,再把最終的分數顯示在畫面的正中間即可。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *