AKAGI Rails

鉄道模型シミュレーターで遊んでいたはずが、気づいたらPythonなども。

種別コードを先入れ先出しするキュー Python編

以前,バージョン5のVRMスクリプトで種別コードを先入先出するキューの作例を紹介した。旧VRMスクリプトには配列変数のような概念はなかったので,32bit int型変数を3ビットずつ区切って0~7の種別コードを入れる「枠」とみなし,ビット演算によって種別コードをキューに入れたり取り出したりしていた。

Pythonにおいては,Cでいう配列変数を強化したような「リスト」というデータ形式があるので,それを使って同じことをしてみよう。リストはPython標準の型なので,VRMNX上のPythonエンジンでなくても使うことができる。

実現方法はとてもカンタン。まずは,空のリストを定義する。

TypeQueue = []

appendメソッドで,リストの末尾に要素を追加することができる。

TypeQueue.append(4) # 種別4をキューに追加

ある程度キューに溜まってきたとして,次に来る種別コードを取り出そう。pop(0)が使える。0番目(先頭)の要素を取り出し,もとのリストからは削除する。

TypeQueue = [4, 1, 3, 2]
next = TypeQueue.pop(0) # nextは4, TypeQueueは[1, 3, 2]になる

とてもシンプル。

もし,リストが空のときにpopをしようとすると,IndexErrorが発生する。VRMNXでは,エラーが発生するとそのフレームで以降のスクリプトの処理を中止するようだ。(ビュワーは落ちない。)知らずに中止されては都合が悪いが,これを回避するには簡単な方法が2つある。

if TypeQueue == []:
    # リストが空だったときの処理
    pass # 何もしないならこう書いておけばよい(行儀は悪いけど)
else:
    # リストに中身があったときの処理
    TypeQueue.pop(0) # エラーは出ない
try:
    next = TypeQueue.pop(0)
except IndexError:
    # IndexErrorが出てうまくいかなかったときだけここが実行される
    vrmapi.LOG('Errors should never pass sliently')

2つ目の構文はtry~except節とか言って(旧VRMスクリプトと異なる)Pythonらしいスタイルのひとつである。詳しくはググってみて欲しい。

VRMスクリプトでやったときには,末尾に書いたように,Pythonのような高級言語ではこういうことがいっぱいできて,ビット演算なんか使うことは(少なくとも自分が使う範囲では)ないんじゃないか,と思っていたのだが,現在準備中の,踏切を動かす処理の中では早速使うことになった。VRMNXの次のアップデートを待って順次出していくので,お楽しみに。