スクラッチコーチキャンプ スクラッチで使える無料素材集
  • 素材
  • 修行
  • はじめての方へ
  • スクラッチゲームの作り方

    #026 カスタムブロック(関数)の作り方|足し算・引き算ツール入門

    #026 カスタムブロック(関数)の作り方|足し算・引き算ツール入門
    この記事は スクラッチコーチで掲載されているオリジナル記事 のバックアップです。
    スターター作品
    なし
    今回の完成サンプル
    なし
    [soy-series name="はじめてのスクラッチ"]

    さぁ、スクラッチでナニ作る!?

    動画で見てみよう

    [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]

    今回の目標

    2つの素材量を入力すると、合成(足し算)か分解(引き算)かを選んで計算してくれる錬金術師ツールを作るよ。カスタムブロックで合成・分解のロジックをそれぞれ定義して、メインのコードから呼び出す仕組みを組んでいこう。

    スターター作品をリミックスしよう

    このチュートリアルにはスターター作品があります。使わなくても大丈夫だけど、最低限の素材などが用意されてるので便利です。
    スターター作品をダウンロード

    #1素材量の入力

    準備

    スプライト「錬金術師」を開く

    錬金術師錬金術師
    スプライトについて
    素材の合成・分解を行う錬金術師スプライト。2つの素材量を入力として受け取り、合成または分解を選択して計算結果を表示する。
    どんな役割か
    2つの素材を合わせたり分けたりする錬金術師を作るよ!足し算で合成・引き算で分解の2パターンを作っていこう。

    変数「素材1の量」を追加

    1つ目の素材量を保存する変数。ユーザーが入力した数値が格納される。

    変数「素材1の量」を追加

    実装

    step-0

    錬金術師に素材を渡すところからスタート。イベントgreenflag が押されたときで旗が押されたら、調べる( ) と聞いて待つを使って1つ目の素材量を聞くんだ。

    入力された値は変数( ) を ( ) にするで「素材1の量」変数に保存しておくんだ。答えを変数にとっておかないと、次の質問をした瞬間に前の答えが消えちゃうんだよ。

    確認プレビューしておこうという口コミを寄せてくれた方 確認プレビューしておこう
    旗を押すと錬金術師が「1つ目の素材量を入力して下さい」って聞いてくる。答えた数字がそのまま「素材1の量」っていう変数に入るよ。

    #22つ目の素材量

    [talk class="m-l-n"]続けて2つ目の素材量も入力しよう。[/talk]

    準備

    変数「素材2の量」を追加

    2つ目の素材量を保存する変数。ユーザーが入力した数値が格納される。

    変数「素材2の量」を追加

    実装

    step-1

    さっきと同じ流れで調べる( ) と聞いて待つ変数( ) を ( ) にするを使って、答えを「素材2の量」変数に入れるよ。1つ目の答えはもう「素材1の量」に保存済みで、もし変数に入れてなかったら次の質問で「答え」が上書きされて1つ目の数値を失ってしまうから、この手順が大事なんだ。

    #3操作を選ばせる

    [talk class="m-l-n"]2つの素材量が揃ったら、合成するか分解するかの選択だよ。[/talk] step-2

    「合成なら1、分解なら2を入力して下さい。」と調べる( ) と聞いて待つで聞いて、制御もし ( ) ならで答えが1かどうか判定するよ。数字で選択肢を振り分けるのは、ユーザー入力で処理を切り替える基本パターンだね。

    #4「合成する」の定義

    準備

    カスタム定義「合成する」を追加

    素材1と素材2を足し算で合成し、結果を2秒間表示するプロシージャ。

    カスタム定義「合成する」を追加

    変数「計算結果」を追加

    合成(足し算)または分解(引き算)の計算結果を保存する変数。

    変数「計算結果」を追加

    実装

    step-3

    メインの流れから離れて、カスタムブロック「合成する」を定義していくよ。ブロック定義定義 ( )で新しいブロックの入り口を作るんだ。

    中身はシンプルで、「素材1の量」と「素材2の量」を演算( ) + ( )で足して、結果を「計算結果」変数に入れるだけ。

    [talk]カスタムブロックって、料理のレシピカードみたいなもの。「合成する」っていうレシピを一度書いておけば、メインのコードから名前で呼び出すだけで使えるんだ。もし条件分岐の中に計算コードを直接書いちゃうと、似た処理をコピペすることになって、修正するとき全箇所直さなきゃいけなくなる。カスタムブロックに分けておけば1箇所の修正で済むから、プログラムがぐっとスッキリするよ。[/talk]

    #5計算式をまるごと表示

    [talk class="m-l-n"]数字だけポンと出すんじゃなく、「素材1の量 + 素材2の量 = 計算結果」っていう式全体を錬金術師に言わせたい。どうやるか?[/talk] step-4

    見た目( ) と ( ) 秒言うの中に演算( ) と ( )を4重にネストして、変数と「+」「=」の記号をつなげていくよ。1つのブロックで2つしかくっつけられないから、4つのブロックで5つのパーツを順番に結合するんだ。

    [talk]変数の値と記号をつなげて1本の文字列にするこのテクニック、ゲームのスコア表示でも定番なんだ。「スコア: 1500点」みたいに、固定の文字と数字をミックスして画面に出したいとき、まさにこの入れ子を使うよ。最初は入れ子が深くてビビるかもだけど、内側のブロックから順番に組み立てていけば、パズルを解く感覚で楽しくなってくる。[/talk]

    #6合成を実行する

    [talk class="m-l-n"]「合成する」の中身ができたから、メインの流れに戻って呼び出そう。[/talk] step-5

    ブロック定義( )で「合成する」を実行するよ。プレビューで2つの数字を入力して「1」を選んでみて。足し算の式と結果がバッチリ表示されるはず。

    確認プレビューしておこうという口コミを寄せてくれた方 確認プレビューしておこう
    2つ目の素材量も入力して、合成か分解を選べるようになったね。「合成する」っていうカスタムブロックを作って、1を入力すると足し算の数式が表示される。

    #7分解の条件分岐

    [talk class="m-l-n"]合成が動くようになったから、次は分解の分岐を追加していこう。[/talk] step-6

    さっきと同じように制御もし ( ) ならで答えが2かどうかを判定するんだ。合成と分解で条件を分けておくと、あとからコードを見たときにどっちの処理かすぐわかるよね。

    #8「分解する」の定義

    [talk class="m-l-n"]今度は「分解する」カスタムブロックを定義するよ。構造は「合成する」とほぼ同じ。[/talk]

    準備

    カスタム定義「分解する」を追加

    素材1から素材2を引き算で分解し、結果を2秒間表示するプロシージャ。

    カスタム定義「分解する」を追加

    実装

    step-7

    ブロック定義定義 ( )で定義して、「素材1の量」から「素材2の量」を演算( ) - ( )で引いた結果を「計算結果」に入れるんだ。足し算と引き算で違うのは演算ブロックだけで、全体の組み立ては同じ。こういう構造の共通点に気づけると、新しい処理を追加するのがどんどんラクになるよ。

    #9分解結果の表示

    [talk class="m-l-n"]合成と同じく、分解でも式全体を錬金術師に言わせよう。[/talk] step-8

    「素材1の量 - 素材2の量 = 計算結果」になるように演算( ) と ( )をネストして、見た目( ) と ( ) 秒言うで2秒間表示するよ。「+」記号が「-」に変わっただけで、ブロックの組み方はまったく同じだね。

    #10分解を実行して完成

    [talk class="m-l-n"]ラスト!答えが2のときの条件分岐に「分解する」の呼び出しを入れよう。[/talk] step-9

    ブロック定義( )で「分解する」を実行すれば、これで完成。プレビューで「1」を入力すれば合成、「2」なら分解が動くよ。2つのカスタムブロックが条件で使い分けられる仕組み、うまくできてるよね。

    確認プレビューしておこうという口コミを寄せてくれた方 確認プレビューしておこう
    2を選ぶと今度は「分解する」ブロックが動く。引き算で計算して、合成のときと同じように数式と結果をまとめて表示してくれるよ。

    まとめ

    「定義する」と「呼び出す」の2ステップで処理を分けるカスタムブロック、うまく使えたかな。合成と分解で構造がほぼ同じだったことに気づいてたら、もう関数の感覚がわかってるってことだよ。これを使いこなせば、長いプログラムもスッキリまとめられるようになるぞ。

    ブクマよろしくお願いします!という口コミを寄せてくれた方 ブクマよろしくお願いします!
    どんどん追記・更新していくので、ブックマークやシェアよろしくお願いします!