/**
* Copyright Hakuhin ( http://wonderfl.net/user/Hakuhin )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/vmjn
*/
<?xml version="1.0" encoding="utf-8"?><mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="init();"><mx:Script><![CDATA[public function init():void{
// -------------------------------------------------
//
//
// -------------------------------------------------
// -------------------------------------------------
// インポート
// -------------------------------------------------
import mx.core.*;
import mx.containers.*;
import mx.controls.*;
import mx.events.*;
// -------------------------------------------------
// Flash 設定
// -------------------------------------------------
// キャプチャタイミング
Wonderfl.capture_delay( 30 );
// フレームレート
stage.frameRate = 60;
// 100% 表示
stage.scaleMode = StageScaleMode.NO_SCALE;
// 左上
stage.align = StageAlign.TOP_LEFT;
stage.align = "TL";
// -------------------------------------------------
// Flex 設定
// -------------------------------------------------
// パディングなし
setStyle("paddingTop",0);
setStyle("paddingBottom",0);
setStyle("paddingLeft",0);
setStyle("paddingRight",0);
// 背景透過
setStyle("backgroundAlpha",0);
// 左上
setStyle("horizontalAlign","left");
setStyle("verticalAlign","top");
// キャンバス作成
var canvas:Canvas = new Canvas();
addChild(canvas);
// -------------------------------------------------
// Flash オブジェクト作成
// -------------------------------------------------
var chart:Object = {
width :0, // 幅
height :0, // 高さ
scale :{x:1.0,y:1.5}, // スケール
scale_target :{x:1.0,y:1.5}, // スケールターゲット
scale_speed :{x:0.0,y:0.0} // スケール速度
};
// 黒壁紙
var shape_bg:Shape = new Shape();
stage.addChild(shape_bg);
(function():void{
var g : Graphics = shape_bg.graphics;
g.beginFill (0x000022, 1.0);
g.drawRect ( 0, 0 , 100 , 100);
g.endFill();
})();
// テキストレイヤー
var sprite_text:Sprite = new Sprite();
stage.addChild(sprite_text);
// グリッドレイヤー
var shape_grid:Shape = new Shape();
stage.addChild(shape_grid);
// ブラーレイヤー
var bitmap_blur: Bitmap = new Bitmap();
stage.addChild(bitmap_blur);
// 算出レイヤー
var shape_now:Shape = new Shape();
stage.addChild(shape_now);
// グリッドレイヤー
var shape_average:Shape = new Shape();
stage.addChild(shape_average);
// ビットマップデータ
var bitmap_data:Array = new Array();
var bitmap_data_slot:int = 0;
// -------------------------------------------------
// Flex コンポーネント作成
// -------------------------------------------------
var text : Text;
// 下側メニュー左側
var result_l:Canvas = new Canvas();
result_l.x = 0;
canvas.addChild(result_l);
// 条件1
text = new Text();
text.text = "条件1:";
text.x = 10;
text.y = 5;
text.width = 60;
text.height = 22;
text.selectable = false;
text.setStyle("textAlign","right");
result_l.addChild(text);
var stepper_profit : NumericStepper = new NumericStepper();
stepper_profit.x = 70;
stepper_profit.y = 5;
stepper_profit.value = 1.5;
stepper_profit.stepSize = 0.0001;
stepper_profit.minimum = 1.0;
stepper_profit.maximum = 0xFFFFFFFFFFFFFFFF;
stepper_profit.width = 80;
stepper_profit.height = 22;
stepper_profit.setStyle("textAlign","center");
result_l.addChild(stepper_profit);
text = new Text();
text.text = "倍以上で利確";
text.x = 155;
text.y = 5;
text.width = 150;
text.height = 22;
text.selectable = false;
result_l.addChild(text);
// 条件2
text = new Text();
text.text = "条件2:";
text.x = 10;
text.y = 35;
text.width = 60;
text.height = 22;
text.selectable = false;
text.setStyle("textAlign","right");
result_l.addChild(text);
var stepper_loss_cut : NumericStepper = new NumericStepper();
stepper_loss_cut.x = 70;
stepper_loss_cut.y = 35;
stepper_loss_cut.value = 0.5;
stepper_loss_cut.stepSize = 0.0001;
stepper_loss_cut.minimum = 0.0;
stepper_loss_cut.maximum = 1.0;
stepper_loss_cut.width = 80;
stepper_loss_cut.height = 22;
stepper_loss_cut.setStyle("textAlign","center");
result_l.addChild(stepper_loss_cut);
text = new Text();
text.text = "倍以下で損切り";
text.x = 155;
text.y = 35;
text.width = 150;
text.height = 22;
text.selectable = false;
result_l.addChild(text);
// 勝率補正
text = new Text();
text.text = "勝率補正:";
text.x = 10;
text.y = 65;
text.width = 60;
text.height = 22;
text.selectable = false;
text.setStyle("textAlign","right");
result_l.addChild(text);
var stepper_win_percent_add : NumericStepper = new NumericStepper();
stepper_win_percent_add.x = 70;
stepper_win_percent_add.y = 65;
stepper_win_percent_add.value = 0.01;
stepper_win_percent_add.stepSize = 0.0001;
stepper_win_percent_add.minimum = -1.0;
stepper_win_percent_add.maximum = 1.0;
stepper_win_percent_add.width = 80;
stepper_win_percent_add.height = 22;
stepper_win_percent_add.setStyle("textAlign","center");
result_l.addChild(stepper_win_percent_add);
text = new Text();
text.text = "(人間補正)";
text.x = 155;
text.y = 65;
text.width = 100;
text.height = 22;
text.selectable = false;
result_l.addChild(text);
// 試行回数
text = new Text();
text.text = "施行回数:";
text.x = 10;
text.y = 95;
text.width = 60;
text.height = 22;
text.selectable = false;
text.setStyle("textAlign","right");
result_l.addChild(text);
var stepper_try_max : NumericStepper = new NumericStepper();
stepper_try_max.x = 70;
stepper_try_max.y = 95;
stepper_try_max.value = 200;
stepper_try_max.minimum = 0;
stepper_try_max.maximum = 0xFFFFFFFFFFFFFFFF;
stepper_try_max.width = 80;
stepper_try_max.height = 22;
stepper_try_max.setStyle("textAlign","center");
result_l.addChild(stepper_try_max);
text = new Text();
text.text = "回繰り返す";
text.x = 155;
text.y = 95;
text.width = 100;
text.height = 22;
text.selectable = false;
result_l.addChild(text);
// 下側メニュー左側
var result_r:Canvas = new Canvas();
canvas.addChild(result_r);
// 勝率
text = new Text();
text.text = "勝率:";
text.x = 855;
text.y = 5;
text.width = 60;
text.height = 22;
text.selectable = false;
text.setStyle("textAlign","right");
result_r.addChild(text);
var textinput_win_percent : TextInput = new TextInput();
textinput_win_percent.x = 915;
textinput_win_percent.y = 5;
textinput_win_percent.text = "";
textinput_win_percent.width = 80;
textinput_win_percent.height = 22;
textinput_win_percent.editable = false;
textinput_win_percent.setStyle("textAlign","center");
result_r.addChild(textinput_win_percent);
// 1Fの計算回数
text = new Text();
text.text = "1Fの計算回数:";
text.x = 815;
text.y = 35;
text.width = 100;
text.height = 22;
text.selectable = false;
text.setStyle("textAlign","right");
result_r.addChild(text);
var stepper_count : NumericStepper = new NumericStepper();
stepper_count.x = 915;
stepper_count.y = 35;
stepper_count.value = 1;
stepper_count.minimum = 0;
stepper_count.maximum = 0xFFFFFFFFFFFFFFFF;
stepper_count.width = 80;
stepper_count.height = 22;
stepper_count.setStyle("textAlign","center");
result_r.addChild(stepper_count);
// 総計算回数
text = new Text();
text.text = "総計算回数:";
text.x = 815;
text.y = 65;
text.width = 100;
text.height = 22;
text.selectable = false;
text.setStyle("textAlign","right");
result_r.addChild(text);
var textinput_total : TextInput = new TextInput();
textinput_total.x = 915;
textinput_total.y = 65;
textinput_total.text = "";
textinput_total.width = 80;
textinput_total.height = 22;
textinput_total.editable = false;
textinput_total.setStyle("textAlign","center");
result_r.addChild(textinput_total);
// -------------------------------------------------
// 図形用データ
// -------------------------------------------------
var chart_param:Object = new Object();
function ChartParamGetObject():Object{
var profit:Number = (stepper_profit.value - 1.0);
var loss_cut:Number = (1.0 - stepper_loss_cut.value);
var win_percent:Number = loss_cut / (profit + loss_cut);
win_percent += stepper_win_percent_add.value;
if(win_percent > 1) win_percent = 1;
if(win_percent < 0) win_percent = 0;
var key:String =
"{" +
"win_percent:" + win_percent + "," +
"profit:" + profit + "," +
"win_percent:" + win_percent + "," +
"stepper_try_max:" + stepper_try_max.value +
"}";
var obj:Object = chart_param[key];
if(!obj){
obj = new Object();
obj.count = 0;
obj.try_max = stepper_try_max.value;
obj.profit = profit;
obj.loss_cut = loss_cut;
obj.win_percent = win_percent;
var probability:Array = new Array();
obj.probability = probability;
var i:int;
for(i=0;i<101;i++){
probability.push({
now:0,
average:0
});
}
chart_param[key] = obj;
}
return obj;
}
ChartParamGetObject();
// -------------------------------------------------
// リサイズ時にフィット
// -------------------------------------------------
stage.addEventListener(Event.RESIZE,ResizeFunc);
function ResizeFunc(e:Event):void{
var w:uint = stage.stageWidth;
var h:uint = stage.stageHeight;
// 下側メニュー左側
result_l.y = h - 130;
// 下側メニュー右側
result_r.x = w - 1000;
result_r.y = h - 130;
chart.width = w - 10;
chart.height = h - 130 - 5;
// ビットマップを更新
bitmap_data[0] = new BitmapData(chart.width,chart.height,true,0x00FFFFFF);
bitmap_data[1] = new BitmapData(chart.width,chart.height,true,0x00FFFFFF);
bitmap_data_slot = 0;
// チャートのサイズを変更
ChartResize();
}
ResizeFunc(null);
// -------------------------------------------------
// チャートをリサイズ
// -------------------------------------------------
function ChartResize():void {
var w:Number = chart.width;
var h:Number = chart.height;
var s:Number = chart.scale.y;
// 背景
shape_bg.x = 5;
shape_bg.y = 5;
shape_bg.width = w;
shape_bg.height = h;
// テキストをクリア
sprite_text.x = 5;
sprite_text.y = 5;
while(sprite_text.numChildren){
var obj:DisplayObject = sprite_text.getChildAt(0);
sprite_text.removeChild(obj);
}
var s_add:Number = 1;
(function():void{
var d:Number = s;
while(true){
if(d < 20) break;
d /= 2;
s_add *= 2;
}
})();
function TextFieldCreateCommentH():TextField{
var tf:TextField;
tf = new TextField();
tf.width = 200;
tf.height = 20;
tf.textColor = 0xFFFFFF;
tf.selectable = false;
var format:TextFormat = new TextFormat();
// format.align = TextFormatAlign.LEFT;
tf.defaultTextFormat = format;
return tf;
}
function TextFieldCreateCommentV():TextField{
var tf:TextField;
tf = new TextField();
tf.width = 200;
tf.height = 20;
tf.textColor = 0xFFFFFF;
tf.selectable = false;
var format:TextFormat = new TextFormat();
format.align = TextFormatAlign.RIGHT;
tf.defaultTextFormat = format;
return tf;
}
function TextFieldCreateValueH():TextField{
var tf:TextField;
tf = new TextField();
tf.width = 40;
tf.height = 20;
tf.textColor = 0xFFFFFF;
tf.selectable = false;
var format:TextFormat = new TextFormat();
format.align = TextFormatAlign.CENTER;
tf.defaultTextFormat = format;
return tf;
}
function TextFieldCreateValueV():TextField{
var tf:TextField;
tf = new TextField();
tf.width = 60;
tf.height = 20;
tf.border = true;
tf.textColor = 0xFFFFFF;
tf.selectable = false;
var format:TextFormat = new TextFormat();
format.align = TextFormatAlign.RIGHT;
tf.defaultTextFormat = format;
return tf;
}
var tf:TextField;
tf = TextFieldCreateCommentH();
tf.text = "試行後の資金 (倍率)";
tf.x = 5;
tf.y = 0;
sprite_text.addChild(tf);
tf = TextFieldCreateCommentV();
tf.text = "1回分の資金投入率 (%)";
tf.x = w - 205;
tf.y = h - 20;
sprite_text.addChild(tf);
var i:int;
for(i=0;i<11;i++){
tf = TextFieldCreateValueH();
tf.text = "" + (i * 10) + "%";
tf.x = 60 + (i / 10) * (w - 60 - 20) - 20;
tf.y = h - 40 + 2;
sprite_text.addChild(tf);
}
var d:Number;
for(d=1;d<=s;d+=s_add){
tf = TextFieldCreateValueV();
tf.text = "" + Math.floor(d + 0.5) + ".0 ×";
tf.x = 0;
tf.y = (h - 40) - (d / s * (h - 40 - 30)) - 10;
sprite_text.addChild(tf);
}
shape_grid.x = 5;
shape_grid.y = 5;
(function():void{
var g:Graphics = shape_grid.graphics;
g.clear();
g.lineStyle (1.0,0x888888, 1.0);
var i:int;
for(i=1;i<11;i++){
var x:Number = 60 + (i / 10) * (w - 60 - 20);
g.moveTo(x,20);
g.lineTo(x,h - 40);
}
var d:Number;
for(d=1;d<=s;d+=s_add){
if(d == 1){
g.lineStyle (2.0,0xFF0000, 1.0);
}else{
g.lineStyle (1.0,0x888888, 1.0);
}
var y:Number = (h - 40) - (d / s * (h - 40 - 30));
g.moveTo(60,y);
g.lineTo(w - 10,y);
}
g.endFill();
g.lineStyle (3.0,0xFFFFFF, 1.0);
g.moveTo(60,20);
g.lineTo(60,h - 40);
g.moveTo(60,h - 40);
g.lineTo(w - 10,h - 40);
g.endFill();
})();
// クリア
bitmap_data[bitmap_data_slot].fillRect(new Rectangle(0,0,w,h),0x00FFFFFF);
ChartRender();
}
// -------------------------------------------------
// チャートをレンダリング
// -------------------------------------------------
function ChartRender():void {
var w:Number = chart.width;
var h:Number = chart.height;
var s:Number = chart.scale.y;
var param:Object = ChartParamGetObject();
var probability:Array = param.probability;
shape_now.x = 5;
shape_now.y = 5;
(function():void{
var g:Graphics = shape_now.graphics;
g.clear();
var i:int;
for(i=0;i<101;i++){
var obj:Object = probability[i];
var x:Number = 60 + (i / 100) * (w - 60 - 20);
var y:Number = (h - 40) - (obj.now / s * (h - 40 - 30));
g.beginGradientFill (
GradientType.RADIAL,
[0xFFFFFF , 0xFFFFFF],
[1.0,0.0],
[0,255],
new Matrix(
5/1638.4 , 0 ,
0 , 5/1638.4 ,
x , y
),
SpreadMethod.PAD,
InterpolationMethod.LINEAR_RGB,
0.0
);
g.drawCircle(x,y,5.0);
g.endFill();
}
})();
shape_average.x = 5;
shape_average.y = 5;
(function():void{
var g:Graphics = shape_average.graphics;
g.clear();
var i:int;
for(i=0;i<101;i++){
var obj:Object = probability[i];
var x:Number = 60 + (i / 100) * (w -60 - 20);
var y:Number = (h - 40) - (obj.average / s * (h - 40 - 30));
g.beginFill (0xFF0000,0.8);
g.drawCircle(x,y,3.0);
g.endFill();
}
})();
bitmap_blur.x = 5;
bitmap_blur.y = 5;
bitmap_blur.bitmapData = bitmap_data[1-bitmap_data_slot];
// クリア
bitmap_data[1-bitmap_data_slot].fillRect(new Rectangle(0,0,w,h),0x00FFFFFF);
// キャプチャ
bitmap_data[bitmap_data_slot].draw(shape_now,new Matrix(1,0,0,1,0,0),new ColorTransform(0.8,0.8,1,1.0,0,0,0,0));
bitmap_data[1-bitmap_data_slot].draw(bitmap_data[bitmap_data_slot],new Matrix(1,0,0,1,0,0),new ColorTransform(1,1,1,0.995,0,0,0,0));
bitmap_data_slot ++;
if(bitmap_data_slot > 1) bitmap_data_slot = 0;
textinput_total.text = "" + param.count;
textinput_win_percent.text = "" + Math.floor(param.win_percent * 10000) / 10000;
}
// -------------------------------------------------
// 実行
// -------------------------------------------------
addEventListener(Event.ENTER_FRAME,function(e:Event):void{
var param:Object = ChartParamGetObject();
var average_total:Number = 0;
var i:int;
var j:int;
var k:int;
var try_max:int = param.try_max;
var win_percent:Number = param.win_percent;
var profit:Number = param.profit;
var loss_cut:Number = param.loss_cut;
var num:Number = stepper_count.value;
for(k=0;k<num;k++){
// 回数
param.count += 1;
var average:Number = 0;
for(i=0;i<101;i++){
var prob:Object = param.probability[i];
var money:Number = 0x10000;
var d:Number = (i / 100);
for(j=0;j<try_max;j++){
if(win_percent >= Math.random()){
money += profit * money * d;
}else{
money -= loss_cut * money * d;
}
}
var now:Number = money / 0x10000;
prob.now = now;
if(param.count > 1){
prob.average = (prob.average * (param.count - 1) + now) / param.count;
}else{
prob.average = now;
}
average += prob.average;
}
average_total += average / 101;
}
if(num){
average_total = average_total / num;
average_total *= 2;
}
if(average_total < 1.5) average_total = 1.5;
if(Math.abs(chart.scale_target.y - average_total) > 0.1){
chart.scale_target.y = average_total;
}
// スケール
var SCALE_SPEED_ADD:Number = 0.001;
var SCALE_SPEED_MAX:Number = 5;
var SCALE_SPEED_FRE:Number = 0.05;
var sub:Number = chart.scale_target.y - chart.scale.y;
sub *= SCALE_SPEED_FRE;
var spd:Object = chart.scale_speed;
if(sub > 0){
spd.y += SCALE_SPEED_ADD;
if(sub > 10){
if(spd.y < 0) spd.y = 0;
spd.y *= 10.0;
}else{
if(spd.y > SCALE_SPEED_MAX) spd.y = SCALE_SPEED_MAX;
}
if(spd.y > sub) spd.y = sub;
}else if(sub < 0){
spd.y -= SCALE_SPEED_ADD;
if(sub <-10){
if(spd.y > 0) spd.y = 0;
spd.y *= 10.0;
}else{
if(spd.y <-SCALE_SPEED_MAX) spd.y =-SCALE_SPEED_MAX;
}
if(spd.y < sub) spd.y = sub;
}else{
spd.y = 0.0;
}
if(Math.abs(spd.y) > 0.001){
chart.scale.y += spd.y;
if(chart.scale.y == Number.POSITIVE_INFINITY) chart.scale.y = Number.MAX_VALUE;
if(chart.scale.y == Number.NEGATIVE_INFINITY) chart.scale.y =-Number.MAX_VALUE;
if(chart.scale_speed.y == Number.POSITIVE_INFINITY) chart.scale_speed.y = Number.MAX_VALUE;
if(chart.scale_speed.y == Number.NEGATIVE_INFINITY) chart.scale_speed.y =-Number.MAX_VALUE;
ChartResize();
}else{
ChartRender();
}
});
}]]></mx:Script></mx:Application>