はじめに
さて、前回までにおおよその機能は実現できましたが、まだいくつか不満があります。
まず一つは、キー入力でタートルを自在に動かせるのは良いけれど、あらかじめ登録しておいた(プログラム中の変換テーブルに書き込みした)命令しか実行できません。
ちょっと他の命令をしたいだけなのに、わざわざプログラムを編集しなくてはいけないというのは、不便ですよね。
そこで、メッセージ送信プログラムを次のように修正してみました。 まずはインストールして、実際にプログラムを動かしてみましょう。
インストール&実行
送信(コンピュータ)側
msg_sender5のインストール。
> pastebin get mV08nRTx msg_sender5
インストールしたら、送信先IDを引数にして、これまでのように実行してください。
受信(タートル)側
msg_receiver4のインストール。 前回と同じなので、すでにインストールしてあるならそのままで。
> pastebin get dEtcqCHY msg_receiver4
msg_receiver4を実行して、待ちうけ状態に。なお、燃料はあらかじめ補給しておくこと。
プログラム実行
送信(コンピュータ)側の画面です。
- "space"キーや"leftShif"キーなど、あらかじめ登録してあるキーは問題なく動きます。
- ここで、"enter"キーを押してみましょう。インタラクティブモード(interactive mode)に変わります。下画像のように、プロンプト「>」が表示されます。
- 好きな命令を入力してみましょう。ここではタートルの選択スロットを変更する
turtle.select()
関数を入力しています。 - 入力後、再度"enter"キーを押すと、その命令を確定します。確定したら以下の画像のようにインタラクティブモードを終了して、
turtle.select(1)
というメッセージを送信したことがプログラムより報告されます。 - なお、"q"キーを押すことで、プログラム自体を終了します。
ね? このインタラクティブモードってすごくありません?
では、どのようにしてこの機能を実現したか、具体的にプログラムを見てみましょう。
メッセージ送信(コンピュータ)側 バージョン5(修正)
msg_sender5
変更点は、L31-37だけです。
- L31) "enter"キーが入力され、(変換テーブルに"enter"に関する記述がないために)変数messageの値がnilであるときに以下の動作を行います。
- L32,33,35) ただの画面表示メッセージ
- L34)
io.read()
関数により、ターミナル画面での1行の入力を受け取り、変数messageに代入。 - L37) "q"キーの入力、あるいはインタラクティブモードで、"q"の入力があったときにwhileループを抜けてプログラム終了。
ポイントは、 io.read()
ですね。
io.read()
(Lua5.1リファレンスマニュアルより)- 標準入力(ターミナル画面上での入力)から1行の読み込みを行う
- 返値(文字列): 入力された1行の文字列
LuaのI/Oモデルに関しては、また時間のあるときにでも詳しく説明しましょう。
今のところは、io.read()だけで、ターミナル画面上での1行の入力を読み込みことができると覚えておけばOKです。
おわりに
さてここまでくると、命令を送信したときに、
- 「そもそもそのような命令が有効なのかどうか」
- たとえば、命令したけれど、スペルミスなどで命令文そのものが有効ではないとか
- 「その命令を実行しようとして成功したかどうか」
- たとえば、turtle.up()を実行したけれど、障害物があって上に移動できなかったとか
という反応が気になるところです。
命令したときに、命令の遂行に成功したのか失敗したのか、そして失敗したのならどのような原因で失敗したのか。これらのエラーが返ってくると、さらにわかりやすく使いやすくなりますよね。
次回はこのあたりを改造しましょう。