![見出し画像](https://assets.st-note.com/production/uploads/images/73244610/rectangle_large_type_2_6aa0437fb525bc3bf04f963ed0e01956.png?width=800)
【Robo Blocksの使い方】文字を扱うブロック_その2 しりとりプログラム
ソフトバンクロボティクスでPepperを使ったプログラミング教育を担当してる佐藤です!
前回紹介した文字操作のブロックを使って、実際に文字を操作するプログラムを作成してみたいと思います。
しりとりをするプログラム
今回は文字操作の例として、しりとりをするプログラムを作ってみたいと思います。対象の単語を増やしすぎると難しくなってしまいますので、一旦3文字の単語だけを使った「3文字しりとり」に限定してプログラムをつくってみます。
まずは3文字の言葉を聞き取るプログラムを作ります。
人が言った言葉が3文字かどうか判定することになりますので、○の長さブロックを使って条件を作ります。
![](https://assets.st-note.com/img/1646041339644-J2yPgDQLnl.png?width=1200)
これを使って以下のようにプログラムを作成しました。
聞き取った言葉が3文字の時にだけ反応するプログラムです。
聞き取る言葉に*(ワイルドカード)を指定するとフリーワード聞き取りになります。言葉を指定する場合と比べて精度が落ちてしまいますが、今回は遊びのアプリで精度をあまり重視しない場面ですので使ってみます。
![](https://assets.st-note.com/img/1646041742646-vabVb1ojRV.png?width=1200)
しりとりですので、"○の○番目めの文字ブロック"を使って聞き取った文字列のしりの1文字を取ってみます。
![](https://assets.st-note.com/img/1646042047091-9uilRF397N.png)
今回は3文字しりとりですので必ず3文字の言葉がきますので、以下のように組めば問題なく動きます。
![](https://assets.st-note.com/img/1646042108827-cnzGWN5YXz.png?width=1200)
何文字の言葉でもいい形式にする場合は以下のようになります。
今回は今後4文字しりとりなどに変更したい時に自動で対応できるこちらの方法で作ってみます。
![](https://assets.st-note.com/img/1646042195077-lpUdFQzjzx.png?width=1200)
実際にしりとりをする部分はブロック定義で作ってみます。
(ブロック定義についてはこちらの記事をご覧ください)
以下のように1文字渡すとしりとりに答えてくれるブロックをイメージして作りました。
![](https://assets.st-note.com/img/1646043034462-kyiQGm12ip.png?width=1200)
これを使い、全体は以下のようになりました。
![](https://assets.st-note.com/img/1646043248462-xUW3bqQW63.png?width=1200)
では、しりとりに答える部分の中身を作っていきます。
まずは答えるために必要なPepperの語彙リストを用意します。
語彙を増やせば増やすほど強力なしりとりPepperを作ることができますが、キリがないのでここでは50音の単語をそれぞれ1つずつ入れてみます。
分かりやすさのために濁音・半濁音は無いものとしました。
(最初にリストを削除している理由についてはリストについての紹介記事をご確認ください。)
![](https://assets.st-note.com/img/1646044618408-Ggq5tYt8Eg.png?width=1200)
こちらのリスト作成はしりとりを開始する前に行う必要があります。ここではブロック定義にまとめてプログラムのスタート直後に行うようにしました。
![](https://assets.st-note.com/img/1646044863747-CHxlWgQHuy.png?width=1200)
これでPepperの語彙リストに単語が入りました。
![](https://assets.st-note.com/img/1646045435539-5SxV75zILS.png?width=1200)
では、回答部分を作成しましょう。
回答の手順は以下のようになります。
1. しりの1文字から始まる単語がPepperの語彙リストにあるのか検索する
2. あるならそれを返し、リストからその単語を消す(しりとりで同じ単語は2度使えないため)
3. ないなら負けを認める
まず「1. しりの1文字から始まる単語がPepperの語彙リストにあるのか検索する」を作成します。
今回はシンプルにPepperの語彙リストの中身を一つ一つ見ていって、あるかどうか探すという方法で作ってみます。
リストの中身を全て見ていくので、以下のような繰り返し条件になります。
![](https://assets.st-note.com/img/1646045583328-Vu3sBndNhp.png?width=1200)
しりの1文字がPepperの語彙リストの1番目の単語の先頭の1文字かどうか確認する条件は以下のようになります。
![](https://assets.st-note.com/img/1646045726279-5O4WGVQCX3.png?width=1200)
これをPepperの語彙リストの全ての単語と比較していけば良いので、変数を使って以下のようにします。
![](https://assets.st-note.com/img/1646045969721-oAoRkusitn.png?width=1200)
「1. しりの1文字から始まる単語がPepperの語彙リストにあるのか検索する」ができましたので「2. あるならそれを返し、リストからその単語を消す」を作成します。
先ほどの検索条件に一致した場合の部分に追加します。
先に削除してしまうと正しく単語を記憶できなくなってしまうので、記憶→削除の順になるようにします。
![](https://assets.st-note.com/img/1646046164029-re51U0ENJ7.png?width=1200)
次は「3. ないなら負けを認める」を作ります。
Pepperの語彙リストに単語がある場合は、変数"Pepperの返答"はその単語になりますが、無い場合は変数"Pepperの返答"の値は変わらないことを利用して、初期値を負けにしておきます。
こうすると全ての処理が終わった後、"Pepperの返答"が負けであるかどうかチェックすれば一致する単語があったかどうか分かります。
![](https://assets.st-note.com/img/1646046469082-8tGfPg5L23.png?width=1200)
"Pepperの返答"が負けの場合は降参してアプリを終了、そうでない場合は返答する部分を作ります。返答した後はもう1回しりとりが続くように、聞き取りを再開させます。
![](https://assets.st-note.com/img/1646046778792-9YG0XP6IcF.png?width=1200)
これを末尾にくっつけて、しりとりに返答するブロックの完成です。
![](https://assets.st-note.com/img/1646046853492-ziCSIuRLJR.png?width=1200)
プログラムの全体像は以下です。
単語リストが長いのでブロック数は多く見えますが、しりとり部分は文字列の操作ブロックを使い、意外と少ないブロックで作られている感じがなんとなく見えると思います。
![](https://assets.st-note.com/img/1646046970143-wodrKPbcmv.png?width=1200)
まとめ
今回は文字列を操作するプログラムの例ということで、しりとりをするプログラムを作成してみました。
このプログラムは不完全で、Pepperが聞き取った言葉がひらがな三文字でない場合動かない・濁音や半濁音に対応していないなどの問題があります。
こういったプログラムを練習で作ってみるとその辺りの対応が必要になることがわかり、市販のプログラムはよくできているなあと感心していただけるかもしれません(笑)
ぜひ作ってみてください!