SSブログ

特定のDCCアドレスの列車を探す [python]

次に列車を探すルーチンを考えます。
ある変数に特定の列車の位置をトレース次々と代入していく方法があると思いますが、私の拙い頭では簡単なアルゴリズムが思いつかなかったので、列車を探しに行くようなアルゴリズムにしました。
BASICのfor nextループと同じような感じです。

for i in range(24):
___self.ichi = memories.getMemory(memoriList[i]).getValue()
___if self.ichi == "7":
______if (i == 0) and (memories.getMemory(memoriList[23]).getValue() == "7"):
_________i = 23
______self.singo = singoList[i]
______self.iro = signals.getSignalHead(self.singo).getAppearanceName()
______break

pythonでは左インデントでループの範囲を規定しますが、ここのページでは先頭のスペースは切り詰められるので、ここでは______で示しています。
iを0から23まで回します。24個の閉塞ブロックに渡ってメモリー値をスキャンしていって、途中で値“7”が出れば(最初のif のところ)、信号現示を読みに行き、breakでループを抜けます。
#DCCアドレス7の列車を探しに行くときの例です。

2つめのif のところ、i == 0のときだけ一番後を見に行き、そちらの値も7ならばi = 23とします。
メモリーリストは列車の進行方向とは逆向きに列べてあり、若いリストから見ていき、最初に”7”が出たところに先頭がいるはずです。これはうちのレイアウトが簡単なエンドレスだから出来ることだと思います。こうした理由は、ブロックをまたがって列車がいるときには’7’の値を持つメモリーが2つあり、後側の値を採用してしまうと信号現示が赤となるのを防ぐ手立てです。0番目でヒットしたときだけそのブロックの前は最後尾23ですので、それをifで見に行ってます。

信号現示を読み取れれば
if self.iro == 'Green':
self.sp = 1
elif self.iro == 'Yellow':
self.sp = 0.5
elif self.iro == 'Red':
self.sp = 0
self.throttle = self.getThrottle(7, False)
self.throttle.speedSetting = self.sp

とベタに書いて、列車を減速・停止させることが出来ます。
これを複数の列車に適応させていきます。

nice!(2)  コメント(2)  トラックバック(0) 

nice! 2

コメント 2

ジュンパパ

私のレイアウトでの運転には全く縁遠い記事ですが、pythonでこんなことが出来るんだ~~ と思って毎回拝見しています。

by ジュンパパ (2013-05-03 09:13) 

トータン

basic なら少し判るのですが この言語判りません C言語も苦手でしたからね~
by トータン (2013-05-03 11:21) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。