- スターター作品
- なし
- 今回の完成サンプル
- なし
さぁ、スクラッチでナニ作る!?
動画で見てみよう
[talk]チャンネル登録して応援よろしく!チャンネル登録する[/talk]チュートリアルの元になった作品
[prj-embed prj="1321342168" mini="1" title="プレイしておこう" prj-title="はじめてのスクラッチ #026" prj-author="ok-scratch"]今回の[prj-link prj="1321342168" title="はじめてのスクラッチ #026" author="ok-scratch"]スクラッチを作る参考作品[/prj-link]です。カスタムブロックで「合成する」「分解する」ってブロックを自作して、足し算と引き算のロジックをきっちり分離するアイデアがキレッキレ。条件分岐の中に計算コードをごりごり書くんじゃなくて、処理に名前をつけて呼び出す設計は、関数の考え方そのものなんだ。シンプルな錬金術師テーマだからこそ、「定義と呼び出し」の感覚がすっと腹に落ちる。どうやって作るか、見ていこう。参考資料:スクラッチプログラミング事例大全集[/prj-embed]今回の目標
スターター作品をリミックスしよう
このチュートリアルにはスターター作品があります。使わなくても大丈夫だけど、最低限の素材などが用意されてるので便利です。
スターター作品をダウンロード
#1素材量の入力
準備
スプライト「錬金術師」を開く
| スプライトについて |
|---|
| 素材の合成・分解を行う錬金術師スプライト。2つの素材量を入力として受け取り、合成または分解を選択して計算結果を表示する。 |
| どんな役割か |
| 2つの素材を合わせたり分けたりする錬金術師を作るよ!足し算で合成・引き算で分解の2パターンを作っていこう。 |
変数「素材1の量」を追加
1つ目の素材量を保存する変数。ユーザーが入力した数値が格納される。
実装
錬金術師に素材を渡すところからスタート。
入力された値は( ) を ( ) にするで「素材1の量」変数に保存しておくんだ。答えを変数にとっておかないと、次の質問をした瞬間に前の答えが消えちゃうんだよ。
#22つ目の素材量
[talk class="m-l-n"]続けて2つ目の素材量も入力しよう。[/talk]準備
変数「素材2の量」を追加
2つ目の素材量を保存する変数。ユーザーが入力した数値が格納される。
実装
さっきと同じ流れで( ) と聞いて待つと( ) を ( ) にするを使って、答えを「素材2の量」変数に入れるよ。1つ目の答えはもう「素材1の量」に保存済みで、もし変数に入れてなかったら次の質問で「答え」が上書きされて1つ目の数値を失ってしまうから、この手順が大事なんだ。
#3操作を選ばせる
[talk class="m-l-n"]2つの素材量が揃ったら、合成するか分解するかの選択だよ。[/talk]「合成なら1、分解なら2を入力して下さい。」と( ) と聞いて待つで聞いて、もし ( ) ならで答えが1かどうか判定するよ。数字で選択肢を振り分けるのは、ユーザー入力で処理を切り替える基本パターンだね。
#4「合成する」の定義
準備
カスタム定義「合成する」を追加
素材1と素材2を足し算で合成し、結果を2秒間表示するプロシージャ。
変数「計算結果」を追加
合成(足し算)または分解(引き算)の計算結果を保存する変数。
実装
メインの流れから離れて、カスタムブロック「合成する」を定義していくよ。定義 ( )で新しいブロックの入り口を作るんだ。
中身はシンプルで、「素材1の量」と「素材2の量」を( ) + ( )で足して、結果を「計算結果」変数に入れるだけ。
[talk]カスタムブロックって、料理のレシピカードみたいなもの。「合成する」っていうレシピを一度書いておけば、メインのコードから名前で呼び出すだけで使えるんだ。もし条件分岐の中に計算コードを直接書いちゃうと、似た処理をコピペすることになって、修正するとき全箇所直さなきゃいけなくなる。カスタムブロックに分けておけば1箇所の修正で済むから、プログラムがぐっとスッキリするよ。[/talk]
#5計算式をまるごと表示
[talk class="m-l-n"]数字だけポンと出すんじゃなく、「素材1の量 + 素材2の量 = 計算結果」っていう式全体を錬金術師に言わせたい。どうやるか?[/talk]( ) と ( ) 秒言うの中に( ) と ( )を4重にネストして、変数と「+」「=」の記号をつなげていくよ。1つのブロックで2つしかくっつけられないから、4つのブロックで5つのパーツを順番に結合するんだ。
[talk]変数の値と記号をつなげて1本の文字列にするこのテクニック、ゲームのスコア表示でも定番なんだ。「スコア: 1500点」みたいに、固定の文字と数字をミックスして画面に出したいとき、まさにこの入れ子を使うよ。最初は入れ子が深くてビビるかもだけど、内側のブロックから順番に組み立てていけば、パズルを解く感覚で楽しくなってくる。[/talk]
#6合成を実行する
[talk class="m-l-n"]「合成する」の中身ができたから、メインの流れに戻って呼び出そう。[/talk]( )で「合成する」を実行するよ。プレビューで2つの数字を入力して「1」を選んでみて。足し算の式と結果がバッチリ表示されるはず。
#7分解の条件分岐
[talk class="m-l-n"]合成が動くようになったから、次は分解の分岐を追加していこう。[/talk]さっきと同じようにもし ( ) ならで答えが2かどうかを判定するんだ。合成と分解で条件を分けておくと、あとからコードを見たときにどっちの処理かすぐわかるよね。
#8「分解する」の定義
[talk class="m-l-n"]今度は「分解する」カスタムブロックを定義するよ。構造は「合成する」とほぼ同じ。[/talk]準備
カスタム定義「分解する」を追加
素材1から素材2を引き算で分解し、結果を2秒間表示するプロシージャ。
実装
定義 ( )で定義して、「素材1の量」から「素材2の量」を( ) - ( )で引いた結果を「計算結果」に入れるんだ。足し算と引き算で違うのは演算ブロックだけで、全体の組み立ては同じ。こういう構造の共通点に気づけると、新しい処理を追加するのがどんどんラクになるよ。
#9分解結果の表示
[talk class="m-l-n"]合成と同じく、分解でも式全体を錬金術師に言わせよう。[/talk]「素材1の量 - 素材2の量 = 計算結果」になるように( ) と ( )をネストして、( ) と ( ) 秒言うで2秒間表示するよ。「+」記号が「-」に変わっただけで、ブロックの組み方はまったく同じだね。
#10分解を実行して完成
[talk class="m-l-n"]ラスト!答えが2のときの条件分岐に「分解する」の呼び出しを入れよう。[/talk]( )で「分解する」を実行すれば、これで完成。プレビューで「1」を入力すれば合成、「2」なら分解が動くよ。2つのカスタムブロックが条件で使い分けられる仕組み、うまくできてるよね。
まとめ
「定義する」と「呼び出す」の2ステップで処理を分けるカスタムブロック、うまく使えたかな。合成と分解で構造がほぼ同じだったことに気づいてたら、もう関数の感覚がわかってるってことだよ。これを使いこなせば、長いプログラムもスッキリまとめられるようになるぞ。