Hanoi

by phi16
四角だけでつまらないので誰か綺麗にしてください(?)
ロード画面に使えそうな使えなさそうな
♥0 | Line 94 | Modified 2015-01-11 12:41:13 | MIT License
play

ActionScript3 source code

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

package {
    import flash.events.Event;
    import flash.display.Sprite;
    public class Hanoi extends Sprite {
        public var num:int=16;
        public var oneStep:int=100;
        public var delay:int=10;
        
        public var spr:Sprite=new Sprite();
        public var i:int,j:int;
        public var w:Number=465/2;
        public var s:Array=new Array();
        public var q:Array=new Array();
        public var u:int=0,timer:int=0;
        public var nextMove:int=0;
        public var view:Boolean=false;
        public var back:Boolean=false;
        public function Hanoi() {
            this.addChild(spr);
            this.addEventListener(Event.ENTER_FRAME,frame);
            for(i=0;i<3;i++)s[i]=new Array();
            for(i=num-1;i>-1;i--)s[0].push(i);
            q.push(new Task(num,0,1,2));
        }
        public function frame(e:Event):void{
            spr.graphics.clear();
            spr.graphics.beginFill(0);
            spr.graphics.drawRect(0,0,w*2,w*2);
            spr.graphics.endFill();
            for(i=0;i<3;i++){
                var ce:Number=w/3*(i*2+1),qe:Number=w/3;
                for(j=0;j<s[i].length;j++){
                    var le:Number=qe*(s[i][j]+3)/(num-1+3);
                    spr.graphics.beginFill(getColor(s[i][j]));
                    spr.graphics.drawRect(ce-le,w*2-(j+1)*(w*2/num),le*2,w*2/num);
                    spr.graphics.endFill();
                }
            }
            for(i=0;i<oneStep;i++){
                while(step()){}
                if(view)break;
            };
            view=false;
            if(q.length==0){
              if(timer==delay){
                  if(u%2==0)q.push(new Task(num,2,1,0));
                  else q.push(new Task(num,0,1,2));
                  u++;
                  timer=0;
                  nextMove=0;
                  back=false;
              }
              timer++;
           }
        }
        public function getColor(i:Number):int{
            var colr:int,colg:int,colb:int;
            var c:Number=90;
            colr=(Math.sin((i*360/num+c)*Math.PI/180)+1)*255/2;
            colg=(Math.sin((i*360/num+120+c)*Math.PI/180)+1)*255/2;
            colb=(Math.sin((i*360/num-120+c)*Math.PI/180)+1)*255/2;
            return colr*256*256+colg*256+colb;
        }
        public function step():Boolean{
            if(q.length==0)return false;
            var t:Task=q.pop();
            if(t.count==-1){
                var p:int=s[t.p].pop();
                s[t.q].push(p);
                if(nextMove==p){
                    view=true;
                    if(back)nextMove--;
                    else nextMove++;
                    if(nextMove==num){
                        nextMove=num-2;
                        back=true;
                    }
                }
                return false;
            }
            if(t.count>=1){
                q.push(new Task(t.count-1,t.q,t.p,t.r));
                q.push(new Task(-1,t.p,t.r,0));
                q.push(new Task(t.count-1,t.p,t.r,t.q));
                return true;
            }else return false;
        }
    }
}

class Task{
    public var count:int,p:int,q:int,r:int;
    public function Task(cu:int,a:int,b:int,c:int){
        count=cu,p=a,q=b,r=c;
    }
}