flash on 2012-10-26

by WinField95
♥0 | Line 257 | Modified 2012-10-26 14:38:16 | MIT License
play

ActionScript3 source code

/**
 * Copyright WinField95 ( http://wonderfl.net/user/WinField95 )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/zefl
 */

package



{



    import adobe.utils.CustomActions;



    import flash.display.Sprite



    import flash.events.Event;



    import flash.text.*;



    import flash.display.SimpleButton;



    import flash.events.MouseEvent;



    import flash.utils.getTimer;



    



    



    public class Main extends Sprite



    {



    



        var display:Display;



        //var button1:SimpleButton;



        //var button2:SimpleButton;



        var arr:Array;



        var matrix:Array;



        var stack:Array;



        var endflag:Boolean;



        



        public function Main():void



        {                







            



            /*



            var back:Sprite = new Sprite();



            back.graphics.beginFill(0x000000);



            back.graphics.drawRect(0, 0, 800, 800);



            back.graphics.endFill();



            addChild(back);



            */                



            



            var x0:int , y0:int ,diffx:int , diffy:int;



            x0 = 280;



            y0 = 50;



            diffx = 140;



            diffy = 100;



            



            



            arr = new Array();



            /*



            arr.push(new Node(x0 + 0, y0 + 0, 0));



            arr.push(new Node(x0 + 0, y0 +  200, 1)); 



            arr.push(new Node(x0 + 200, y0 +  0 , 2));



            arr.push(new Node(x0 + 100, y0 + 200,3))



            */



            



            



            



            /*



            for (var i:int = 0 ; i < 3 ; i++){



                arr.push(new Node(arr[i].getX() - diffx , arr[i].getY() + diffy, i*2));



                arr.push(new Node(arr[i].getX() + diffx , arr[i].getY() + diffy, i * 2 + 1));



            }



            */



            



                arr.push(new Node(x0, y0, 0));



                arr.push(new Node(arr[0].getX() - diffx , arr[0].getY() + diffy, 1));



                arr.push(new Node(arr[0].getX() + diffx , arr[0].getY() + diffy, 2))



                arr.push(new Node(arr[1].getX() - diffx*0.5 , arr[1].getY() + diffy, 3));



                arr.push(new Node(arr[1].getX() + diffx*0.5 , arr[1].getY() + diffy, 4)); 



                arr.push(new Node(arr[2].getX() - diffx*0.5 , arr[2].getY() + diffy, 5));



                arr.push(new Node(arr[2].getX() + diffx * 0.5 , arr[2].getY() + diffy, 6));



                arr.push(new Node(arr[3].getX() - diffx * 0.3 , arr[3].getY() + diffy, 7));



                arr.push(new Node(arr[3].getX() + diffx * 0.3 , arr[3].getY() + diffy, 8));



                arr.push(new Node(arr[4].getX() - diffx * 0.3 , arr[4].getY() + diffy, 9));



                arr.push(new Node(arr[4].getX() + diffx * 0.3 , arr[4].getY() + diffy, 10));



                arr.push(new Node(arr[5].getX() - diffx * 0.3 , arr[5].getY() + diffy, 11));                    



                arr.push(new Node(arr[5].getX() + diffx * 0.3 , arr[5].getY() + diffy, 12));



                arr.push(new Node(arr[6].getX() - diffx * 0.3 , arr[6].getY() + diffy, 13));



                arr.push(new Node(arr[6].getX() + diffx * 0.3 , arr[6].getY() + diffy, 14));







                



            



            



            



            graphics.lineStyle(4.0);



            



            



            matrix = new Array();



            /*



            var m0:Array = [0, 0, 1, 0];



            var m1:Array = [0, 0, 2, 0];



            var m2:Array = [1, 2, 0, 3];



            var m3:Array = [0, 0, 3, 0];



            */



                          //0  1  2  3  4  5  6  7  8  9 10 11 12 13 14



            var m0:Array =  [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];



            var m1:Array =  [1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; 



            var m2:Array =  [1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0];



            var m3:Array =  [0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0];



            var m4:Array =  [0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0];



            var m5:Array =  [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0];



            var m6:Array =  [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1];



            var m7:Array =  [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];



            var m8:Array =  [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];



            var m9:Array =  [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];



            var m10:Array = [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];



            var m11:Array = [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0];



            var m12:Array = [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0];



            var m13:Array = [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0];



            var m14:Array = [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0];



            



            



            



            



            matrix.push(m0);



            matrix.push(m1);



            matrix.push(m2);



            matrix.push(m3);



            matrix.push(m4);



            matrix.push(m5);



            matrix.push(m6);



            matrix.push(m7);



            matrix.push(m8);



            matrix.push(m9);



            matrix.push(m10);



            matrix.push(m11);



            matrix.push(m12);



            matrix.push(m13);



            matrix.push(m14);



                                







                        // 隣接行列の情報とノードに関する情報をコンストラクタの引数として持つ。



            display = new Display(matrix,arr); 



            display.Draw();



            



            addChild(display);



            



            stack = new Array();



            



            stack.push(new Pair(0, 0));



            endflag = false;



            addEventListener(Event.ENTER_FRAME,onEnterFrame);



            



            /*



            



            button1 = new Button('START',130)



                        button1.x = 0;



                        button1.y = 200;



                       button1.addEventListener(MouseEvent.CLICK,



                                                 button1_onMouseClick);







            button2 = new Button('END',130)



            button2.x = 0;



            button2.y = 200;



            button2.addEventListener(MouseEvent.CLICK,



                                                 button2_onMouseClick);    



            */



            //addChild(button1);



            



        }



        



        



        /*



        public function button1_onMouseClick(event:MouseEvent):void



        {



            addChild(display);



            removeChild(button1);



            addChild(button2);



        }



        



        



        public function button2_onMouseClick(event:MouseEvent):void



        {



            removeChild(display);



            removeChild(button2);



            addChild(button1);



        }



        */



        



        public function onEnterFrame(event:Event) {



            if (endflag) return;



            var p:Pair = stack.pop();



            var now:int = p.first;



            var ind:int = p.second;



            



            if(arr[now].state == Singleton.NOTVISITED)arr[now].state = Singleton.VISITED1;

            else arr[now].state = Singleton.VISITED2

            

            display.Draw();



            



            var start:int = getTimer();



            while (getTimer() - start < 300);



            



            for ( ; ind < matrix[now].length ; ind++) {



                if (matrix[now][ind] == 1 && arr[ind].state == Singleton.NOTVISITED) {



                    stack.push(new Pair(now,ind+1));



                    stack.push(new Pair(ind, 0));



                    return;



                }



            }



            



            if (now == 0) endflag = true;



            arr[now].state = Singleton.FINISH;



            display.Draw();



            //var start:int = getTimer();



            //while (getTimer() - start < 300);



        }



        



        /*



        public function dfs(now:int) {



            var start:uint;



            



            



            arr[now].state = Singleton.VISITED;



            display.Draw();



            



            for (var i:int = 0 ; i < matrix[now].length ; i++) {



                if (matrix[now][i] == 1 && arr[i].state == Singleton.NOTVISITED) dfs(i);



            }



            arr[now].state = Singleton.FINISH;



            display.Draw();



        }    



        */



    }



}







class Pair {



    public var first:int, second:int;



    public function Pair(_first:int,_second:int):void{



        first = _first;



        second = _second;



    }



}







import flash.display.*;



import flash.text.*;



class Button extends SimpleButton // ボタンのクラス



{



    public function Button(label:String, width:int = 0):void



    {



        filters = [new GlowFilter(0xffffff,.5)];        



        



        var up:Sprite = _buildImage(label, 0xCCCCCC, width);



        var over:Sprite = _buildImage(label, 0x87CEFA, width);



        var down:Sprite = _buildImage(label, 0x4682B4, width);



        down.y = 1;



        super(up, over, down, up);



    }







    public function _buildImage(label:String, color:int, width:int = 0):Sprite



    {



       



        var text:TextField = new TextField();



        text.defaultTextFormat = new TextFormat('Verdana', 10, 0x000000, true,



                                                 null, null, null, null,



                                                TextFormatAlign.CENTER);







        text.autoSize = TextFieldAutoSize.CENTER;



        text.selectable = false;



        text.text = label;



        text.x = (width - text.width) >> 1;



        text.y = 5;



        var base:Shape = new Shape();



        var g:Graphics = base.graphics;



        g.beginFill(color);



        g.drawRect(0, 0, width, text.height + 3);



        g.endFill();



        var sp:Sprite = new Sprite();



        sp.addChild(base);



        sp.addChild(text);



        return sp;



        



    }        



}







class Singleton {



    public static const NOTVISITED:int = 0;



    public static const VISITED1:int = 1;



    public static const VISITED2:int = 2;

    

    public static const FINISH:int = 3;



    public static const WHITE:int = 0xFFFFFF;



    public static const RED:int = 0xFF0000;



    public static const BLUE:int = 0x0000FF;

    

    public static const GREEN:int = 0x00FF00;



}







import flash.display.SpreadMethod;



import flash.text.TextField;







class Node extends Sprite{ // ノードの情報を管理する。



    



    private var this_x:Number, this_y:Number, r:Number, id:Number;



    private var tf:TextField;



    public var state:int;



    public var circle:Sprite;



    



    function Node(xx:Number, yy:Number, idd:Number){ //コンストラクタ



        r = 20;



        this_x = xx;



        this_y = yy;



        id = idd;



        



        /*



        tf = new TextField();



        tf.x = x - 6;



        tf.y = y - 8;



        



        tf.selectable = false;



        tf.textColor = 0xFFFFFF;



        tf.text += id;



        addChild(tf);



        */



        circle = new Sprite();



        state = Singleton.NOTVISITED;



        //state = Singleton.VISITED



        //state = Singleton.RED



    }



    







    public function draw() {



                



        var color:int;



        if (state == Singleton.NOTVISITED) color = Singleton.WHITE

        else if (state == Singleton.VISITED1) color = Singleton.RED;

        else if (state == Singleton.VISITED2) color = Singleton.GREEN;

        else color = Singleton.BLUE;



        



        //circle.filters = [new GlowFilter(0x000000)];



        circle.graphics.lineStyle(6.0, 0x000000);



        circle.graphics.beginFill(color);



        circle.graphics.drawCircle(getX(),getY(),getR());    



        circle.graphics.endFill();



        addChild(circle);



    }



    



    public function getX():Number{ 



        return this_x;



    }



    public function getY():Number{



        return this_y;



    }



    public function getR():Number{



        return r;



    }



    public function getT():TextField {



        return tf;



    }



}











import flash.display.Sprite



import flash.events.MouseEvent;







class Edge extends Sprite{  // エッジの情報を管理するクラス



    private var line:Sprite; // ラインを描画するスプライト



    private var tmp:Sprite;  // lineのtemp



    private var sx:Number, sy:Number, gx:Number, gy:Number,cost:Number; // 描画を始めるポイントと終えるポイント



    private var tf:TextField; // コストを表示するテキストフィールド



    



    



    function Edge(sxx:Number, syy:Number, gxx:Number, gyy:Number,ccost:Number) { //コンストラクタ



        sx = sxx;



        sy = syy;



        gx = gxx;



        gy = gyy;



        cost = ccost;



        tf = new TextField();



        



        tf.x = 20;



        tf.y = 10;



    



        tf.text = "cost = ";



        tf.text += cost;



        tf.textColor = 0x000000;



    }



    



    public function drawLine():void { // エッジを描く



        line = new Sprite();



        line.graphics.lineStyle(6.0, 0x000000);



        



        line.graphics.moveTo(sx,sy);



        line.graphics.lineTo(gx,gy);



        addChild(line);



        tmp = line;



    }



}















import flash.display.Sprite



import flash.filters.GlowFilter;







class Display  extends Sprite{ // 描画処理をまとめて行うクラス



    private var matrix:Array;



    private var arr:Array;



    



    function Display(m:Array,a:Array) { //コンストラクタ



        matrix = m;



        arr = a;



    }



    



    public function Draw():void // コレが呼び出されると描画を行う



    {



        /*



        var back:Sprite = new Sprite();



        back.graphics.beginFill(0x000000);



        back.graphics.drawRect(0, 0, 800, 800);



        back.graphics.endFill();



        addChild(back);



        */                    



        



        /*



        var status:Sprite = new Sprite();



        status.graphics.beginFill(0xFFFFFF);



        status.graphics.drawRect(0,0,80,40);



        status.graphics.endFill();



        addChild(status);



        */



        



        



        for (var i:int = 0 ; i < arr.length ; i++) {     // ノードを配置



            var circle:Sprite = new Sprite();



            arr[i].draw();



            addChild(arr[i]);



        }



            



        



        



        



        for (var i:int = 0 ; i < arr.length ; i++) {     // エッジを配置



            for (var j:int = i+1 ; j < arr.length ; j++) {



                if (matrix[i][j] != 0) {



                    



            



                    var line:Sprite = new Sprite();



                    var ang:Number = Math.atan2(arr[i].getY() - arr[j].getY() , arr[i].getX() - arr[j].getX());



                    var sx:Number, sy:Number, gx:Number, gy:Number;



                    sx = arr[i].getX() - Math.cos(ang) * arr[i].getR();



                    sy = arr[i].getY() - Math.sin(ang) * arr[i].getR();



                    gx = arr[j].getX() + Math.cos(ang) * arr[j].getR();



                    gy = arr[j].getY() + Math.sin(ang) * arr[j].getR();



                    var edge:Edge = new Edge(sx, sy, gx, gy, matrix[i][j]);



                    edge.drawLine();



                    addChild(edge);



            



                    



                }



            }



        }



        



    }



}