7. スクリプトを改造(5)
Perl/Tk 版の改造(最終回)
オッズに関しては、人によって考え方が違うので一つの例だけ取り上げてコレがベストとか正しいとか
言う気はありません。
まぁ自分の場合、単勝は別として三連複、三連単、馬単、馬連の順にオッズを見てるかな、という感じ
です。
三連単なんかは工夫のしがいがありそうで、自分のスタイルに合わせて、なんとか見やすいのを作り
たいなと思っています。
今回は、三連単を取り上げます。前回と重複する部分もあります。
説明予定だったpush_go は、名前が変ったりしています。
何時何分時点でのオッズか?どのくらい売れているのか?という情報も JV データには含まれている
ので表示できるようにしてみました。
自分にとって三連複は BOX と2頭軸で充分、三連単は FORMATION かなという気分なので、その方
法でオッズを表示させます。
##### オッズ関連で追加の変数・配列
my $s1 ; # 三連複馬番選択 Window
my @cb ; # 三連複馬番用〜ボタン配列
my @odds_tan = () ;
#---------------------------------
my @odds_3rn = () ;
my $odds_inf ;
#---------------------------------
my $s2 ; # 三連単馬番選択 Window
my $fr1 ; # フレーム
my $fr2 ; #
my $fr3 ; #
my @cba ; # 三連単◎馬番用〜ボタン配列
my @cbb ; # 三連単○馬番用〜ボタン配列
my @cbc ; # 三連単▲馬番用〜ボタン配列
#---------------------------------
オッズ部分での、グローバル変数はこれくらいです。
sub sr2_window { # 三連単
if ( Exists( $s2 ) ) {
$fr1->destroy() ;
$fr2->destroy() ;
$fr3->destroy() ;
} else {
$s2 = $mw->Toplevel( -title => '三連単' ) ;
$s2->Label( -text => '三連単 FORMATION',
-foreground => "#800000",
-background => "#f0f0d0",
-font => [ "FixedSys", 14 ] )->pack() ;
$s2->Button( -text => "Go!", -command => \&push_go2 )->pack() ;
}
( @cba, @cbb, @cbc ) = () ;
&get_odds() ;
my ( $tosu ) = @{$odds_inf}[2] ;
$fr1 = $s2->Frame() ;
$fr2 = $s2->Frame() ;
$fr3 = $s2->Frame() ;
for my $i ( 1..$tosu ) { # 馬番号のついたボタン◎用
my $j = sprintf "%2d", $i ;
$cba[$i] = $fr1->Checkbutton( -text => $j,
-indicatoron => 'no',
-selectcolor => "#ffffb0"
)->pack( -side => 'left' ) ;
}
$fr1->pack( -anchor => 'c' ) ;
for my $i ( 1..$tosu ) { # 馬番号のついたボタン○用
my $j = sprintf "%2d", $i ;
$cbb[$i] = $fr2->Checkbutton( -text => $j,
-indicatoron => 'no',
-selectcolor => "#ffebb0"
)->pack( -side => 'left' ) ;
}
$fr2->pack( -anchor => 'c' ) ;
for my $i ( 1..$tosu ) { # 馬番号のついたボタン▲用
my $j = sprintf "%2d", $i ;
$cbc[$i] = $fr3->Checkbutton( -text => $j,
-indicatoron => 'no',
-selectcolor => "#ffeef0"
)->pack( -side => 'left' ) ;
}
$fr3->pack( -anchor => 'c' ) ;
}
頭数はこんなふうにしてみました。⇒ my ( $tosu ) = @{$odds_inf}[2] ;
$odds_inf は、配列のリファレンスです。
頭数分のボタンを3列並べただけで素っ気ないですが、とりあえずこれで我慢。
Frame を使いましたが、このへんは分かって使ってるわけではなく、山勘です。
sub push_go2 {
my @se1 ;
my @se2 ;
my @se3 ;
my ( $kubn, $jifun, $tosu, $hyo ) = @$odds_inf ;
$hyo += 0 ;
my ( $ji, $fun ) = unpack 'A2A2', $jifun ;
my $jikan = $ji . '時' . $fun . '分' ;
my $bln = $kubn == 1 ? $jikan : $kubn == 2 ? '前売最終' :
$kubn == 3 ? '最終' : $kubn == 4 ? '確定' :
$kubn == 5 ? '確定(月)' : '--------' ;
for my $i ( 1..$tosu ) {
${ $cba[$i]->cget( -variable ) } and push @se1, $i ;
${ $cbb[$i]->cget( -variable ) } and push @se2, $i ;
${ $cbc[$i]->cget( -variable ) } and push @se3, $i ;
}
print "\n\t 三連単〜FORMATION〜 $bln オッズ (人気) \t売計 ${hyo}万円\n\n" ;
for my $i ( 0..$#se1 ) {
my $aa = $se1[$i] ;
for my $j ( 0..$#se2 ) {
my $bb = $se2[$j] ;
next if $aa == $bb ;
for my $k ( 0..$#se3 ) {
my $cc = $se3[$k] ;
next if $aa == $cc ;
next if $bb == $cc ;
my ( $odds, $jun ) = unpack 'A7A4', $odds_3rn[$aa][$bb][$cc] ;
$odds /= 10 ;
$jun = sprintf "(%4d)", $jun ;
$odds = $odds == 0 ? ' ---' :sprintf "%9.1f", $odds ;
my $deme = sprintf "\t\t [%2d→%2d→%2d]", $aa, $bb, $cc ;
print "$deme $odds $jun\n" ;
}
}
}
}
これでいいのなら、出力に関しては三連複より簡単です。
三連複用のpush_go 改め ⇒ push_go1 は直接スクリプトを見てく
ださい。
オッズ取得(三連単の場合)の部分は以下の通りです。
if( $rad == 4 ) { # 三連単オッズ
my $odds_6 = "${zpass}/${yymmdd}/0B36${yymmdd}${bbrr}\.dat" ;
open DAT, $odds_6 if -e $odds_6 ;
while ( <DAT> ) {
$do1->() ;
my ( $kubn, $jifun, $to, $alls, $hyo ) = unpack
'@2 A1 @31 A4 @35 A2 @40 a83232 @83272 a9', $_ ;
$odds_inf = [ $kubn, $jifun, $to, $hyo ] ;
my @ozdat = unpack 'A17' x 4896, $alls ;
for ( @ozdat ) { # 三連単ODDS
my ( $z1, $z2, $z3, $zoz ) = unpack 'A2A2A2A11', $_ ;
$odds_3rn[$z1][$z2][$z3] = $zoz ;
}
}
close DAT ;
}
$hyo は本来、ここでは11桁(100円単位)ですが、上から9桁(万単位)取ってきています。
このように、JV データ仕様書のフォーマットをコチラの都合で刻んでいます。
$jifun も本来、前に月日が4桁入っています。
他は、自分で改造して出力してみてください。
ココまでの修正を含めた最終版 をUPしておきます。(2005.08.08)
★ 早速、修正です。レース前日などで、まだオッズが無い時点で三連複オッズを
見ようとすると
エラーが表示されます。別に実害はないのですが気になる人は対策してください。
(2005.06.24)
get_odds の三連複オッズ取得部分で
next unless -e $odds_5 ;
open DAT, $odds_5 ;
の2行を
open DAT, $odds_5 if -e $odds_5 ;
の1行に書き換えます。三連単のほうは既に修正済みです。
★★ 更に修正です。こちらは、重要な修正です。
グレードレースがすべてオープンと表示され、オープン特別として扱われていました。
(2005.06.26)
kbs の最初の部分で
my $gr = substr( $kline, 505, 2 ) ;
は
my $gr = substr( $kline, 505, 1 ) ;
と書き換えます。
この調子だとマダ不安ですが、修正はこちらに追加で書き込む予定でいます。
Tk の楽しさは、Widgets の知識を深めながら、色、形、大きさ、位置などを好きなように並べ替えるだけ
でなく使いやすいようにイクラでも改造できることだと思います。
その領域まで深く踏み込む気がなくても結構、簡単に出来そうな気もします。
今回は、改造のために必要と思われる部分を重点的に取り上げてきました。
Perl について少しでも興味や関心のある人なら、これで充分だと思います。
JV データの部分以外については、そのまま使わなくても参考になるとおもいます。
シェープアップの余地もいっぱいあるし、Perl は一つのことをやるにも 100 の方法がある
ナンテことを
いわれるほど奔放な言語です。楽しんでください。
ここまで、モジュールから大きく外れて、Perl/Tk 版への改造に終始してしまいました。
しかし、JV データを手軽にプログラミングする手段として、Rerl/Tk はかなり有力
だと思います。
ソフトとして売るのが目的なら勧めませんが馬券で勝つためのツールとして使うのなら、ここにも
サンプルがあることだし、最高の選択肢じゃないでしょうか?
いいのが出来たら公開するか、教えてください。
気に入ったら、それを使わせていただくかもしれませんので、、