7.2 状態遷移図による設計

Aさん
先生,状態を加えて,床に着くと上に行くようにしてみました.
M先生
お,すばらしいね.ちょっとプログラムを見せてくれるかな?
Aさん
このようになりました.
M先生
少しプログラムがごちゃごちゃしているね. 状態遷移図 を使って整理してみようか.
Aさん
状態遷移図?
M先生
状態遷移図っていうのはプログラムを 設計 する記法のことだよ.百聞は一見に如かず.書いてみるよ.一つ目が一般的な形で,二つ目がクレーンゲームの場合の状態遷移図だから.
Aさん
どのように読むのですか?
M先生
状態遷移図では,○一つが一つの状態を示している.そして状態の中の「do:」に,その状態のときに繰り返す処理が書かれる.
Aさん
状態1では,「左に行く」を繰り返すってことですか?
M先生
その通り.そして,状態を伴うプログラムは何かのきっかけで状態が変わる.状態が変わることを「遷移」といい,状態遷移図では矢印で示す.遷移が起こるきっかけのことを「 イベント 」という.
Aさん
ええと,状態1で「下向きボタンが押される」というイベントがあったら,状態が2へ遷移するということですね.あと,「リセットボタンが押された」の後の「/座標をリセットする」というのは何ですか?
M先生
遷移には「イベント」のほかに,遷移が起こるときに1度だけ行う処理を記述することもできる.この処理のことを「 アクション 」という.アクションは「/」の後に記述する.
Aさん
なるほど.ということは,状態が3から0へ遷移するときに「座標をリセットする」というアクションを行うというように読めばよいのですね.
M先生
その通り.このように設計段階で整理すると,プログラムもきれいに書き直せるんだよ.例えば,「do:」のプログラムと,状態遷移のプログラムは分けた方が分かりやすくならないかな?
Aさん
うーむ.
M先生
基本的に,種類の違うプログラムは,なるべく分けて描いた方がいい.これは,プログラムが複雑になるほど重要になる.じゃあ,アクションと繰り返す処理のプログラムを分けて書いてみてくれる?
Aさん
分かりました.こんな感じでしょうか?
M先生
うん.スッキリしたね.こうしてみると,抜けてるところが一目瞭然だね.
Aさん
何か抜けていますか?
M先生
状態を遷移させるプログラムは,次の形になっているはず.
テスト
状態が前の状態?
はい
遷移する
いいえ
(なにもしない)
Aさん
あ,その形式に従っていないスクリプトが2つありますね.
M先生
でも,直す箇所ははっきりしたでしょ.
Aさん
状態遷移図を使うまえは,複雑なプログラムで結構頭がごちゃごちゃしていたのですが,図でみると,このプログラムはとてもシンプルだということが分かりました.
M先生
じゃあ一つ直してみて.
Aさん
このようになりますかね.
M先生
よろしい.もう一つは宿題にしよう.

練習問題7.1

もう一つの不完全なスクリプトを直してみよう.

練習問題7.2

クレーンゲームを改良して,スタート地点まで戻るようにしてみよう.ただし,状態遷移図を書いてから始めること.

練習問題7.3

前回のプロジェクトで作ったカーレースゲームのプログラムを,「状態遷移図+変数」を使って作り直してみよう.