用micro:bit合作學習拼單字

許多人拿到micro:bit,會把手頭有的各種感測器、馬達和micro:bit結合,做出許多具有創意的機構,如自走車、微型機器人等,把micro:bit當做是新版的arduino,創意十足。但是,我手頭的這些東西實在不多,我甚至連馬達驅動板都沒有,所以,我就只能把micro:bit這個單板看看如何能夠玩到極致。

micro:bit這個東西,大部份可用在資訊或是生活科技領域的教學中,但是,今天,我要把它用在英文教學,讓micro:bit的功能展現在更多的學習領域當中。背英文單字是大部份的人可能會經歷過的事,今天設計的小程式,讓多人的小組可以用合作學習的方式來拼英文單字,透過合作學習的方式,讓學生能討論單字中英文字母的順序,並進而能讓他們在遊戲的趣味中背熟英文單字。相關的教學示例及micro:bit的用法,請參考以下的影片示例:

每個拿到micro:bit的學生,都會被分配到一個字母

micro:bit除了資訊及生活科技領域之外,也可以適當的使用在其他的學習領域當中

他們必須討論出正確的字母順序,以便拼出正確的英文單字

使用水銀電池的擴展板,可讓micro:bit的使用更方便

相關用法請參閱以上的影片說明來使用,至於要用到多少micro:bit,就看要測驗的單字有多少個字母,就準備幾個,所以要測驗的單字,它的字母數最好一樣,如果不一樣,最好後面要補上適當長度的空白,讓每個單字的長度相同。以下的教師端的程式,若想要增加更多單字或是要用更長的單字,則請修改以下程式的最後一行(記得,每個單字的長度要一樣),每個單字前後都要用英文的雙引號包住,單字和單字中間要有個半形的逗號。將以下的程式碼貼上https://makecode.microbit.org/裡面的javascript頁面後,即可下載安裝進micro:bit,但是,請記住,不要再點選讓它轉成積木程式,因為裡面的內容有些複雜了,積木程式無法處理,讓它轉成積木程式的話有些部份會轉不出來而不正常。

教師端micro:bit的程式

let arrayStr: string[] = []
let myString = ""
let myBits: string[] = []
let arrayAns: number[] = []
let selectedStr = 0
let tempNum = 0
let equal = false
let counts = 0
let corrects = 0
input.onButtonPressed(Button.B, () => {
    selectedStr += 1
    if (selectedStr > arrayStr.length - 1) {
        selectedStr = arrayStr.length - 1
    }
    basic.showNumber(selectedStr + 1)
})
input.onButtonPressed(Button.A, () => {
    selectedStr += 0 - 1
    if (selectedStr < 0) {
        selectedStr = 0
    }
    basic.showNumber(selectedStr + 1)
})
radio.onDataPacketReceived(({ receivedString: receivedName, receivedNumber: receivedValue }) => {
    if (receivedName.charAt(0) == "A") {
        checkAns(parseInt(receivedName.substr(1)), receivedValue)
    } else if (receivedValue == -1) {
        myBits.push(receivedName)
        radio.sendValue(receivedName, myBits.length - 1)
        basic.showNumber(myBits.length)
    }
})
input.onButtonPressed(Button.AB, () => {
    setBitsChar()
})
function checkAns(cIndex: number, cAns: number) {
    counts++
    if (counts <= myString.length) {
        if ((arrayAns[cIndex] == cAns) || (myString.charAt(cAns) == myString.charAt(arrayAns[cIndex]))) {
            corrects++
        }
        if (counts == myString.length) {
            if (counts == corrects) {
                radio.sendValue("Good", 0)
                basic.showString("Good!")
            } else {
                counts = 0
                corrects = 0
                radio.sendValue("Wrong", 0)
                basic.showString("Wrong!")
            }
        }
    }
}

function setBitsChar() {
    counts = 0
    corrects = 0
    tempNum = 0
    arrayAns = []
    myString = arrayStr[selectedStr]
    radio.sendValue(myString, -2)
    tempNum = Math.random(myString.length)
    arrayAns.push(tempNum)
    for (let i = 1; i <= myString.length - 1; i++) {
        equal = true
        while (equal) {
            tempNum = Math.random(myString.length)
            for (let j = 0; j < arrayAns.length; j++) {
                equal = (arrayAns[j] == tempNum)
                if (equal) {
                    break
                }
            }
        }
        if (!equal) {
            arrayAns.push(tempNum)
        }
    }
    for (let k = 0; k <= arrayAns.length - 1; k++) {
        radio.sendValue("" + k, arrayAns[k])
        basic.pause(1)
    }
    basic.showIcon(IconNames.Yes)
}
arrayAns = []
selectedStr = 0
tempNum = 0
counts = 0
equal = false
myBits = []
myString = ""
radio.setGroup(1)
//要修改測驗的內容單字,請自行修改以下這一行陣列內容
arrayStr = ["dog", "mom", "how","cat","age","ago"]

學生端的micro:bit,看測驗題目單字的長度有幾個字母,就要準備幾個micro:bit,把以下的程式安裝進所有學生端的micro:bit即可:

let myChar = ""
let myString = ""
let myIndex = 0
let rightAns = 0
let myChoice = 0
let answering = false
radio.onDataPacketReceived(({ receivedString: receivedName, receivedNumber: receivedValue }) => {
    if (receivedName == "" + control.deviceSerialNumber()) {
        myIndex = receivedValue
        basic.showNumber(myIndex)
    } else if (receivedName == ("" + myIndex)) {
        rightAns = receivedValue
        myChar = myString[rightAns]
        basic.showString(myChar)
    } else if (receivedName == "Good") {
        clearData()
        basic.showIcon(IconNames.Yes)
    } else if (receivedName == "Wrong") {
        basic.showIcon(IconNames.No)
        basic.pause(1000)
        basic.showString(myChar)
        answering = false
    } else if (receivedValue == -2) {
        clearData()
        myString = receivedName
    }
})
input.onButtonPressed(Button.A, () => {
    if (!answering && myChar != "") {
        myChoice += 0 - 1
        if (myChoice < 0) {
            myChoice = 0
        }
        basic.showNumber(myChoice + 1)
    }
})
input.onButtonPressed(Button.B, () => {
    if (!answering && myChar != "") {
        myChoice += 1
        if (myChoice > myString.length - 1) {
            myChoice = myString.length - 1
        }
        basic.showNumber(myChoice + 1)
    }
})
input.onButtonPressed(Button.AB, () => {
    if (!answering && myChar != "") {
        radio.sendValue("A" + myIndex, myChoice)
        basic.showString("?")
        answering = true
    }
})

function clearData() {
    myChar = ""
    myString = ""
    rightAns = -1
    myChoice = -1
    answering = false
}

basic.showString("?")
radio.setGroup(1)
myIndex = -1
clearData()
radio.sendValue("" + control.deviceSerialNumber(), myIndex)