6. スクリプトを改造(4)
今回は、三連複オッズの表示にチャレンジします。
my @selec = ( '基本情報', '+過去3走', '+戦績集計', '三連複odds', '三連単odds' ) ;
前に書いた方法で 情報選択ボタンの数を2コ増やし、 @selec にも項目を追加します。
sub push_butta {
$racenum = shift ;
$buffer = sprintf( "%2d", $racenum ) . 'R' ;
if( $rad < 3 ) {
&step1() ;
} elsif( $rad == 3 ) {
&sr1_window() ;
} elsif( $rad == 4 ) {
&sr1_window() ;
}
}
push_butta も例えば上記のように、とりあえず書き換えておきます。
三連複オッズに関しては、上の場合 $rad == 3 の括りの中に入れればいいわけです。
sub sr1_window {
print "\n\t\t 三連複odds は準備中です。 \n" ;
}
sub sr2_window {
print "\n\t\t 三連単odds は準備中です。 \n" ;
}
sub get_odds { # オッズを取得
;
}
sub push_go { # Go!ボタンを押したとき
;
}
↑ この4つ程度は必要ですかね。中身は後から少しづつ考えましょう。
いよいよ始める前に、表示させるまでの流れを考えてみます。
1. 情報分岐ボタンで三連複を選ぶ。場名ボタン選ぶ。
2. レースNo. を押す。
3. 馬番選択用の新しい画面が現れる。
4. 馬番を、何頭か選んで Go! ボタンを押す。
5. 三連複オッズが表示される。
とすると、3. の馬番選択用の新しい画面を作らないといけないですね。
馬番選択なら、レースNo.選択と同じようなボタンを並べればいいわけですが、出走頭数が
分から
なければボタンの数が決まりません。仮に $tosu とします。
出走頭数、というのは正確ではないですね。正しくは馬番確定後の登録頭数
です。
これは、JVData仕様書のフォーマットを参照してください。(←常識ですね)
問題はこの、882Byte目からの 2Byte ⇒ 例えば Perl の場合、substr( $_, 881, 2) でも
encoding による影響(2Byte文字の数え方)で、位置の調整が必要です。
この位置までに、全角文字が使われている部分が278Byteなので、半分の139の位置調整。
つまり正しく出すには、このスクリプトでは
$tosu = substr( $racejho[$bbcd][$racenum], 742, 2 ) ; となります。
全角が使われる位置が確定している場合は、この方法でいいのですが同じ位置に混在する場合
も
あります。
例えば、UM(競走馬マスタ)ファイルでは、lengthで文字数を出して本来の長さ
と比較する方法を使
いました。SE(馬毎レース)ファイルでも同じ作業が必要なのですが、こちらはマダやってい
ません。
これらの事情については、JVData仕様書を参考にしてください。
sub sr1_window {
if ( Exists( $s1 ) ) {
for my $i ( 1..$#cb ) {
$cb[$i]->destroy() ;
}
} else {
$s1 = $mw->Toplevel( -title => '三連複' ) ;
$s1->Label( -text => '三連複BOX〜準備中',
-foreground => "#800000",
-background => "#f0f0d0",
-font => [ "FixedSys", 12 ] )->pack() ;
$s1->Button( -text => "Go!",
-command => \&push_go )->pack() ;
}
@cb = () ;
my $tosu = substr( $racejho[$bbcd][$racenum], 742, 2 ) ;
for my $i ( 1..$tosu ) { # 馬番号のついたボタン
my $j = sprintf "%2d", $i ;
$cb[$i] = $s1->Checkbutton( -text => $j,
-indicatoron => 'no',
-selectcolor => "#d5f7be"
)->pack( -side => 'left' ) ;
}
}
見栄えは各自勝手に変えてもらうにしても、こんな感じですか?
あとは、三連複オッズを取り込むサブルーチンと、Go!ボタンを押したときの
処理を考えるだけで
すね。
オッズ取り込みに関しては、kbs の中にも一部ありますが、ココは自前で
用意したいと思います。
というか、サブルーチンとして分離したほうよさそうです。
下手に弄ると動かなくなるのが大体こういう場面ですが自信満々、行きます。
この辺りで既に sSeia の能力の限界を超えているので、間違いも連発しているかもしれ
ません
が、ツマランこと気にしていたら、人生楽しくないからね〜
とヨッパライの口説き文句かぃ。
my @odds_tan = () ;
my @odds_3rn = () ;
sub get_odds { # オッズを取得
my $bbrr = sprintf "%02d%02d", $bbcd, $racenum ;
{ # 単勝オッズ
my $odds_1 = "${zpass}/${yymmdd}/0B31${yymmdd}${bbrr}\.dat" ;
next unless -e $odds_1 ;
open DAT, $odds_1 ;
while ( <DAT> ) {
$do1->() ;
my @ozdat = unpack 'A8' x 18, substr( $_, 43, 144 ) ;
for ( @ozdat ) { # 単ODDS
my ( $umb, $todds ) = unpack 'A2A6', $_ ;
$odds_tan[$umb] = $todds ;
}
}
close DAT ;
}
if( $rad == 3 ) { # 三連複オッズ
my $odds_5 = "${zpass}/${yymmdd}/0B35${yymmdd}${bbrr}\.dat" ;
next unless -e $odds_5 ;
open DAT, $odds_5 ;
while ( <DAT> ) {
$do1->() ;
my ( $kubn, $jifun, $to, $alls, $hyo ) = unpack
'@2 A1 @31 A4 @35 A2 @40 a12240 @12280 a11', $_ ;
my @ozdat = unpack 'A15' x 816, $alls ;
for ( @ozdat ) { # 三連複ODDS
my ( $z1, $z2, $z3, $zoz, $zj ) = unpack 'A2A2A2A6A3', $_ ;
$odds_3rn[$z1][$z2][$z3] = $zoz ;
}
}
close DAT ;
}
if( $rad == 4 ) { # 三連単オッズ
my $odds_6 = "${zpass}/${yymmdd}/0B36${yymmdd}${bbrr}\.dat" ;
next unless -e $odds_6 ;
open DAT, $odds_6 ;
while ( <DAT> ) {
$do1->() ;
my ( $kubn, $jifun, $to, $alls, $hyo ) = unpack
'@2 A1 @31 A4 @35 A2 @40 a83232 @83272 a11', $_ ;
my @ozdat = unpack 'A17' x 4896, $alls ;
for ( @ozdat ) { # 三連単ODDS
my ( $z1, $z2, $z3, $zoz, $zj ) = unpack 'A2A2A2A7A4', $_ ;
$odds_3rn[$z1][$z2][$z3] = $zoz ;
}
}
close DAT ;
}
}
こんな感じじゃないでしょうか。使うかもしれないデータも未検証ですが押さえてあります。
面倒がらなければ表示に関してはイロイロ細工の施しようもあるけれど、あとは好きにやって
もらう
ことにしましょう。
次は、いよいよ表示するための最後のサブルーチンpush_go の予定です。
↑ かなりの修正があります。
例えば、登録頭数などもオッズデータに含まれており、@racejho からワザワザもってくる必要
はあり
ません。
get_odds で入手して、それを使うのが正しいようです。
その他にも、この項ではスクリプトの修正はしませんが次項以降でかなりの修正があります。