こんにちは、ゲストさん 地図 | マイページ | ガイド [ ログイン ]
トピックス

うごけ!道案内プログラミングガイド

うごけ!道案内に用意されたコマンドは多くありませんが、組み合わせたり特性を利用することでいろいろな使い方ができます。 そんなTIPSをいくつかご紹介します。

ユーザの入力待ちメッセージを作る

messageコマンドで表示されるメッセージは何か他のコマンドが実行されると消えてしまうので、一般的には直後にsleepコマンドでウェイトを入れます。ちなみにイージーモードで「メッセージを追加」するとsleep 3000が挿入されます。

ダラ見のコンテンツには良いのですが、ユーザにじっくり読ませて「次へ」としたい場合はmessageの代わりにaskを使うと便利です。askの選択肢を1つだけにすると、ユーザがボタンを押すまでスクリプトの進行を待つメッセージが表示できます。

sample code

switchコマンドにbreak機能を追加

switchコマンドは一般的なプログラミング言語のswitch文に近い機能を提供するものですが、「n番目の選択肢ならswitchコマンドの下n番目の行に実行位置を移動」という簡易的な構造なので、一般的にはn番目の行にはgotoコマンドを並べないと実用になりません(次々その下の選択肢が実行されてしまう)。

単に表示したいメッセージを変えたいだけなのにgotoコマンドとラベル行が多くなってわずらわしいときには、switch~breakを模した以下の構造を使うとよいでしょう。

sample code ありえない選択肢をダミーで用意することで、それぞれの選択肢に実行可能な行数の余地を生み出します。ここでは「-」という選択肢をダミーとして用いています。statusがgoodの場合は1行目に、statusがbadの場合は3行目に、それ以外(たとえばwellとか)の場合は5行目に実行位置が移動します。それぞれの行を実行したあと、goto breakで等しく:break行に実行位置が移動します。

注意点としては、うごけ!道案内における変数やgoto文のラベルはすべてグローバルなので、breakというラベル名もスクリプトの中でユニークである必要があります。実際にはbreakといった衝突しそうな名前は避けて、break001など命名規則を工夫するとよいでしょう。

promptコマンドとswitchコマンドで自由回答式クイズ

クイズを実現するにはaskコマンドを使うのが一般的ですが、正しい答えを入力させたい、といった自由回答式のクイズを作りたい場合はpromptコマンドとswitchコマンドを組み合わせて使ってみましょう。

sample code answerが「ぽんとちょう」の場合のみ、q2に進みます。
ここで分かるように、switch name valueはif (name == value)のような機能になります。

incサブルーチンを作る

うごけ!道案内の変数はすべて文字列です。なので正解したらポイントをプラス、といった単純な加算処理もできません。ここでは簡易的なinc命令(変数の値を1増加する)を実装してみることにします。テストを含めたコードは以下になります。

sample code 見てのとおり、相当ムリヤリです。つまり「valueの値が3だったら、valueの値に4をセットして戻れ」という処理をswitchで分岐させているだけです。当然ながら扱える数字の範囲だけset valueとgotoが必要なので、どんな数でもというわけにはいきません。ここでは10点満点のクイズを作るためという設定で0~10の値を扱えるようにしてあります。

また、inc以外にも、returnというルーチンがあるのが分かるかと思います。
incを汎用的に使うために、returnという戻り専用のルーチンを用意し、valueとreturntoという2つの変数を現在の状態を退避しておく場所として利用しています。具体的な処理は以下のように流れます。
  1. incしたい変数を、valueに代入する
  2. incから戻りたい場所のラベル名を、returntoに代入する
  3. incを呼び出す(goto inc)
  4. valueの値が1増やされる
  5. incの中からreturnが呼び出される(goto return)
  6. returntoの値でswitchして、指定のラベル位置にgotoする
  7. 計算されたvalueの値を、元の変数に戻す
この方式の欠点は、returnルーチンが利用可能なreturntoの選択肢を全て知っていなければならない、ということです。つまりset returnto hogehogeと書くだけではダメで、returnルーチンのswitchの選択肢およびgoto行にもhogehogeを追加しなければいけません。これはこれで面倒なので、上記の例ではアルファベット1文字のa~gのラベルはreturnto専用のラベルという位置付けにし、その範囲内なら選択肢は記述済みですよ、という具合にしてあります。スクリプトが長くなってくるとa~gでは足りなくなると思いますので、そのときにはa~zにするなり0~9999にするなりして対処してください。