Scratchで、自分の名前を呼んでくれるチャットボットを作ってみませんか?この記事では、最初に入力した名前を覚え、名前を使って話しかけたり、クイズを出したりするプログラムを紹介します。
今回作るのは、決められたルールで動くチャットボットです。ChatGPTのように文章を生成するAIではありません。Scratchの「変数」「答え」「条件分岐」を使い、情報を保存して会話に利用する仕組みを学びます。
1. 完成するとできること
- チャットボットが、呼んでほしい名前を聞きます。
- 入力した名前を変数に保存します。
- 名前を使って挨拶します。
- 「クイズ」「名前」「終了」の入力に応じて動作を変えます。
- クイズでは答えを判定し、正解すると得点が増えます。
名前はニックネームで構いません。本名や個人情報を入力する必要はありません。
2. 必要な準備
- 文字を入力できるパソコン
- ブラウザ版Scratchを使うためのインターネット接続
Scratch公式サイトを開き、「作る」から編集画面へ進みます。日本語表示にして、最初からいるネコのスプライトを選び、「コード」タブを開いてください。
作り始めるだけならログインは必須ではありません。作品はファイルメニューからコンピューターに保存できます。オンラインで保存・共有する場合はアカウントを利用します。
今回の作例に、APIキーや追加の拡張機能は必要ありません。
3. 「答え」と「変数」の違い
「調べる」カテゴリの「答え」には、最後の「〜と聞いて待つ」で入力された内容が入ります。次の質問に回答すると、その内容に置き換わります。
例えば、最初に名前として「ねこた」と入力し、次に「クイズ」と入力すると、「答え」は「クイズ」になります。そのままでは、最初の名前を後から取り出せません。
そこで、名前を別の「変数」に保存します。変数は、情報に名前を付けて保存するための仕組みです。
| 情報を入れる場所 | 今回保存する内容 |
|---|---|
| 答え | 最後に質問へ入力された内容 |
| 変数「呼び名」 | 最初に入力されたニックネーム |
| 変数「メニュー」 | 実行したい操作 |
| 変数「得点」 | クイズに正解した回数 |
4. 3つの変数を作ろう
- 左側の「変数」カテゴリを開きます。
- 「変数を作る」を押します。
- 「呼び名」と入力して作成します。
- 同じ方法で「メニュー」と「得点」も作成します。
変数の適用範囲を選ぶ場合は、今回は「すべてのスプライト用」で構いません。
画面上に変数の表示が出ます。動作確認中は「得点」を表示しておくと、増えたことが分かりやすくなります。「呼び名」と「メニュー」の表示は、横のチェックを外して隠せます。
5. 名前を覚えて挨拶しよう
まず、次のブロックを上から順につなぎます。
以下はブロック配置の見本です。文字を貼り付けてもScratchのブロックには変換されません。編集画面で各カテゴリからブロックをドラッグして組みます。
緑の旗が押されたとき [得点]を[0]にする [呼んでほしいニックネームを入力してね]と聞いて待つ [呼び名]を(答え)にする ((呼び名)と[さん、こんにちは!])と[2]秒言う
「呼び名を〜にする」は、「変数」の設定ブロックのメニューから「呼び名」を選びます。右側には、「調べる」の「答え」ブロックを入れてください。
挨拶文には、「演算」の「〜と〜」という文字をつなぐブロックを使います。左に変数「呼び名」、右に「さん、こんにちは!」を入れ、その全体を「見た目」の「〜と2秒言う」に入れます。
例えば「ねこた」と入力すると、「ねこたさん、こんにちは!」と表示する仕組みです。
6. 会話とクイズの完成版を組もう
最初の練習用プログラムを、次の完成版に組み替えます。同じネコに、緑の旗で始まる練習用プログラムを重ねて残さないようにしてください。
緑の旗が押されたとき
[得点]を[0]にする
[メニュー]を[開始]にする
[呼んでほしいニックネームを入力してね]と聞いて待つ
[呼び名]を(答え)にする
((呼び名)と[さん、こんにちは!])と[2]秒言う
〈(メニュー)=[終了]〉まで繰り返す
[クイズ・名前・終了、のどれかを入力してね]と聞いて待つ
[メニュー]を(答え)にする
もし〈(メニュー)=[クイズ]〉なら
[2+3はいくつ? 半角数字で答えてね]と聞いて待つ
もし〈(答え)=[5]〉なら
[得点]を[1]ずつ変える
[正解! 得点が1増えたよ。]と[2]秒言う
でなければ
[答えは5だよ。また挑戦してね。]と[2]秒言う
でなければ
もし〈(メニュー)=[名前]〉なら
((呼び名)と[さんだね。覚えているよ!])と[2]秒言う
でなければ
もし〈(メニュー)=[終了]〉なら
[会話を終えるね。]と[1]秒言う
でなければ
[クイズ・名前・終了のどれかを入力してね。]と[2]秒言う
((呼び名)と[さん、また遊ぼうね!])と[2]秒言うブロックを置く位置
- 名前を聞いて保存する処理は、繰り返しの外側、上に置きます。
- メニューを聞く処理と条件分岐は、すべて「〜まで繰り返す」の内側に入れます。
- クイズの質問と正解判定は、「メニュー=クイズ」の「なら」の内側に入れます。
- 「メニュー=名前」の条件分岐は、「メニュー=クイズ」の「でなければ」の内側に入れます。
- 「メニュー=終了」の条件分岐は、「メニュー=名前」の「でなければ」の内側に入れます。
- 最後の「また遊ぼうね!」は、繰り返しの外側、下に置きます。
なぜ「メニュー」に保存するの?
クイズの答えを入力すると、「答え」の内容は数字に変わります。そこで、メニューとして入力された言葉を、先に変数「メニュー」へ保存します。操作の指定とクイズへの回答を、別々に管理するためです。
最初に変数を設定する理由
緑の旗を押すたびに「得点」を0へ戻すので、前回の点数を引き継がずに始められます。「メニュー」も「開始」に戻すため、前回「終了」した後でも、再び会話できます。
7. 動作確認をしよう
次の順に操作し、結果を確認してください。
| 操作・入力 | 確認すること |
|---|---|
| 緑の旗を押し、「ねこた」と入力 | 「ねこたさん、こんにちは!」と表示する |
| 名前 | 最初のニックネームを使って返事をする |
| クイズ、その後に5 | 正解の返事が出て、得点が1になる |
| クイズ、その後に4 | 正解が表示され、得点は増えない |
| おはよう | 入力できるメニューを案内する |
| 終了 | 最後の挨拶をし、質問が止まる |
| もう一度、緑の旗を押す | 得点が0になり、名前を聞くところから始まる |
この作例のクイズは毎回同じ問題です。正解すれば繰り返し得点が増えます。問題をランダムに作る機能や、同じ問題への加点を制限する機能は含めていません。
8. うまく動かないときの確認
名前ではなく「クイズ」や数字が表示される
名前を保存する場所に「呼び名」変数を使っているか確認してください。挨拶の中でも「答え」ではなく「呼び名」を使います。
クイズの答えを入力する前に正解・不正解が出る
クイズの質問に「〜と聞いて待つ」を使っているか確認します。「〜と言う」は文章を表示するだけで、回答を受け取りません。
終了後、緑の旗を押しても会話が始まらない
プログラムの最初に「メニューを開始にする」があるか確認してください。「終了」が残っていると、繰り返しを始められません。
得点が増えない
正解した場合の内側に、「得点を1ずつ変える」があるか確認します。「得点を1にする」では、毎回1に設定されてしまいます。
文字を入力しても進まない
入力後にEnterキーか、入力欄のチェックマークを押して確定します。
メニューを入力しても反応しない
「クイズ」「名前」「終了」と入力してください。余分な空白や記号が付いていないか確認します。今回の作例は、自由な文章から意味を読み取る仕組みではありません。
9. 「名前を覚える」とAIの記憶は同じ?
このプログラムは、入力された文字を変数へ保存し、後から取り出しています。学習によって相手を理解したり、自動で会話の内容を考えたりしているわけではありません。
また、緑の旗を押すたびに名前を聞き直します。利用者ごとの情報を外部データベースへ保存する仕組みもありません。
「情報を保存して使うこと」と「AIが学習・推論すること」を区別すると、プログラムが実際に何をしているか理解しやすくなります。
10. 自分の作品にアレンジしよう
- クイズの問題と正解を変更する。
- チャットボットのキャラクターや挨拶を変更する。
- 「得点」というメニューを追加し、現在の点数を表示する。
- 「呼び名」を変更できるメニューを追加する。
一度に全部を変えず、1つ変更するたびに確認すると、動かなくなった原因を見つけやすくなります。
11. 保存と関連記事
ファイルメニューの「コンピューターに保存する」から作品を保存できます。公開する場合は、名前や説明文、変数に個人情報が残っていないか確認してください。
条件分岐をもっと簡単な例から学びたい場合は、次の記事をご覧ください。
声の大きさでキャラクターを動かしたい場合は、次の記事も参考になります。
Scratchで音声認識はできる?声に反応するゲームの作り方
まとめ
Scratchのチャットボットで名前を使い続けるには、最初の回答を変数へ保存します。「呼び名」「メニュー」「得点」のように役割ごとに変数を分けると、会話とクイズを組み合わせられます。
まずは名前を保存する部分を作り、その後にメニューとクイズを追加してみましょう。



コメント