このページは、飲み物の自動販売機のはたらきをシミュレーションするプログラムと、その解説について書かれています。






はじめに


文部科学省の小学校プログラミング教育の手引に、「情報化の進展と生活や社会の変化」を探究課題として学習する場面として、ジュースの自動販売機のプログラムの作成を通して身の回りの様々な製品やシステムが、プログラムで制御されていることを体験的に理解するという項目があります。そこでここでは、一般的な飲み物の自動販売機のはたらきを再現したプログラムを作成し、そのプログラムの内容をできるだけわかりやすい表現で解説してみました。



「飲み物の自動販売機」のプログラム


以下は、スクラッチを使って説明します。基本的な使い方などは、以下の書籍などを参考にしてください。


下の画面は、アメリカのマサチューセッツ工科大学のチームが作成した「スクラッチ」というプログラム言語を使ってつくった、自動販売機のはたらきをするプログラムです。「緑のはた」をクリックすると、プログラムが始まります。どこにでもある自動販売機のように動くので、試しに動かしてみて下さい。

(ごくまれに、ボックスの中に広告が表示されてしまうことがあります。このときは、ページを再読み込みすると、広告が別の場所にうつってくれます。)


--- ここに画面が表示されます ---



プログラムは、こちらのスクラッチのサイトからも見ることができます。






自動販売機のはたらき


下の図は、自動販売機のはたらきの流れをフローチャート(「フローチャートって何?」という方は、こちらの外部サイトにわかりやすい説明があります)で表したものです。作業の流れは、すごろくのように、「購入開始」から「購入終了」まで矢印をたどっていきます。各場面で行う作業を長方形、状況によって進む道が変わるポイントをひし形で表しています。場面に応じて「買う人」が行う作業と、「自動販売機」が行う作業があります。左側に買う人がすること、右側に自動販売機がすることになります。

