用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)