Scratch(自動生成あみだくじとパラリンピック)

Scratch-Amidakuji_titleプログラム

パラリンピックにのっかって、今回のScratchサンプルプログラムでは選手がメダルを目指して疾走する姿を自動で生成されるあみだくじをつかって表現してみましょう。できあがった完成系は最後リンクがあるよ。

あみだくじプログラム

あみだくじは、上から下まで線をたどっていって途中で横の線がでてきたら、その線の方向に横方向に水平移動するルールですよね。人間がやるなら、あっ左ね、右ねと見ただけでわかるのですが、これをプログラムでやるとすると、下に移動するのはY方向の座標をマイナスにしていけばいいけど、横の線に触れたときに右に移動、左に移動ってどうやって判断するの?と悩んじゃいます。

あみだの上を動くキャラ(色による判定)を考える

これを解決する方法が、Scratchでは色の接触による判定です。狭い廊下で目をつぶって両手を両方の壁に手をつけて一直線に歩いている姿をイメージしてください。目をつぶって歩いているうちに、右手に感触がなくなったら、あっ、右側に道があるな、逆に左手に感触がなくなったら、左側に道があるなと判断できます。あみだくじはこの逆の原理です。右手が黒い線にヒットしたら右に移動させる、左手が黒い線にヒットしたら左に移動させるのです。

ここで、右手に緑の色を塗り、左手に赤の色をぬってみましょう。そうして右と左の区別をつけた結果、この図のようなプログラムで横棒がどっちにあるかを判断できます。ここでは、あみだ移動(X座標)、あみだ移動(Y座標)という変数をつくり、そこにX,Y座標をいれて、横棒にふれた際のX座標を右(+方向)、左(ー方向)に50ずらすという処理で横移動を実現しています。なお、触れたらXを+50ずつずらすというブロックも使えますが、そうすると一瞬で横移動してしまうため、あみだ感がなく、わざわざX,Y座標を格納する変数を1つ作って1秒で移動するというブロックを使って表現していますよ。

Scratch-Amidakuji001

ちなみにこの右が緑、左が赤は船舶や飛行機でも全世界の統一ルールとして利用されていて、船や飛行機が接近したときにどっちの方向に向かっているのか、また幅がどのくらいなのを判断するのにつかわれているんですよ。まぁ、それは雑学な知識ですけど。

さて、この緑と赤の棒があみだくじの黒い線を下っていっても、あみだくじとしては成り立つのだけどちょっと寂しいですよね。ちゃんとキャラクターが下っているようにしたいですね。ということで、この赤と緑の棒は非表示ボタンを押して見えないようにし、代わりにあみだ上を移動させたいキャラを用意してそっちの方を表示にしておきます。

Scratch-Amidakuji002

そして、常に非表示側の緑と赤の棒を追っかけるという処理を加えることで、あたかもキャラがあみだの線の上を動いているかのようにみえます。

Scratch-Amidakuji003

ちなみに、こんな感じにキャラクターの両側に緑と赤の点をつけるという風にまとめて表示させるということもできますが、常に緑と赤の点が見えたまま、あみだを下っていくのでちょっと格好わるいですよね。なので上の図のように2つのスプライトを組み合わせるのがベストです。

Scratch-Amidakuji004

あみだの線を引く

あみだの線を動くキャラ(スプライト)ができたので、あみだくじの線は自分で背景に描いてみて試すことはできます。でも、ここではスタートボタンを押したら自動であみだくじの線を引くプログラムを作ってみましょう。しかも、毎回、形が変わるランダムなあみだくじ生成プログラムとなります。

さて、まずは縦の線を引いてみましょう。X座標の増加量という変数をつくって7本の縦の線を引きます。なお、プログラムをキレイにするために縦の線は縦線という関数ブロックにまとめています。

Scratch-Amidakuji005

 

ところで、縦の線を描くのはそれほど難しくないのですが、横の線を描くのはちょっと頭を使うのです。単純に別の変数を使って横の線を引けばいいかというとそうではないんです。それは、この絵のとおりです。

Scratch-Amidakuji006

そうです、奇数と偶数の列によって、段違いの線を描かなければいけないのです、しかも面白くするために乱数をつかってパターンを変える必要もあります。

そんなわけで、私が作ったプログラムは水平カウンタと垂直カウンタという変数を作ってこんな感じになりました。こちらもキレイなプログラムにするため横棒という関数ブロックにまとめています。

 

Scratch-Amidakuji007

 

このプログラムでは横線を引く位置がランダムとしているので、同じ線を何回か重ねて引いてしまう問題がありますが、線を引くスプライトは非表示にしているので、そのあたりは見えなくなっています。パラメータを調整したり、もっと頭のいい人がつくれば、このあたりの無駄は省けるかもしれません。(すいません、私が暇にまかせて書いたプログラムではこのあたりで改善するの諦めてしまいました)

そして、最後に縦線と横線を引く関数ブロックを1つにまとめて完成です。あみだの線がひけたら、メッセージ1を送るという処理を加えて、先につくったキャラクターがあみだを下っていく処理をスタートさせるようにしています。

Scratch-Amidakuji008

こうして完成させたあみだくじプログラムはこちらです。


中身をみたい場合はこちら

https://scratch.mit.edu/projects/564231871

あみだくじプログラム(パラリンピック版)

ということで、パラリンピック版を最後にのせます。スタートボタンを押すとあみだくじの線がひかれ、金・銀・銅のメダルが毎回違う位置に置かれます。(コードが長くなるので、ちょっと中途半端なランダム処理でやめたけど)。こちらについての中身解説はしません。知りたい人はScratchプログラムの中をみて確認してね。


中をみたい場合はこちら

https://scratch.mit.edu/projects/564415403

まとめ

今回はあみだくじプログラムを説明しました。あみだくじって意外と難しいですよね~。でも、今回のプログラムで今後も役立つ考え方が身につきましたね。ちなみにあみだくじって文化はアジア圏にしかなくて、欧米では一からルールを説明しなければいけないんだとか。

コメント

タイトルとURLをコピーしました