microbitプログラミング 芸人 EveryBodyのクリティカルヒットをmicrobitでやるとこうなった
タイトル画像引用元:
https://profile.yoshimoto.co.jp/talent/detail?id=7254
今年、ブレイクしている芸人EveryBodyの代表的なネタである「クリティカルヒット」。
皆さんは知っているでしょうか?
今年のおもしろ荘でテレビに出て以来、人気が急上昇しています。
ネタはこちらになります。
動画にもあるこのネタの
「スッキ、スッキ、スッキスキス」
「->」
「--->」
「----->」
「Critical Hit!!」
「やった!^O^」
が中毒性があって人気が急上昇しました。
このクリティカルヒットの件をmicrobitで実装してみようと思います。
ちなみに公式サイトの紹介ページはこちら
今回の仕様
microbitでスッキスッキスッキスキスからクリティカルヒットまでをmicrobitのLEDパネル部分で表現します。
クリティカルヒットだけではつまらないので、クリティカルヒットの場合は「CRITICAL HIT!!」と表示してスマイルを表示します。
クリティカルヒットしない場合は、「NON CRITICAL HIT!!」と表示して悲しい顔を表示します。
動作は以下の流れで処理されます。
1. Aボタンを押すと処理が始まり、「スッキ、スッキ、スッキスキス」を大きいハートと小さいハートで表現します。
2. 胸に刺さってくる部分の表現を矢が左から右へ進むようにアニメーションにします。
3. ビックリマークの後、乱数の値からクリティカルヒットかクリティカルヒットじゃないかを判定させます。
4. クリティカルヒットなら「CRITICAL HIT!!」と文字が流れてハッピーの顔を表示します。クリティカルヒットでなければ、「NOT CRITICAL HIT!!」と文字が流れて悲しみの顔を表示して終了します。
準備するもの
microbitと作製したコードを実装するためにつなぐmicroUSBケーブルのみになります。
組み立てなどもないので、気軽に実装ができます。
microbit1個
microUSBケーブル1個
全体コードはこちら
今回は少し長めのコードですね。
全部で80行程度あります。
関数は4つ作成しています。
whileループでボタンAが押されたら常にクリティカルヒットのアニメーションが始まるようになっています。
# Add your Python code here. E.g.
from microbit import *
def judge_critical():
import random as r
gen = r.randint(0,1)
if gen == 0:
critical_hit_animation(0)
if gen == 1:
critical_hit_animation(1)
def critical_hit_animation(sw):
sleep(1000)
display.show(Image.SURPRISED)
sleep(1000)
if sw == 0:
display.scroll("NOT CRITICAL HIT!!")
sleep(250)
display.show(Image.SAD)
sleep(1000)
elif sw == 1:
display.scroll("CRITICAL HIT!!")
sleep(250)
display.show(Image.HAPPY)
sleep(1000)
def allow_animation():
boat0 = Image("00000:"
"90000:"
"99000:"
"90000:"
"00000")
boat1 = Image("0000:"
"09000:"
"99900:"
"09000:"
"00000")
boat2 = Image("00000:"
"00900:"
"99990:"
"00900:"
"00000")
boat3 = Image("00000:"
"00090:"
"99999:"
"00090:"
"00000")
all_boats = [boat0,boat1,boat2,boat3]
display.show(all_boats, delay=500)
def first_animation():
display.show(Image.HEART)
sleep(500)
display.show(Image.HEART_SMALL)
sleep(500)
display.show(Image.HEART)
sleep(500)
display.show(Image.HEART_SMALL)
sleep(500)
display.show(Image.HEART)
sleep(500)
display.show(Image.HEART_SMALL)
sleep(250)
display.show(Image.HEART)
sleep(250)
display.show(Image.HEART_SMALL)
sleep(250)
display.show(Image.HEART)
while True:
if button_a.is_pressed():
first_animation()
allow_animation()
judge_critical()
sleep(2500)
display.clear()
コードの詳細について下記に説明していきます。
メインの処理
whileループで常に処理がされるようにします。
if button_a.is_pressed():でAボタンを押すことで処理が始まります。
スッキスッキの表現をする処理をfirst_animetion()関数で実行します。
矢が胸に刺さるまでの表現を矢印で表す関数をallow_animation()関数で行われます。
そして、judege_critical()関数で乱数生成の値からクリティカルヒットかを判断させ、クリティカルヒットのアニメーションを表示するcritical_hit_animation()関数に生成した乱数を引数にして呼び出します。
引数の値に応じてアニメーションの表示が変わる仕組みです。
最後にsleep(2500)で2.5秒の間を置き、display.clear()で表示を消して終了になります。
while True:
if button_a.is_pressed():
first_animation()
allow_animation()
judge_critical()
sleep(2500)
display.clear()
スッキスッキスッキスキスの表現処理
ハートを表すメソッドが既にmicrobitでは用意されています。
大きいハートはImage.HEART、小さいハートはImage.HEART_SMALLで出力できます。
この二つの処理をsleepメソッドで処理を止める時間で調節することでハートが大きくなったり小さくなったりする動きを表現して、「スッキスッキスッキスキス」表現します。
下記ではハートの大小の表現の間に0.5秒の間何も処理をしないsleep(500)を実行し、後の方では0.25秒の間隔を空けるようにsleep(250)とすることでハートの鼓動している様子を表現させてます。
def first_animation():
display.show(Image.HEART)
sleep(500)
display.show(Image.HEART_SMALL)
sleep(500)
display.show(Image.HEART)
sleep(500)
display.show(Image.HEART_SMALL)
sleep(500)
display.show(Image.HEART)
sleep(500)
display.show(Image.HEART_SMALL)
sleep(250)
display.show(Image.HEART)
sleep(250)
display.show(Image.HEART_SMALL)
sleep(250)
display.show(Image.HEART)
矢の表現処理
スッキスッキスキスキスの表現後、相手の胸に刺さる部分を矢印が左から右に進むことで表現します。
矢印に関する組み込み関数はないため、LEDの光らせる位置を指定するための変数を用意して作ります。
Imageメソッドに文字列形式で5x5の配列に0から9の値を入れることでLEDを光の強さを調節して光らせることができます。
0が消灯で9が最も強い明るさで光らせることができます。数値が大きいほど明るくなります。
このImageメソッドを使い、boat0からboat3の4種類でだんだん矢印が左から右に動く表現を作ります。
all_boatsにリスト形式でboat0からboat3を格納します。
def allow_animation():
boat0 = Image("00000:"
"90000:"
"99000:"
"90000:"
"00000")
boat1 = Image("0000:"
"09000:"
"99900:"
"09000:"
"00000")
boat2 = Image("00000:"
"00900:"
"99990:"
"00900:"
"00000")
boat3 = Image("00000:"
"00090:"
"99999:"
"00090:"
"00000")
all_boats = [boat0,boat1,boat2,boat3]
display.show(all_boats, delay=500)
乱数生成してクリティカルヒットか否かを判定させるまでの処理
乱数を生成して、乱数の値によりクリティカルヒットを分岐させます。
まず、import random as r で乱数生成のためのライブラリを呼び出します。
genにr.randint(0,1)で0か1の値を生成して代入します。
if文でgenの値が0であれば、critical_hit_animation関数に引数0を与えて呼び出し、genの値が1であれば同様に引数1を与えてcritical_hit_animation関数を呼び出す処理を実行します。
def judge_critical():
import random as r
gen = r.randint(0,1)
if gen == 0:
critical_hit_animation(0)
if gen == 1:
critical_hit_animation(1)
判定後のクリティクルヒットとクリティカルヒットでない表現処理
genの値がswに入り、swの値によってmicrobitに表示される内容が変わるようにif文で分岐させています。
まず、処理の分岐の前に1秒間sleepメソッドで間を開け、ビックリマークを出した後、swの値によって「CRITICAL HIT!!」とスマイルを表示または「NON CRITICAL HIT!!」と悲しみの顔を表示させます。
def critical_hit_animation(sw):
sleep(1000)
display.show(Image.SURPRISED)
sleep(1000)
if sw == 0:
display.scroll("NOT CRITICAL HIT!!")
sleep(250)
display.show(Image.SAD)
sleep(1000)
elif sw == 1:
display.scroll("CRITICAL HIT!!")
sleep(250)
display.show(Image.HAPPY)
sleep(1000)
完成がこちら
うまくCRITICAL HIT!!とNON CRITICAL HIT!!が表示されましたw
発展性・改良できるところ
クリティカルヒットの時とクリティカルヒットでない時それぞれに対して、効果音をつけることができます。
さらに高度ですがmicrobitを2つ用意すれば、ひとつのmicrobitでスッキスッキスッキスキスから矢をディスプレイで表示させ、その信号をもう1つのmicrobitが受信してCRITICAL HITか否かを判定しクリティカルヒットまたはクリティカルヒットでない表現をするといったことも挑戦してみると良いでしょう。
おわりに
今回はEveryBodyのネタをmicrobitで実装してみました。
ちょっとしたネタになれば嬉しいです。
コードとhexファイルはこちら
参考にどうぞ。
hexファイルをmicrobitにドラッグ&ドロップで入れれば、動画のようなCriticalHitがすぐ実装されます。
microbitに関する参考書
microbitの参考書を紹介しておきます。