写真は簡易キーボードw
無線機能を組み込んで対になる相方「くす玉くん」を手が空いたら実装します。
プログラムは こちら(Gooblog相変わらずLinkが張れんクソ仕様)
=================
/**
* ■ レベル選択
*
* 起動時の規定レベルは2
*
* 起動時3秒以内にAボタンを押すとレベル選択モードに入る
*
* Aを押すと2->3->1->2・・とサイクリックに増加する
*
* Bを(ちょっと長めに)押すとその値で起動する(当然記憶は出来ません)
*
* 「Levelパラメータ設定」ルーチンで難易度を設定する
*
* ゲーム中Bを押すとLevel値を表示する
*
* ■ 自動デモモード
*
* 一定期間アクセ無いとフルカラーデモモードに遷移する
*
* ■ ゲーム
*
* Aボタンを押すと、配列最後に置いたLEDがレベルに応じた速度で配列[0]に向けて走ってくる
*
* ターゲットは中央あるいはランダムな位置に現れる白いLED
*
* Pin1に繋いだ外部ボタンでこれを止めてターゲットとの距離が近いとWin
*
* Bで停止などもやってみたが割り込み速度の遅さでkントロールがムズいため、外部スイッチに切り替えた
*
* 走る速度はLevel変数の値ごとすっ飛ばしてやってくる(Level1は1コマごと、Level3は3駒ごと)
*
* ■ 「ずっと」の役割
*
* P1に繋がれたボタンの押下を監視する
*
* キー入力なし時間の監視とオーバー時のmicro:bitリセット
*
* リセットがかかって誰もキー操作をしないと自動的に「デモ」モードに入る仕組みです。
*
* ■ 勝者/敗者へのお祝い
*
* それっぽいLEDのカラーとチープな音で盛り上/下げる
*
* ■ 用意丼
*
* カウントダウンの表示+効果音
*
* ■ 他装置制御
*
* 無線で他のmicro:bitへ結果を伝える
*
* 他の機器はくす玉を割ったりLEDを点滅したりクラッカーを飛ばしたりと盛り上げる予定
*
* 2024/9/10
*/
function デモ () {
strip.setBrightness(8)
work = strip.length() / 2
range = strip.range(0, work - 1)
range.showRainbow(1, 360)
range2 = strip.range(work, work)
range2.showRainbow(1, 360)
strip.show()
strip.setPixelColor(work - 1, neopixel.colors(NeoPixelColors.White))
basic.pause(500)
while (!(input.buttonIsPressed(Button.A)) && !(input.buttonIsPressed(Button.B))) {
range.rotate(1)
range2.rotate(-1)
strip.show()
basic.pause(20)
最終アクセス時間 = control.millis()
}
LED初期化()
}
input.onButtonPressed(Button.A, function () {
if (startGame == 1) {
levelパラメータ設定()
strip.clear()
strip.setPixelColor(strip.length() - 1, neopixel.colors(NeoPixelColors.Blue))
strip.setPixelColor(当たり位置, neopixel.colors(NeoPixelColors.White))
strip.show()
停止命令 = 0
弾の位置 = 143
用意丼()
while (弾の位置 >= 0) {
strip.clear()
strip.setPixelColor(弾の位置, neopixel.colors(NeoPixelColors.Blue))
strip.setPixelColor(当たり位置, neopixel.colors(NeoPixelColors.White))
strip.show()
basic.pause(1)
if (停止命令 == 1) {
strip.setPixelColor(弾の位置, neopixel.colors(NeoPixelColors.Red))
strip.show()
break;
}
弾の位置 += Level * -1
}
当たり判定()
}
最終アクセス時間 = control.millis()
})
function 当たり判定 () {
if (Math.abs(弾の位置 - 当たり位置) <= 誤差) {
basic.showIcon(IconNames.Square)
strip.setBrightness(8)
music._playDefaultBackground(music.builtInPlayableMelody(Melodies.Entertainer), music.PlaybackMode.InBackground)
for (let index = 0; index < 3; index++) {
strip.showRainbow(1, 360)
strip.show()
basic.pause(500)
strip.clear()
strip.show()
basic.pause(500)
}
strip.setBrightness(255)
strip.setPixelColor(弾の位置, neopixel.colors(NeoPixelColors.Red))
strip.setPixelColor(当たり位置, neopixel.colors(NeoPixelColors.White))
strip.show()
} else {
music._playDefaultBackground(music.builtInPlayableMelody(Melodies.Wawawawaa), music.PlaybackMode.InBackground)
basic.showIcon(IconNames.No)
}
}
function levelパラメータ設定 () {
if (Level == 1) {
当たり位置 = strip.length() / 2
誤差 = 2
} else if (Level == 2) {
当たり位置 = strip.length() / 2 + randint(-40, 20)
誤差 = 2
} else {
当たり位置 = strip.length() / 2 + randint(-40, 20)
誤差 = 3
}
}
function Level変更 () {
while (!(input.buttonIsPressed(Button.B))) {
basic.showNumber(Level)
if (input.buttonIsPressed(Button.A)) {
Level += 1
最終アクセス時間 = control.millis()
}
if (Level > 3) {
Level = 1
}
basic.pause(10)
}
basic.showString("SET")
}
input.onButtonPressed(Button.B, function () {
最終アクセス時間 = control.millis()
basic.showNumber(Level)
})
function LED初期化 () {
strip = neopixel.create(DigitalPin.P2, 144, NeoPixelMode.RGB)
strip.setBrightness(255)
strip.showColor(neopixel.colors(NeoPixelColors.Black))
}
function 用意丼 () {
count = 3
for (let index = 0; index < 3; index++) {
basic.showNumber(count)
strip.setPixelColor(143, neopixel.colors(NeoPixelColors.Green))
strip.show()
music.play(music.tonePlayable(392, music.beat(BeatFraction.Half)), music.PlaybackMode.InBackground)
strip.setPixelColor(143, neopixel.colors(NeoPixelColors.Black))
strip.show()
music.rest(music.beat(BeatFraction.Whole))
count += -1
}
basic.showNumber(0)
music.play(music.tonePlayable(523, music.beat(BeatFraction.Double)), music.PlaybackMode.InBackground)
}
let count = 0
let 誤差 = 0
let 弾の位置 = 0
let 停止命令 = 0
let 最終アクセス時間 = 0
let range2: neopixel.Strip = null
let range: neopixel.Strip = null
let work = 0
let 当たり位置 = 0
let strip: neopixel.Strip = null
let Level = 0
let startGame = 0
LED初期化()
startGame = 0
Level = 2
for (let index = 0; index < 30; index++) {
if (input.buttonIsPressed(Button.A) || input.buttonIsPressed(Button.B)) {
Level変更()
break;
}
basic.pause(100)
}
デモ()
pins.setPull(DigitalPin.P1, PinPullMode.PullUp)
strip.setPixelColor(143, neopixel.colors(NeoPixelColors.Blue))
strip.setPixelColor(当たり位置, neopixel.colors(NeoPixelColors.White))
strip.show()
startGame = 1
basic.forever(function () {
if (startGame == 1) {
if (pins.digitalReadPin(DigitalPin.P1) == 0) {
停止命令 = 1
最終アクセス時間 = control.millis()
}
basic.pause(1)
if (control.millis() - 最終アクセス時間 > 60000) {
control.reset()
}
}
})
* ■ レベル選択
*
* 起動時の規定レベルは2
*
* 起動時3秒以内にAボタンを押すとレベル選択モードに入る
*
* Aを押すと2->3->1->2・・とサイクリックに増加する
*
* Bを(ちょっと長めに)押すとその値で起動する(当然記憶は出来ません)
*
* 「Levelパラメータ設定」ルーチンで難易度を設定する
*
* ゲーム中Bを押すとLevel値を表示する
*
* ■ 自動デモモード
*
* 一定期間アクセ無いとフルカラーデモモードに遷移する
*
* ■ ゲーム
*
* Aボタンを押すと、配列最後に置いたLEDがレベルに応じた速度で配列[0]に向けて走ってくる
*
* ターゲットは中央あるいはランダムな位置に現れる白いLED
*
* Pin1に繋いだ外部ボタンでこれを止めてターゲットとの距離が近いとWin
*
* Bで停止などもやってみたが割り込み速度の遅さでkントロールがムズいため、外部スイッチに切り替えた
*
* 走る速度はLevel変数の値ごとすっ飛ばしてやってくる(Level1は1コマごと、Level3は3駒ごと)
*
* ■ 「ずっと」の役割
*
* P1に繋がれたボタンの押下を監視する
*
* キー入力なし時間の監視とオーバー時のmicro:bitリセット
*
* リセットがかかって誰もキー操作をしないと自動的に「デモ」モードに入る仕組みです。
*
* ■ 勝者/敗者へのお祝い
*
* それっぽいLEDのカラーとチープな音で盛り上/下げる
*
* ■ 用意丼
*
* カウントダウンの表示+効果音
*
* ■ 他装置制御
*
* 無線で他のmicro:bitへ結果を伝える
*
* 他の機器はくす玉を割ったりLEDを点滅したりクラッカーを飛ばしたりと盛り上げる予定
*
* 2024/9/10
*/
function デモ () {
strip.setBrightness(8)
work = strip.length() / 2
range = strip.range(0, work - 1)
range.showRainbow(1, 360)
range2 = strip.range(work, work)
range2.showRainbow(1, 360)
strip.show()
strip.setPixelColor(work - 1, neopixel.colors(NeoPixelColors.White))
basic.pause(500)
while (!(input.buttonIsPressed(Button.A)) && !(input.buttonIsPressed(Button.B))) {
range.rotate(1)
range2.rotate(-1)
strip.show()
basic.pause(20)
最終アクセス時間 = control.millis()
}
LED初期化()
}
input.onButtonPressed(Button.A, function () {
if (startGame == 1) {
levelパラメータ設定()
strip.clear()
strip.setPixelColor(strip.length() - 1, neopixel.colors(NeoPixelColors.Blue))
strip.setPixelColor(当たり位置, neopixel.colors(NeoPixelColors.White))
strip.show()
停止命令 = 0
弾の位置 = 143
用意丼()
while (弾の位置 >= 0) {
strip.clear()
strip.setPixelColor(弾の位置, neopixel.colors(NeoPixelColors.Blue))
strip.setPixelColor(当たり位置, neopixel.colors(NeoPixelColors.White))
strip.show()
basic.pause(1)
if (停止命令 == 1) {
strip.setPixelColor(弾の位置, neopixel.colors(NeoPixelColors.Red))
strip.show()
break;
}
弾の位置 += Level * -1
}
当たり判定()
}
最終アクセス時間 = control.millis()
})
function 当たり判定 () {
if (Math.abs(弾の位置 - 当たり位置) <= 誤差) {
basic.showIcon(IconNames.Square)
strip.setBrightness(8)
music._playDefaultBackground(music.builtInPlayableMelody(Melodies.Entertainer), music.PlaybackMode.InBackground)
for (let index = 0; index < 3; index++) {
strip.showRainbow(1, 360)
strip.show()
basic.pause(500)
strip.clear()
strip.show()
basic.pause(500)
}
strip.setBrightness(255)
strip.setPixelColor(弾の位置, neopixel.colors(NeoPixelColors.Red))
strip.setPixelColor(当たり位置, neopixel.colors(NeoPixelColors.White))
strip.show()
} else {
music._playDefaultBackground(music.builtInPlayableMelody(Melodies.Wawawawaa), music.PlaybackMode.InBackground)
basic.showIcon(IconNames.No)
}
}
function levelパラメータ設定 () {
if (Level == 1) {
当たり位置 = strip.length() / 2
誤差 = 2
} else if (Level == 2) {
当たり位置 = strip.length() / 2 + randint(-40, 20)
誤差 = 2
} else {
当たり位置 = strip.length() / 2 + randint(-40, 20)
誤差 = 3
}
}
function Level変更 () {
while (!(input.buttonIsPressed(Button.B))) {
basic.showNumber(Level)
if (input.buttonIsPressed(Button.A)) {
Level += 1
最終アクセス時間 = control.millis()
}
if (Level > 3) {
Level = 1
}
basic.pause(10)
}
basic.showString("SET")
}
input.onButtonPressed(Button.B, function () {
最終アクセス時間 = control.millis()
basic.showNumber(Level)
})
function LED初期化 () {
strip = neopixel.create(DigitalPin.P2, 144, NeoPixelMode.RGB)
strip.setBrightness(255)
strip.showColor(neopixel.colors(NeoPixelColors.Black))
}
function 用意丼 () {
count = 3
for (let index = 0; index < 3; index++) {
basic.showNumber(count)
strip.setPixelColor(143, neopixel.colors(NeoPixelColors.Green))
strip.show()
music.play(music.tonePlayable(392, music.beat(BeatFraction.Half)), music.PlaybackMode.InBackground)
strip.setPixelColor(143, neopixel.colors(NeoPixelColors.Black))
strip.show()
music.rest(music.beat(BeatFraction.Whole))
count += -1
}
basic.showNumber(0)
music.play(music.tonePlayable(523, music.beat(BeatFraction.Double)), music.PlaybackMode.InBackground)
}
let count = 0
let 誤差 = 0
let 弾の位置 = 0
let 停止命令 = 0
let 最終アクセス時間 = 0
let range2: neopixel.Strip = null
let range: neopixel.Strip = null
let work = 0
let 当たり位置 = 0
let strip: neopixel.Strip = null
let Level = 0
let startGame = 0
LED初期化()
startGame = 0
Level = 2
for (let index = 0; index < 30; index++) {
if (input.buttonIsPressed(Button.A) || input.buttonIsPressed(Button.B)) {
Level変更()
break;
}
basic.pause(100)
}
デモ()
pins.setPull(DigitalPin.P1, PinPullMode.PullUp)
strip.setPixelColor(143, neopixel.colors(NeoPixelColors.Blue))
strip.setPixelColor(当たり位置, neopixel.colors(NeoPixelColors.White))
strip.show()
startGame = 1
basic.forever(function () {
if (startGame == 1) {
if (pins.digitalReadPin(DigitalPin.P1) == 0) {
停止命令 = 1
最終アクセス時間 = control.millis()
}
basic.pause(1)
if (control.millis() - 最終アクセス時間 > 60000) {
control.reset()
}
}
})