見出し画像

【Robo Blocksの使い方】文字を扱うブロック_その2 しりとりプログラム

ソフトバンクロボティクスでPepperを使ったプログラミング教育を担当してる佐藤です!
前回紹介した文字操作のブロックを使って、実際に文字を操作するプログラムを作成してみたいと思います。


しりとりをするプログラム

今回は文字操作の例として、しりとりをするプログラムを作ってみたいと思います。対象の単語を増やしすぎると難しくなってしまいますので、一旦3文字の単語だけを使った「3文字しりとり」に限定してプログラムをつくってみます。

まずは3文字の言葉を聞き取るプログラムを作ります。
人が言った言葉が3文字かどうか判定することになりますので、○の長さブロックを使って条件を作ります。

3文字かどうか判定する

これを使って以下のようにプログラムを作成しました。
聞き取った言葉が3文字の時にだけ反応するプログラムです。
聞き取る言葉に*(ワイルドカード)を指定するとフリーワード聞き取りになります。言葉を指定する場合と比べて精度が落ちてしまいますが、今回は遊びのアプリで精度をあまり重視しない場面ですので使ってみます。

3文字の言葉のみ聞き取る

しりとりですので、"○の○番目めの文字ブロック"を使って聞き取った文字列のしりの1文字を取ってみます。

○の○番目めの文字ブロック

今回は3文字しりとりですので必ず3文字の言葉がきますので、以下のように組めば問題なく動きます。

しりの1文字をとる

何文字の言葉でもいい形式にする場合は以下のようになります。
今回は今後4文字しりとりなどに変更したい時に自動で対応できるこちらの方法で作ってみます。

長さ番目の文字をとると何文字の言葉でもしりの1文字が取れる

実際にしりとりをする部分はブロック定義で作ってみます。
(ブロック定義についてはこちらの記事をご覧ください)
以下のように1文字渡すとしりとりに答えてくれるブロックをイメージして作りました。

1文字渡してしりとりをするブロックをブロック定義で作成する

これを使い、全体は以下のようになりました。

ブロック定義で作ったブロックを入れた全体像

では、しりとりに答える部分の中身を作っていきます。
まずは答えるために必要なPepperの語彙リストを用意します。
語彙を増やせば増やすほど強力なしりとりPepperを作ることができますが、キリがないのでここでは50音の単語をそれぞれ1つずつ入れてみます。
分かりやすさのために濁音・半濁音は無いものとしました。
(最初にリストを削除している理由についてはリストについての紹介記事をご確認ください。)

Pepperの語彙リストを作成する

こちらのリスト作成はしりとりを開始する前に行う必要があります。ここではブロック定義にまとめてプログラムのスタート直後に行うようにしました。

リストの作成はしりとりの前に行っておく

これでPepperの語彙リストに単語が入りました。

Pepperの語彙リストの中身

では、回答部分を作成しましょう。
回答の手順は以下のようになります。
1. しりの1文字から始まる単語がPepperの語彙リストにあるのか検索する
2. あるならそれを返し、リストからその単語を消す(しりとりで同じ単語は2度使えないため)
3. ないなら負けを認める

まず「1. しりの1文字から始まる単語がPepperの語彙リストにあるのか検索する」を作成します。
今回はシンプルにPepperの語彙リストの中身を一つ一つ見ていって、あるかどうか探すという方法で作ってみます。
リストの中身を全て見ていくので、以下のような繰り返し条件になります。

リストの中身を全て見る場合、リストの長さ回繰り返す

しりの1文字がPepperの語彙リストの1番目の単語の先頭の1文字かどうか確認する条件は以下のようになります。

1番の目の要素の1文字目がしりの1文字と一致するかどうか

これをPepperの語彙リストの全ての単語と比較していけば良いので、変数を使って以下のようにします。

Pepperの語彙リストの単語全てからしりとりの条件に当てはまる単語がないか探す

「1. しりの1文字から始まる単語がPepperの語彙リストにあるのか検索する」ができましたので「2. あるならそれを返し、リストからその単語を消す」を作成します。

先ほどの検索条件に一致した場合の部分に追加します。
先に削除してしまうと正しく単語を記憶できなくなってしまうので、記憶→削除の順になるようにします。

一致した場合、その単語を変数に格納してから削除する

次は「3. ないなら負けを認める」を作ります。
Pepperの語彙リストに単語がある場合は、変数"Pepperの返答"はその単語になりますが、無い場合は変数"Pepperの返答"の値は変わらないことを利用して、初期値を負けにしておきます。
こうすると全ての処理が終わった後、"Pepperの返答"が負けであるかどうかチェックすれば一致する単語があったかどうか分かります。

初期値を負けにする

"Pepperの返答"が負けの場合は降参してアプリを終了、そうでない場合は返答する部分を作ります。返答した後はもう1回しりとりが続くように、聞き取りを再開させます。

降参するか続けるか判定して、返答する

これを末尾にくっつけて、しりとりに返答するブロックの完成です。

しりとりに返答するブロックの定義部分

プログラムの全体像は以下です。
単語リストが長いのでブロック数は多く見えますが、しりとり部分は文字列の操作ブロックを使い、意外と少ないブロックで作られている感じがなんとなく見えると思います。

プログラムの全体像

まとめ

今回は文字列を操作するプログラムの例ということで、しりとりをするプログラムを作成してみました。
このプログラムは不完全で、Pepperが聞き取った言葉がひらがな三文字でない場合動かない・濁音や半濁音に対応していないなどの問題があります。
こういったプログラムを練習で作ってみるとその辺りの対応が必要になることがわかり、市販のプログラムはよくできているなあと感心していただけるかもしれません(笑)
ぜひ作ってみてください!