赤で書かれた矢印は、買う人が自動販売機に出す命令を表します。この命令に基づいて自動販売機が青で書かれた作業をします。自動販売機の作業の結果を買う人に伝えているのが緑の矢印になります。その結果を受けて、自分がするべきことを買う人が判断し、実行することになります(自動販売機への命令以外の人が行う作業は黒で表されています)。このように、自動販売機が全ての処理を行っているのではなく、必要に応じて人の判断が入ります。人が判断する部分は人に任せればよい(=プログラムしなくてよい)ので、以下の3つのステップを自動販売機のプログラムとして作ればよいということになります。
命令をうける(赤の矢印

作業を行う(青の部分

結果を表示する(緑の矢印
フローチャートから、の流れは3か所あることがわかります。

入金
お金が入ったら、チャージ金額を増やす。チャージ額が一定以上になったら、購入ボタンを点灯させる。
購入
購入ボタンが押されたら、商品を出して、チャージ金額をへらす。
返金
へんきゃくレバーが押されたら、チャージされた金額を全額返金する。

これをもとにプログラムを作成しています。以下は、それぞれのプログラムの解説になります。




プログラムの内容


このプログラムはスクラッチのサイトで公開しています。プログラムの内容も確認することができます。

スクラッチの基本的な使い方などは、以下の書籍などを参考にしてください。

スクラッチのサイトに入るのが初めての方へ

最初に「中を見る」でプログラムの中に入ると、プログラムが全て英語表示になっています。日本語にするには、左上の をクリックして下さい。言語の選択が出てくるので、日本語(または「にほんご」)を選べば日本語化されます。なお、開いたプログラムを変更しても元のプログラムは変更されないのでご安心下さい。



開始(初期化)のプログラム


プログラムは「ある決まった状態」から開始させることが必要です。このように、プログラム自体を「ある決まった状態」にすることを初期化といいます。スクラッチの場合、緑のはたを押すとプログラムが始まります。したがって、初期化のプログラムは、必ず以下の

の下にくっついています。この自動販売機のプログラムでは、以下のことを初期化しています。

それぞれの決まった場所に配置する

プログラムの修正を繰り返していると、ボタンの位置が変わったりするなどしてしまうことがあります。そこで最初に、それぞれのものを決まった場所に配置することを最初に行います。最初の見た目を決まった形にするために、位置を決める以下のようなプログラムがすべてのものにかいてあります。

これは、「お札投入口」にかかれているプログラムです。「x座標を…」と書かれている青の部分で「お札投入口」の位置を決めています。「最前面に移動する」という部分で、これが他のものの後ろに隠れないように指定しています。

チャージ金額を0円にする

チャージ金額の設定は「硬貨投入口」にプログラムされています。以下が、「硬貨投入口」を初期化するためのプログラムです。

「x座標を…」と「最前面に移動する」という部分で「硬貨投入口」の見た目を設定した後に、オレンジ色の「金額を0にする」でチャージ金額が0円になります。
なお、その下にある「ずっと」より下のプログラムは、硬貨投入口の動作を決める部分なので、後で説明します。

各商品の最初の個数を設定する

次に、それぞれの商品の個数を設定します。以下は、「オレンジジュースのボタン」のプログラムです。

今までと同様に、「オレンジジュースのボタン」の見た目を設定した後に、「本数を2にする」によって、最初の状態でオレンジジュースは2本入っているという設定になります(最初に2本しか入っていないの?と思われるでしょうが、売り切れのときのプログラムも考えるために、少なめに設定されています)。
なお、その下にある「ずっと」より下のプログラムは、ボタンの動作を決める部分なので、後で説明します。

使うお金を発生させる

初期化の最後は、使うことができるお金を出すことです。以下は10円のプログラムです。

これまでとは異なり、表示される場所が指定されていません。このプログラムでは、この「オリジナルのお金」は使わずに、これをコピーした「クローンのお金」を使う仕組みにしています。このために、直接使わない「オリジナルのお金」は「隠す」にして、操作できないようにしています。

次にこの「オリジナルのお金」のコピーして実際に使う「クローンのお金」をつくります。次にある「返金をできないにする」とは、次の作業が「返金」ではなく、最初に使うお金を発生させることを意味します。具体的には、「クローンのお金」を発生させる場所が自動販売機の外側になります。

「枚数を0枚にする」以降が、実際に「クローンのお金」を発生させる場所です。最初の状態ではお金はないので、「枚数」が0に設定されます。「枚数=5まで繰り返す」で発生させるお金(ここでは10円)の枚数を決めます。ここからは、枚数が5枚になるまで繰り返し同じことを行います。「自分自身のクローンを作る」で「クローンのお金」が1枚発生します。発生したら、「枚数を1まいずつ変える」で、枚数が1枚増えます。この2つの操作を枚数が5枚になるまで繰り返します。

コピーされた「クローンのお金」のはたらきは、上とは別のプログラムで決められています(下の図)。

ここで今までと異なるのが、「もし返金にできるが含まれるなら」のブロックです。「返金」の内容に応じて、2つの作業が登録されています。もし「返金」が「できる」に設定されていたら、自動販売機の返金口に発生させます。しかし、最初は「返金」を「できない」に設定してあるので、もう一つの「でなければ」の後の1行が実行されます。ここには、発生させたお金を置く場所が指定されています。枚数に応じて場所を変える設定になっていて、残っているお金が見やすくなるように表示しています。「クローンのお金」は使われるお金ですから、「表示する」「ドラッグできるようにする」にして、マウスを使って動かすことができるようにします。

これで、自動販売機を動かす準備ができました。




入金のプログラム


いよいよ、自動販売機を動かすプログラムに入ります。まず、お金を入れたらその分だけチャージ金額を増やすことです。この段階には、以下の2つの作業があります。

  • 投入されたお金に応じてチャージ金額をふやす
  • チャージ金額が商品の値段以上になったら、購入ボタンを点灯させる

まず、「投入された応じてチャージ金額をふやす」作業とそのプログラムについてです。このプログラムは主に「硬貨投入口」と「お札投入口」に書かれています。硬貨投入口のプログラムは、チャージ金額を0円にするところで書きました。その続きに以下のようなプログラムが続いています。

このプログラムにより、硬貨投入口はお金に触れるまで待ち続けることになります。このときに「10円に触れた」場合を考えます。10円が硬貨投入口に触れると、「もし10円に触れたなら」というブロック内にかかれたプログラムが動きます。すると、「お金を消す」というメッセージを送って、次の処理が終わるまで待ちます。このメッセージは触れた10円に渡されます。10円には以下のようなプログラムが入っています。

このプログラムにより、硬貨投入口に触れていた10円は消えることになります。消えると、硬貨投入口のプログラムに戻ります。次に書かれていたのは「金額を10ずつ変える」です。これにより、金額が10増えることになります。この結果、硬貨投入口に10円が触れると、触れた10円が消えてチャージ金額が10円増えることになります。同様に、50円・100円・500円も硬貨投入口に触れると同じ動作をします。1000円は硬貨投入口ではなく、お札投入口に触れた場合に同様のことが起こります。

これに伴って自動販売機の表示の金額が変わりますが、これについてはプログラムの流れとは直接関係ないので、説明は省略します。

次は、「チャージ金額が商品の値段以上になったら、購入ボタンを点灯させる」プログラムです。これは、購入ボタンに書かれています。このプログラムも、それぞれの商品の個数を設定するときに書きました。その後に以下のようなプログラムが続いています(オレンジジュースのボタンを例にしています)

「ずっと」のブロックに入っているプログラムは、全体のプログラムの動作が終了するまで続きます。まず、「もし本数=0なら」のブロックで、商品が売り切れた場合の動作を決めます。このときには「コスチュームを3にする」となっています。コスチュームとは見た目のことで、ボタンの「3」というコスチュームが以下のような画像になっています。

売り切れでない場合は、金額によってコスチュームを決めます。オレンジジュースは120円なので、120円以上チャージされれば、コスチューム2で以下の画像になります。

金額が120円未満ならばコスチューム1で以下の画像になります。

後のプログラムで、コスチュームが2のときだけボタンを押すことができるようにします。別の購入ボタンでも同様にプログラムされています。以上が入金のプログラムです。




購入のプログラム


次に、「購入ボタンが押されたら商品を出してチャージ金額をへらす」プログラムです。ここでもオレンジジュースのボタンを例にとって説明します。このボタンには、以下のようなプログラムが書かれています。

「このスプライトが押されたとき」とは、このボタンが押されたときという意味です。前に説明したように、購入できる金額以上がチャージされていれば、ボタンのコスチュームが2になります。このときにだけボタンを押したらオレンジジュースが出てきます。オレンジジュースを出すために、「オレンジジュースのクローンを作る」が実行されます。オレンジジュースには以下のプログラムが書かれています。

これにより、横に寝かせた状態の商品が自動販売機の下にある商品取り出し口に出てきます。

さらに金額を商品の代金の分だけ減らし、本数を1本減らせば完了です。金額と本数はボタンのプログラムで常に見ているので、数が変化すればボタンの見た目も自動で変化します。

以上で、購入のプログラムが完成しました。



返金のプログラム


最後が、チャージされている額を返金するプログラムです。これは、返却レバーに書かれています。以下はその前半部分です。

レバーが押されると、コスチュームが1→2→1と変化することで、レバーが押されたように見えます。その次に、「返金をできるにする」で、これから発生させる返金の「クローンのお金」が、自動販売機の下の返却口に表示されるようになります。

次は、後半部分です。ここで、返金をします。返金は「金額=0まで繰り返す」ことになります。まず、「もし金額>499(金額が500円以上ある)なら」500円を1枚出します。これを金額が500円未満になるまで繰り返します。500円未満になったら、「もし金額>99(金額が100円以上ある)なら」100円を1枚出します。これを、金額が100円未満になるまで繰り返します。100円未満になったら、「もし金額>49(金額が50円以上ある)なら」50円を1枚出します。最後に、残りの金額は40円以下になっているはずですから、金額が0円になるまで10円を出します。これによって、金額が0円になるまで「クローンのお金」を返却口に出すことができます。出したお金は再び自動販売機で使うことができます。