Hanoi
四角だけでつまらないので誰か綺麗にしてください(?)
ロード画面に使えそうな使えなさそうな
♥0 |
Line 94 |
Modified 2015-01-11 12:41:13 |
MIT License
archived:2017-03-20 05:02:26
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;
}
}