jug7.com
[ home / cgi / juggler / column / diary / bbs / link / welcome ]


ジャグデータから出玉推移グラフ出力



テーブルタグ吐き出し(ジャグ用) によってジャグデータの html ファイルを作成。
その html ファイルを読み込んで出玉推移グラフ(png ファイル)を出力する perl スクリプトです。

PC環境に perl がインストールされている必要があります。
また、GD::Graph モジュールも必須です。

2005/04/02 追記

九死虫 氏が自分の書いたperlスクリプトをブラウザでも使用できるように改良してくれました。
データのテーブルタグを吐き出すのはもちろん、グラフ出力がブラウザで行えます。

九死虫 氏のサイトのコンテンツ、「純Aを愛でる会」の

 データを取った時のテーブルタグ吐き出し(ジャグ用)改

のページです。オススメです。



作成できる画像ファイルのサンプル

sample sample


↓に書いたソースの概要ですが、htmlファイルからデータを読み込み、
1Pごとの保持コインを配列 @data_coin に全てブチこんでいます。
こうしないと、正しいグラフが作れないのよね…。

#!/usr/bin/perl

# ジャグテーブルタグ吐き出し(cgi)から作成した html を読み込んで
# png 画像ファイル(出玉推移グラフ)を作成する。

use GD::Graph::lines;
use GD::Text::Align;
GD::Text->font_path('c:/windows/fonts');
use GD::Graph::colour;

print "date?\nexample : 2005/01/01\n";
chomp($date=<STDIN>);

print "\nWhat is the name of reading html file?\n";
chomp($file=<STDIN>);


# ファイルの読み込み
open(F, "$file") or die "Can't open...";
@data = <F>;
close(F);

# データの抜き出し
for (@data) {
    if(/<td><font color='red'><b>777<\/b><\/font><\/td><td>(\d+)<\/td><td>.*<\/td><td>.*<\/td><td>(\d+)<\/td>/) {
        push(@get, $1); push(@game, $2); push(@flag,'b');
        $t_bigget += $1; $bigcount++;
    } elsif(/<td><b>REG<\/b><\/td><td> <\/td><td>.*<\/td><td>.*<\/td><td>(\d+)<\/td>/) {
        push(@get,'112'); push(@game,$1); push(@flag,'r');
        $regcount++;
    } elsif(/<td>ヤメ<\/td><td> <\/td><td>.*<\/td><td>.*<\/td><td>(\d+)<\/td>/) {
        push(@get, 0); push(@game, $1); push(@flag, 'end');
    } elsif(/プレイ数<\/td><td align='right'>(\d+)<\/td><td> <\/td><td bgcolor='.+'>投資<\/td><td align='right'>(.+) k<\/td>/) {
        $t_play = $1; $toushi = $2;
    } elsif (/<td bgcolor='.+'>回収<\/td><td align='right'>(\d+) 枚<\/td><td bgcolor='.+'>連荘率/) {
        $lastcoin = $1;
    }
}

$base  = ($t_bigget + $regcount*111.043 + $toushi*50 - $lastcoin)/$t_play if $t_play;   # 通常時 1P 当たりのコイン減

# 1P毎の保持コインを計算する。他にうまい方法が思いつかん…。
@data_play = @data_coin = (0);

for ($i=0; $i<=$#flag; $i++) {

    if ($flag[$i] ne 'end') {

        # ボーナスを引くゲームまでの間のコイン減
        for($j=($play+1);$j<=($game[$i]-1);$j++) {
            $coin -= $base;
            push(@data_play, $j);
            push(@data_coin, int($coin));
        }
        # んでボーナス分のコイン増
        $coin += $get[$i]; $play = $game[$i];
        push(@data_play, $play);
        push(@data_coin, int($coin));
    } else { # ヤメ時
        for($j=($play+1); $j<=($game[$i]); $j++) {
            $coin -= $base;
            push(@data_play, $j);  push(@data_coin, int($coin));
        }
        $play = $j-1;
    }
}

print "calculating...\n";

# グラフ縦軸(コイン)の min , max
$max = ( sort{ $b <=> $a } @data_coin)[0];
$min = ( sort{ $a <=> $b } @data_coin)[0];

$max2   = int(($max + 999) /1000) * 1000;
$min2   = int(($min - 1000)/1000) * 1000;
$number = (abs($max2) + abs($min2)) / 1000;

@gr_data = ([@data_play],[@data_coin]); # グラフ作成に必要なデータ完成

# グラフの作成
$graph=new GD::Graph::lines(400,300);
$graph->set_x_label_font('msgothic.ttc', 10);
$graph->set_y_label_font('msgothic.ttc', 10);
$graph->set_x_axis_font('msgothic.ttc', 10);
$graph->set_y_axis_font('msgothic.ttc', 10);
$graph->set_text_clr(black);
$graph->set(
    title        => "JUG Data  $date",
    dclrs        =>[ qw(blue) ],
    borderclrs   =>[ qw(blue) ],
    r_margin     =>25,
    two_axes     =>1,
    types        =>['bars','linespoints'],
    x_label      =>'PLAY',
    y_label      =>'COIN',
    box_axis     =>1,
    bar_spacing  =>1,
    line_width   =>3,
    x_label_skip =>"$t_play",
    long_ticks   =>1,
    y_max_value  => $max2,
    y_min_value  => $min2,
    y_tick_number=> $number,
);

$gd=$graph->plot(\@gr_data);

$date =~ s/\//_/g;
$date = 'jug' . $date;

# 画像出力
open(IMG, ">$date.png");
binmode IMG;
print IMG $gd->png;
close(IMG);

print "\nBIG $bigcount, REG $regcount\n";
print "play $t_play, get $lastcoin coins.\n\n";
print 'Completed.';

exit;


もっとスマートなアイディアがあるかと思いますが、一応これでも動作はします。
ちなみに自分のPC環境では、png出力までに数秒かかります。




[ home / cgi / juggler / column / diary / bbs / link / welcome ]